子查询(2)

简介: 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。

相关子查询



相关子查询执行流程


如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之 关联子查询 。相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。


17fcde050cde4a15829811bf127be79e.png


说明:子查询中使用主查询中的列


题目:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id


方式一:相关子查询


053842530d3c4dd79132297b08458f50.png


在 FROM 中使用子查询


SELECT last_name,salary,e1.department_id
FROM employees e1,(SELECT department_id,AVG(salary) dept_avg_sal FROM employees GROUP
BY department_id) e2
WHERE e1.`department_id` = e2.department_id
AND e2.dept_avg_sal < e1.`salary`;



from型的子查询:子查询是作为from的一部分,子查询要用()引起来,并且要给这个子查询取别名, 把它当成一张“临时的虚拟的表”来使用。


题目:查询员工的id,salary,按照department_name 排序


在ORDER BY 中使用子查询:

SELECT employee_id,salary
FROM employees e
ORDER BY (
SELECT department_name
FROM departments d
WHERE e.`department_id` = d.`department_id`
);


EXISTS 与 NOT EXISTS关键字



关联子查询通常也会和 EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。


如果在子查询中不存在满足条件的行:


  条件返回 FALSE
       继续在子查询中查找
       如果在子查询中存在满足条件的行:
       不在子查询中继续查找
       条件返回 TRUE

NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE。


题目:查询公司管理者的employee_id,last_name,job_id,department_id信息


SELECT employee_id, last_name, job_id, department_id
FROM employees e1
WHERE EXISTS ( SELECT *
FROM employees e2
WHERE e2.manager_id =
e1.employee_id);



子查询实际上是通过未知表进行查询后的条件判断,而自连接是通过已知的自身数据表
进行条件判断,因此在大部分 DBMS 中都对自连接处理进行了优化。


相关文章
|
3月前
(头哥)多表查询与子查询
(头哥)多表查询与子查询
49 0
|
3月前
|
SQL
深入了解关联查询和子查询
深入了解关联查询和子查询
26 0
|
4月前
聚合函数、子查询
聚合函数、子查询
|
6月前
|
SQL 关系型数据库 MySQL
第9章_子查询
第9章_子查询
46 0
|
11月前
|
SQL 索引
相关子查询
相关子查询
173 0
|
11月前
|
SQL
联合查询和子查询
联合查询和子查询
|
11月前
|
SQL 关系型数据库 MySQL
第09章_子查询
第09章_子查询
71 0
|
数据库 Python
子查询
子查询
131 0
|
SQL 关系型数据库 MySQL
子查询(1)
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
子查询(1)