⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐
如果可以,麻烦各位看官顺手点个star~😊
如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆
SELECT select_list
FROM table
WHERE expr operator(SELECT select_listFROM table);
按内查询的结果 返回一条还是多条 记录,将子查询分为 单行子查询、多行子查询。
我们按 内查询是否被执行多次,将子查询划分为相关(或关联)子查询 和 不相关(或非关联)子查询 。
子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询。
同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。
操作符 | 含义 |
---|---|
= | equal to |
> | greater than |
>= | greater than or equal to |
< | less than |
<= | less than or equal to |
<> | not equal to |
SELECT last_name, job_id, salary
FROM employees
WHERE job_id =(SELECT job_idFROM employeesWHERE employee_id = 141)
AND salary >(SELECT salaryFROM employeesWHERE employee_id = 143);
HAVING
中的子查询HAVING
子句返回结果;SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >(SELECT MIN(salary)FROM employeesWHERE department_id = 50);
CASE
中的子查询SELECT employee_id, last_name,(CASE department_idWHEN(SELECT department_id FROM departmentsWHERE location_id = 1800)THEN 'Canada' ELSE 'USA' END) location
FROM employees;
子查询不返回任何行
操作符 | 含义 |
---|---|
IN | 等于列表中的任意一个 |
ANY | 需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 |
SOME | 实际上是ANY的别名,作用相同,一般常使用ANY |
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询
。
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
在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`;
在OEDER BY
中使用子查询:
SELECT employee_id,salary
FROM employees e
ORDER BY (SELECT department_nameFROM departments dWHERE e.`department_id` = d.`department_id`);
EXISTS
与NOT EXISTS
关联子查询通常也会和EXISTS
操作符一起来使用,用来检查在子查询中是否存在满足条件的行。
FALSE
;TRUE
;NOT EXISTS
关键字表示如果不存在某种条件,则返回TRUE
,否则返回FALSE
。
UPDATE table1 alias1
SET column = (SELECT expressionFROM table2 alias2WHERE alias1.column = alias2.column);
DELETE FROM table1 alias1
WHERE column operator (SELECT expressionFROM table2 alias2WHERE alias1.column = alias2.column);
在可以使用子查询,也可以使用自连接的情况下,一般情况建议使用自连接,因为在许多 DBMS 的处理过程中,对于自连接的处理速度要比子查询快得多。
可以这样理解:子查询实际上是通过未知表进行查询后的条件判断,而自连接是通过已知的自身数据表进行条件判断,因此在大部分DBMS 中都对自连接处理进行了优化。
⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐
如果可以,麻烦各位看官顺手点个star~😊
如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆