子查询指一个查询语句嵌套在另一个查询语句内部的查询。
外查询也叫主查询,内查询也叫子查询。
单行子查询;多行子查询。不相关子查询相关子查询OR(或) 与 IN效果一样WHERE A=1 OR A=2
IS EQUAL TO
WHERE A IN (1, 2)
📝推荐IN
题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT department_id, MIN(salary)
FROM employee
GROUP BY department
HAVING MIN(salary) > (SELECT MIN(salary)
FROM employee
WHERE department_id = 50)
CASE题目:显示员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800
的department_id相同,则location为’Canada’,其余则为’USA’。
SELECT employee_id, last_name, (CASE department_id
WHEN (SELECT department_id
FROM employee
WHERE location_id=1800),
THEN location='Canana'
ELSE location='USA' END) location
FROM employee
ANY题目:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
SELECT employee_id, name, job_id, salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ANY(SELECT salary
FROM employees
HAVING job_id='IT_PROG');
MIN 与 <=ALL效果一样查询平均工资最低的部门id
Mysql中,聚合函数不可以嵌套使用。oracle可以。
MIN(AVG(SALARY))在mysql种是❌的。
SELECT department_id
FROM employees
GROUP BY department
HAVING AVG(salary) <= ALL(SELECT AVG(salary) avg_salary
FROM employees
GROUP BY department)
如果存在,直接返回,不再查找。
如果不存在,继续查找,直至找到或全部查找完。
EXIST:题目字眼“存在”
NOT EXIST:题目字眼“不存在”
自连接:DISTINCT + 自连接
自连接优于子查询,自连接的处理速度更快!