子查询

将一个查询语句嵌套在查询语句里的一个查询语句。被嵌套在内的叫子查询(内查询)、外面的叫主查询(外查询)。

规范

  • 子查询必须写在括号内;
  • 子查询为了可读性,一般写在操作符的右边;
  • 子查询不支持 GROUP BY 子句和 LIMIT 子句;

分类

可分为两类

  • 单行子查询多行子查询

    单行子查询的子查询(内查询)返回一条查询结果,多行子查询返回多条查询结果

  • 相关子查询非相关子查询

    非相关子查询的子查询(内查询)的数据是固定的,不会使用到主查询的数据,而相关子查询会使用到主的查询的数据。

单行子查询

子查询(内查询)返回一条查询结果。

使用 = > >= < <= <> 操作符

查询比平均工资高的员工

SELECT last_name,salary
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

多行子查询

子查询(内查询)返回多条查询结果。

使用 IN ANY SOME ALL 操作符

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

查询所在部门大于平均工资的员工

SELECT last_name,department_id,salary 
FROM employees
WHERE department_id IN (
    SELECT department_id
    FROM employees
    GROUP BY department_id
    HAVING AVG(salary) >(
        SELECT AVG(salary)
        FROM employees
    )
);

不相关子查询

不依赖于外部查询的数据。

上面两个子查询的示例就是

相关子查询

查询工资大于本部门平均工资的员工

SELECT salary,last_name,department_id
FROM employees e
WHERE salary >(
    SELECT AVG(d.salary)
    FROM employees d
    WHERE d.department_id=e.department_id
);

其他

派生表

当子查询位于 FROM 子句时,这个子查询称为派生表,并且派生表必须要有别名

查询在使用的部门的编号小于100的编号

SELECT t.department_id
FROM (
    SELECT department_id
    FROM employees
    GROUP BY department_id
)   t
WHERE t.department_id<100; 

参考链接

文章目录