子查询
该文所需要的sql
文件,点这里【免下载积分】
嵌套在其他语句内部的select语句称为子查询或内查询,
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询或主查询
子查询的分类
按出现位置
select
后面- 仅支持标量子查询
from
后面- 表子查询
where
和having
后面- 标量只查询
- 列子查询
- 行子查询(用的少)
exists
后面- 标量子查询
- 列子查询
- 行子查询
- 表子查询
按结果集的行列数
- 标量子查询
- 结果集只有一行一列
- 列子查询
- 结果集只有一列多行
- 行子查询
- 结果集有一行多列
- 表子查询
- 结果集一般为多行多列,没有限制
子查询的特点
-
子查询放在小括号内
-
子查询一般放在条件的右侧
-
标量子查询,一般搭配单行操作符使用
-
列子查询,一般搭配多行操作符
-
in any/some all
-
-
子查询先于主查询
实例
标量子查询
-
谁的工资高于
abel
,先试用select找到abel
的工资,然后再判断salary情况SELECT * FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name = 'Abel')
-
查询最低工资
SELECT last_name, salary FROM employees WHERE salary = ( SELECT MIN( salary ) FROM employees );
也可以
SELECT last_name, salary FROM employees ORDER BY salary LIMIT 1
-
查询最低工资大于50号部门最低工资的部门id和其最低工资
- 查询50部门的最低工资
SELECT MIN( salary ) FROM employees WHERE department_id = 50;
- 查询每个部门的最低工资
SELECT MIN( salary ), department_id FROM employees GROUP BY department_id
- 筛选
SELECT MIN( salary ), department_id FROM employees GROUP BY department_id HAVING MIN( salary ) > ( SELECT MIN( salary ) FROM employees WHERE department_id = 50 )
列子查询
操作符 | 含义 |
---|---|
IN/NOT IN | 等于列表中的任意一个 |
ANY|SOME | 和子查询返回的某一个值比较 |
ALL | 和子查询返回的所有值比较 |
- 查询department_id为1400或1700的部门编号的员工姓名
SELECT
last_name
FROM
employees
WHERE
department_id IN (
SELECT DISTINCT
department_id
FROM
departments
WHERE
location_id IN ( 1400, 1700 )
)
- 返回其它工种中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id 以及salary
SELECT
employee_id,
last_name,
job_id
FROM
employees
WHERE
salary < ANY ( SELECT salary FROM employees WHERE job_id = 'IT_PROG' )
AND job_id <> 'IT_PROG';
行子查询
- 查询员工编号最小并且工资最高的员工信息
SELECT
*
FROM
employees
WHERE
employee_id = ( SELECT MIN( employee_id ) FROM employees )
AND salary = (
SELECT
MAX( salary )
FROM
( employees )
)
SELECT
*
FROM
employees
WHERE
( employee_id, salary ) = (
SELECT
MIN( employee_id ),
MAX( salary )
FROM
employees)
表子查询
- 查询每个部门的员工个数
SELECT
d.*,
( SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id ) number
FROM
departments d
SELECT
department_id,
COUNT(*)
FROM
employees
GROUP BY
department_id
b站李玉婷老师的课程笔记