子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询。
外查询也叫主查询,内查询也叫子查询。
子查询分类
- 按子查询的结果分类
- 查询结果是一条:
单行子查询; - 查询结果是多条:
多行子查询。
- 查询结果是一条:
- 按子查询的执行次数分类
- 子查询只执行一次,执行结果作为主查询的条件执行:
不相关子查询 - 子查询循环执行多次,依赖外部查询,要用到外部表:
相关子查询
- 子查询只执行一次,执行结果作为主查询的条件执行:
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 + 自连接
自连接优于子查询,自连接的处理速度更快!
WITH ROLLUP
SELECT SUM(字段1) -- 求出每个分组内字段1的总和(分组1、分组2、……)
FROM 表名
GROUP BY 字段1
WITH ROLLUP -- 求所有分组的字段1的总和(分组1+分组2+……)
WITH ROLLUP是对GROUP BY后的第一个字段进行分组求和。
646

被折叠的 条评论
为什么被折叠?



