首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据库查询优化技术(二):子查询优化

查询如果位于目标列,则只能是标量子查询,否则数据库可能返回类似“错误:子查询必须只能返回一个字段”的提示。...聚集函数操作在子查询中,查询执行计划如下: 子查询合并技术,不支持: mysql>explain extended select * from t1 where a1<4 and (exists (select...被查询优化器处理后的语句为: EXISTS类型的相关子查询查询执行计划如下: mysql>explain extended select* from t1 where exists (select...1 from t2 where t1.a1=t2.a2 and t2.a2>10); 示例2 MySQL不支持对NOT EXISTS类型的子查询做进一步的优化。...被查询优化器处理后的语句为: NOT EXISTS类型的相关子查询查询执行计划如下: mysql>explain extended select * from t1 where NOT EXISTS

3.2K00

SQL理论课-Class 5

deptno 30 判断子查询是否存在:exists 和 not exists(相关子查询EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True...和 in\not in 的区别: in 的子查询可以先执行,因为子查询和外部查询无关(无关子查询exists 先执行外部查询,因为子查询内部与外部查询可能有关(比如where条件中使用外部查询的别名...select name from student as s where not exists (select * --exists查询的select后面属性可以随便写,因为exists只判断是否符合条件...比如说select, from,where,having select 里面可以相关,不相关子查询 from 不相关子查询 where 相关,不相关,标量子查询 标量子查询:子查询返回行数为1行: 可以出现在任何...值出现的地方:值运算符 with 语句 当子查询出现在from,可读性太差用with子句:(也是不相关子查询) with 表名(属性名1,属性名2) as 表 with 表1 select 属性

25010
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL 相关子查询

cost_of_materialization = 133.749)比相关子查询的成本(cost_of_EXISTS = 34.6172)更高。...转换为相关子查询的执行成本: cost_of_EXISTS = cost_of_one_EXISTS(0.349669) * number_of_subquery_evaluations(99) = 34.6172...,如果查询优化阶段决定 IN 子查询不转换为相关子查询,附加到子查询 where 条件中的新条件怎么办?...还是以前面的示例 SQL 1 为例,来介绍相关子查询的主要执行流程: SELECT * FROM city WHERE city_id < 100 AND EXISTS ( SELECT city_id...由于判断主查询记录是否匹配 IN 子查询条件时,需要执行子查询,成本比较高,所以,我们写 SQL 的时候最好是把不包含子查询where 条件放在前面,包含子查询where 条件放在最后。

48930

SQL理论课-Class 5

deptno 30 判断子查询是否存在:exists 和 not exists(相关子查询EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True...和 in\not in 的区别: in 的子查询可以先执行,因为子查询和外部查询无关(无关子查询exists 先执行外部查询,因为子查询内部与外部查询可能有关(比如where条件中使用外部查询的别名...select name from student as s where not exists (select * --exists查询的select后面属性可以随便写,因为exists只判断是否符合条件...比如说select, from,where,having select 里面可以相关,不相关子查询 from 不相关子查询 where 相关,不相关,标量子查询 标量子查询:子查询返回行数为1行: 可以出现在任何...值出现的地方:值运算符 with 语句 当子查询出现在from,可读性太差用with子句:(也是不相关子查询) with 表名(属性名1,属性名2) as 表 with 表1 select 属性

27630

无处不在的子查询

玩爆你的数据报表之存储过程编写(下) 子查询又称内部,而包含子查询的语句称之外部查询(又称主查询)。...所有的子查询可以分为两类,即相关子查询和非相关子查询 1>非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。...故非相关子查询比相关子查询效率高 --非相关子查询 SELECT EMPNO, LASTNAME     FROM EMPLOYEE     WHERE WORKDEPT = 'A00'...EXISTS (SELECT * FROM Sales.Orders AS O WHERE O.custid = C.custid AND EXISTS (SELECT...= 12的值 4.返回到第一层内层查询中,应用where子句返回满足条件O.custid = C.custid和EXISTS条件的值 5.返回到外层查询处理 EXISTS,外查询根据子查询返回的结果集得到满足条件的行

1.5K70

SQL语句中的嵌套子查询「建议收藏」

文章目录 相关子查询 自身连接 一开始在学习的SQL语句的时候,没有感受到嵌套子查询的厉害,尤其是相关子查询。现在发现它的厉害之处,写下来记录!...其实每一个相关子查询就是一个二重for循环。...Grade >( select AVG(y.Grade) from tb_SC x,tb_SC y where x.Sno=y.sno ) 我当时就觉得,为什么一定要使用相关子查询呢?...所以,我就发现了一个规律:什么时候使用相关子查询: 如果你想要使用一个表中的数据逐个和另一个表中的数据比较,这个时候可以使用相关子查询。就相当于二重for循环。...给出SQL语句: select Sno,Sname from tb_Student where not exists ( select * from tb_Course where not exists

1.4K10

数据库实验报告

)、相关子查询(交错互通,内层查询都要看一下外层查询,外层查询都要看一下内层查询) #不相关子查询(干完就跑路) select sno,sname from student where sno in (...),相关子查询的时间复杂度远大于不相关子查询。...); -- 以这一查询语句为例使用相关子查询的时间复杂度为n2+n(可以认为为n2的时间复杂度),而实现相同工能的不相关子查询子需要n的时间复杂度 #EXISTS() 存在谓词,存在为真,反之为假 select...根据报错信息上网搜索相关原因 报错原因:现在是在mysql的safe-updates模式中,如果where后跟的条件不是主键,就会出现这种错误。...由于函数可以返回一个表象,因此它可以在查询语句中位于From关键字的后面。

20610

关于 SQLite 的 EXISTS 与 NOT EXISTS

上代码:                       (注:这是我封好的js主要看SQL语句) 1 select('SELECT * FROM Person WHERE NOT EXISTS(SELECT...* FROM Person_Visison WHERE Person_Visison.Pid=Person.id) '); 不相关子查询:子查询查询条件不依赖于父查询的称为不相关子查询。...相关子查询:子查询查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询。...EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”。...相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。

94610

MySQL基础-子查询

三、多行子查询 1、多行比较操作符 2、基本多行子查询 3、空值问题 四、相关子查询 1、相关子查询概念 2、基本相关子查询 3、EXISTS 与 NOT EXISTS关键字 MySQL基础-子查询...一、子查询概念 1、什么是子查询查询概念: 子查询指一个查询语句嵌套在另一个查询语句内部查询,这个特性从MySQL 4.1开始引入 SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据...四、相关子查询 1、相关子查询概念 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为...2<=( SELECT COUNT(*) FROM job_history j WHERE j.employee_id=e.employee_id ); 3、EXISTS 与 NOT EXISTS...,department_name FROM departments d WHERE NOT EXISTS ( SELECT e.

2.5K10

【T-SQL基础】03.子查询

关键词解释: 外部查询查询结果集返回给调用者 内部查询查询结果集返回给外部查询。 独立子查询:独立子查询独立于其外部查询的子查询,可以单独运行子查询。...二、相关子查询 1.相关子查询 什么是相关子查询:引用了外部查询中出现的表的列,依赖于外部查询,不能独立地运行子查询。在逻辑上,子查询会为每个外部行单独计算一次。...) 2.EXISTS谓词(查看练习题4,5)   WHERE EXISTS ( 子查询 ) 它的输入是一个子查询,:如果子查询能够返回任何行,改谓词则返回...(orderdate = '20080101') ) 方案二:相关子查询 EXISTS+NOT EXISTS 1.查询出20070101~20071231...Exists+相关子查询代替 5.查询订购了第12号产品的客户 期望结果: ?

1.8K60

SQL中EXISTS的使用

1.简介 不相关子查询:子查询查询条件不依赖于父查询的称为不相关子查询。...相关子查询:子查询查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询 EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True...普通SQL查询: SELECT 姓名 FROM 学生表 WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1'); 带EXISTS的SQL查询: SELECT...); 相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。...4.查询没有选C1课程的学生的学号、姓名 SELECT 姓名 FROM 学生表 WHERE NOT EXISTS ( SELECT * FROM 选课表 WHERE 学生表.学号

1.1K10

SqlServer中Exists的使用

1、简介 不相关子查询:子查询查询条件不依赖于父查询的称为不相关子查询关子查询:子查询查询条件依赖于外层父查询的某个属性值的称为相关子查询。...带Exists的子查询就是相关子查询 Exists表示存在量词:带有Exists的子查询不返回任何记录的数据,只返回逻辑值“True”或“False” 2、表结构 选课表:学号StudentNo、课程号...='C1') 相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,利用该记录的相关属性值(在exists查询where子句中用到的列)处理内层查询,若外层的where子句返回“true”,则本条记录放入结果表中...6、查询选修了C1课程和C2课程的学生名 --外层查询、外层not exists select StudentName from 学生表 where not exists ( --内层查询...7、查询至少选修了S1所选的全部课程的学生名 --外层查询、外层not exists select StudentName from 学生表 where not exists ( --

56710

sql的嵌套查询_sqlserver跨库查询

查询执行后返回一组值时,不能直接用比较运算符连接子查询,可在比较运算符与子查询之间插入关键字 `ANY`或`ALL`实现查询过程 3. 相关子查询 1....相关子查询关子查询指子查询查询条件需要引用父查询中相关属性值的查询,是特殊的嵌套查询; 这类查询在执行时,先选取父查询中的数据表的第一个元组,内部的子查询对其中的先关属性值进行查询,再由父查询根据子查询返回的结果判断是否满足查询条件...' all (select ID from O where ID=B.ID ) all 表示不等于子查询结果中的任何一个值,可使用 NOT IN 代替; 例子:用 EXISTS关键字从数据表...B,O 中国查询没有就读“工商”专业的学生姓名 select distinct Name from B where not exists (select * from O where ID=B.ID...返回值与 EXISTS 相反; 注意: EXISTS 和 NOT EXISTS的返回值不含有任何数据,只要逻辑值 “真” 或 “假”,即一般在子查询的 SELECT的语句后用 “*” 简写列名; 发布者

2.9K20

【mysql】子查询

查询查询指一个查询语句嵌套在另一个查询语句内部查询,这个特性从MySQL 4.1开始引入。...比如: 相关子查询的需求:查询工资大于本部门平均工资的员工信息。 不相关子查询的需求:查询工资大于本公司平均工资的员工信息。2....相关子查询 4.1 相关子查询执行流程 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询...相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。...); 4.3 EXISTS 与 NOT EXISTS关键字 关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。

3.4K30

第09章_子查询

查询指一个查询语句嵌套在另一个查询语句内部查询,这个特性从 MySQL 4.1 开始引入。...子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询。...相关子查询 # 4.1 相关子查询执行流程 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为...相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。...); # 4.3 EXISTS 与 NOT EXISTS 关键字 关联子查询通常也会和 EXISTS 操作符一起来使用,用来检查在子查询中是否存在满足条件的行。

13510

数据库” 查询选修所有课的学生信息“ exists解法的理解

:  首先选取父查询表中的一个元组,内部的子查询利用此元组中的相关属性值进行查询 然后父查询根据子查询返回的结果判断此行是否满足查询条件,若满足,则把该行放入父查询查询结果中。...我们先来看看这个问题 问题一、 查询学号为‘95002’的学生选修的课程信息 select * from C  where exists (select * from SC where SC.cno =...C.cno and SC.sno = '95002' ); 按照上述的相关子查询的执行过程: C表中共有课程号为1,2,3,4的四门课,子查询把这四个学号对应的四个元组逐一带入, 根据子查询中的条件SC.cno...逐一查询之后,就把C.cno =2 对应的元组选出来了 同理问题二、 查询学号为‘95002’未选修的课程就是 select * from C where not exists (select * from...SC where SC.sno = ‘95002’ and SC.cno = C.cno); 好了,接下来我们分析文章开始提出的问题: select * from S where not exists

1.5K50

查询(2)

关子查询关子查询执行流程 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询...相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。...说明:子查询中使用主查询中的列  题目:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id 方式一:相关子查询  在 FROM 中使用子查询  SELECT...`department_id` ); EXISTS 与 NOT EXISTS关键字 关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。...FROM employees e1 WHERE EXISTS ( SELECT * FROM employees e2 WHERE e2.manager_id = e1.employee_id); 子查询实际上是通过未知表进行查询后的条件判断

74820

Mysql数据库-子查询

行子查询 4. exists后面(相关子查询: 有用) 都支持, 一般是表子查询 最后还有按照关联性区分: #按关联性分(扩展) 1. 非相关子查询 a....:直接在select后增加一个统计员工个数的子查询来统计员工个数(了解就好) -- 注意: 这个是相关子查询 -- 相关子查询 分析: -- 1....(dept_id) 必须取别名 -- 如果不取别名, temp.count(dept_id) 这样的写法是错误的 select dept....往往属于 相关子查询 # 结果:返回1或0 (true或false) # 结果解释: 其实可以把exists看成一个if判断, 判断的是子查询是否有结果,有结果返回1,没有结果返回0 # 举例 -- 当前...exists 与 in 的区别: -- exists和in的区别 -- in 后面一般直接跟 非相关子查询 (子查询执行完毕,再执行主查询) -- exists 后面一般都要跟 相关子查询(主查询查询一条

45.5K10

SQL复杂查询和视图--Java学习网

非相关子查询 ---- 查询分为外层查询和内层查询 ? 外层查询的参数可以被带入到内层查询中,而内层查询的参数不能在外层查询中使用,这和高级编程中的循环一个道理。...当内层查询没有使用到外查询的参数时,我们可以内层查询是非相关子查询。上图中就是非相关子查询。判断是否相关最简单的方式就是内层查询是否能独立执行。 相关子查询 ---- ?...EXISTS查询 ---- 基本语法: [NOT] EXISTS (子查询) 含义:判断子查询结果集是否为空,当子查询为空时,EXISTS判断为false,而NOT EXISTS判断为true。...WHERE NOT EXISTS( SELECT * FROM course WHERE tn="001" AND NOT EXISTS( SELECT *...="98030101" AND NOT EXISTS( SELECT * FROM sc AS sc2 WHERE sn="98030101" NOT EXISTS(

67220
领券