MySQL 子查询

344 阅读2分钟

子查询分类

按子查询出现位置:

  • select后:
    • 仅仅支持标量子查询
  • from后
    • 支持表子查询
  • where或having后 (用最多!!!)
    • 标量子查询
    • 行子查询
    • 列子查询
  • exists后
    • 表子查询

结果集行列数不同:

  • 标量子查询 (结果一行一列)
  • 列子查询 (结果一列多行)
    • IN/NOT IN 等于列表中任意一个
  • any/some 和子查询返回的某一个值比较 * all 和子查询返回所有值做比较
  • 行子查询 (结果一行多列)
  • 表子查询 (多行多列)

实践

数据表

employess 部门表

where或having后

案例1 谁的工资比abel高 (标量子查询)

  1. 查出abel工资
select salary from employees where last_name = 'abel';

这是标量, 一行一列 2. 查出结果>abel的人

select last_name from employees where salary > (select salary from employees where last_name = 'abel');

案例2 查询返回location_id是1400或1700的部门中所有员工姓名(列子查询) in

第一步: 返回1400, 1700的部门id

select department_id from departments where location_id in (1400, 1700)

第二步: 查询这些id的所有员工姓名, 用in

select last_name from employees where department_id in (select department_id from departments where location_id in (1400, 1700));

案例3 查询其他部门中比job_id为'IT_PROG'部门的任一工资低的员工的员工号,姓名,job_id以及salary (列子查询 + any)

  • any代表任意一个, < any 意思是小于任何一个,也就是小于最大的.
  • all代表所有, < all 代表小于最小值 分步
  1. 查询job_id为'IT_PROG'的工资(一列多行)
SELECT salary FROM employees WHERE  job_id = 'IT_PROG'

2. 结果要比这些工资的任一工资低

SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < any (SELECT salary FROM employees WHERE  job_id = 'IT_PROG')

案例4 exists后的子查询(相关子查询)

  • exists表示是否存在, 存在1, 不存在0(不常用, 一般可以用in判断)
select  exists(select employee_id from employees)