MySQL(1) 子查询
2024-03-13 17:06:35 # Backend # MySQL

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果可以分为:

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • 表子查询(子查询结果为多行多列)

根据子查询位置可分为:

  • WHERE 之后

  • FROM 之后

  • SELECT 之后

    • 例如查询所有部门信息并统计部门人数

    • ```sql
      select d.id, d.name, (

      select count(*) from emp e where e.dept_id = d.id
      

      ) ‘人数’
      from dept d;

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13

      ### 标量子查询

      子查询返回的结果是单个值(数字、字符串、日期等)

      常用的操作符:`= <> > >= < <=`

      ```sql
      -- 查询销售部所有员工
      select * from employee where dept = (select id from dept where name = '销售部');

      -- 查询xxx入职之后的员工信息
      select * from employee where entrydate > (select entrydate from employee where name = 'xxx');

列子查询

返回的结果是一列(可以是多行)

常用的操作符:

  • IN: 在指定的集合范围内,多选一
  • NOT IN: 不在指定的集合范围内

  • ANY: 子查询返回列表中,有任意一个满足即可

  • SOME: 与ANY等同,使用SOME的地方都可以使用ANY
  • ALL: 子查询返回列表的所有值都必须满足
1
2
3
4
5
6
7
8
-- 查询销售部和市场部的所有员工信息
select * from employee where dept in (select id from dept where name = '销售部' or name = '市场部');

-- 查询比财务部所有人工资都高的员工信息
select * from employee where salary > all(select salary from employee where dept = (select id from dept where name = '财务部'));

-- 查询比研发部任意一人工资高的员工信息
select * from employee where salary > any (select salary from employee where dept = (select id from dept where name = '研发部'));

行子查询

返回的结果是一行(可以是多列)

常用的操作符:=, <>, IN, NOT IN

1
2
-- 查询与xxx的薪资及直属领导相同的员工信息
select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx');

表子查询

返回的结果是多行多列, 常用于 FROM 之后

常用的操作符:IN

1
2
3
4
5
6
7
8
9
10
11
12
13
-- 查询与xxx1,xxx2的职位和薪资相同的员工
select * from employee
where (job, salary) in (
select job, salary from employee where name = 'xxx1' or name = 'xxx2'
);

-- 查询入职日期是2006-01-01之后的员工,及其部门信息
select e.*, d.*
from (
select * from employee where entrydate > '2006-01-01'
) e
left join dept d
on e.dept = d.id;