> 文档中心 > 子查询 的顶级详述

子查询 的顶级详述

在这里插入图片描述

目录

  • 一、子查询
  • 二、分类
  • 三、单行子查询
    • 🔥HAVING 中的子查询
    • 🔥CASE中的子查询
    • 🔥单行子查询的空值问题
    • 🔥非法使用子查询
  • 四、多行子查询
    • 🔥多行子查询的空值问题
  • 五、相关子查询
    • 🔥EXISTS 与 NOT EXISTS
    • 🔥更新
    • 🔥删除

老规矩先上 表:
在这里插入图片描述

一、子查询

  1. 语法结构
    在这里插入图片描述
    子查询(内查询)在主查询之前一次执行完成
    子查询的结果被主查询(外查询)使用
  2. 注意事项:
    ○子查询要包含在括号内
    ○将子查询放在比较条件的右侧
    单行操作符对应单行子查询,多行操作符对应多行子查询

二、分类

  1. 按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、 多行子查询
    单行子查询就是返回一条记录
    多行子查询就是返回多条记录
  2. 按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询
    子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询

三、单行子查询

操作符 含义
= equal to
> greater than
>= greater than or equal to
< less than
<= less than or equal to
not equal to

🔥HAVING 中的子查询

首先执行子查询
向主查询中的HAVING 子句返回结果

例题:
查询最低工资大于50号部门最低工资的部门id和其最低工资

SELECT department_id, MIN(salary)FROM employeesGROUP BY department_idHAVING MIN(salary) >(SELECT MIN(salary)FROM employeesWHERE 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_idWHEN(SELECT department_id FROM departmentsWHERE location_id = 1800)THEN 'Canada' ELSE 'USA' END) locationFROM employees;

🔥单行子查询的空值问题

SELECT last_name, job_idFROM employeesWHERE job_id =(SELECT job_idFROM employeesWHERE last_name = 'Haas');

子查询不返回任何行

🔥非法使用子查询

SELECT employee_id, last_nameFROM employeesWHERE salary =(SELECT MIN(salary)FROM employeesGROUP BY department_id);

子查询 的顶级详述

四、多行子查询

内查询返回多行
使用多行比较操作符

操作符 含义
IN 等于列表中的任意一个
ANY 需要和单行比较操作符一起使用,和子查询返回的某一个值比较
ALL 需要和单行比较操作符一起使用,和子查询返回的所有值比较
SOME 实际上是ANY的别名,作用相同,一般常使用ANY

🔥多行子查询的空值问题

SELECT last_nameFROM employeesWHERE employee_id NOT IN (SELECT manager_idFROM emp);

五、相关子查询

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件
关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询

在这里插入图片描述

🔥EXISTS 与 NOT EXISTS

关键字

用来检查在子查询中是否存在满足条件的行

  1. 如果在子查询中不存在满足条件的行:
    ○条件返回 FALSE
    ○继续在子查询中查找
  2. 如果在子查询中存在满足条件的行:
    ○不在子查询中继续查找
    ○条件返回 TRUE

NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE

🔥更新

UPDATE table1 alias1SET column = (SELECT expression  FROM table2 alias2  WHERE alias1.column = alias2.column  );

使用相关子查询依据一个表中的数据更新另一个表的数据

🔥删除

DELETE FROM table1 alias1WHERE column operator (SELECT expression   FROM table2 alias2   WHERE alias1.column = alias2.column   );

使用相关子查询依据一个表中的数据删除另一个表的数据

素描网