Jw
首页
技术
英语
首页
技术
英语
  • MySQL

    • MySQL 基础
    • 环境变量配置(PATH)
    • SQL 语法与分类
    • MySQL 数据类型
    • SQL - DDL 数据定义语言
    • SQL - DML 数据操作语言
    • SQL - DQL 数据查询语言
    • SQL - DCL 数据控制语言
    • MySQL 函数
    • SQL 约束
    • SQL 外键约束
    • 多表关系
    • 多表查询(连接查询)
    • 隐式内连接 vs 显式内连接
    • 子查询
    • 多表查询案例
    • 事务
    • 并发事务问题与隔离级别
    • MySQL 体系结构与存储引擎
    • 索引概述
    • 索引结构
    • 索引分类
    • 索引语法
    • SQL 性能分析
    • 索引使用
    • 索引设计原则
    • SQL 优化 - 插入数据与主键优化
    • SQL 优化 - order by 与 group by
    • SQL 优化 - limit / count / update
    • 视图
    • 存储过程
    • 存储过程 - 变量
    • 存储过程 - 流程控制、游标与条件处理
    • 存储函数
    • 触发器
    • 锁概述与全局锁
    • 表级锁
    • 行级锁
    • InnoDB 逻辑存储结构
    • InnoDB 架构
    • 事务原理(redo / undo log)
    • MVCC
    • MySQL 系统数据库
    • MySQL 常用工具
    • 数据备份与导入导出
    • 错误日志与二进制日志
    • 查询日志与慢查询日志
    • 主从复制 - 概述与原理
    • 主从复制 - 搭建
    • Mycat 配置
    • Mycat 垂直拆分与水平拆分
    • Mycat 分片规则
    • Mycat 管理与监控
    • Mycat 读写分离 - 一主一从
    • Mycat 读写分离 - 双主双从

子查询

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

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

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

分类

按结果分类子查询结果
标量子查询单个值(数字、字符串、日期)
列子查询一列(可以是多行)
行子查询一行(可以是多列)
表子查询多行多列

按位置分类:WHERE 之后、FROM 之后、SELECT 之后。

示例数据沿用 多表查询 中的 emp / dept 表。

一、标量子查询

子查询返回的结果是单个值,是最简单的形式,常用操作符:= <> > >= < <=

-- 1. 查询"销售部"的所有员工信息
SELECT id FROM dept WHERE name = '销售部';                       -- a. 先查部门 ID
SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '销售部');   -- b. 再查员工

-- 2. 查询在"方东白"入职之后的员工信息
SELECT entrydate FROM emp WHERE name = '方东白';                  -- a. 先查入职日期
SELECT * FROM emp WHERE entrydate > (SELECT entrydate FROM emp WHERE name = '方东白');

二、列子查询

子查询返回的结果是一列(可以是多行),常用操作符:

操作符描述
IN在指定的集合范围之内,多选一
NOT IN不在指定的集合范围之内
ANY子查询返回列表中,有任意一个满足即可
SOME与 ANY 等同,使用 SOME 的地方都可以使用 ANY
ALL子查询返回列表的所有值都必须满足
-- 1. 查询"销售部"和"市场部"的所有员工信息
SELECT id FROM dept WHERE name = '销售部' || name = '市场部';
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE name = '销售部' || name = '市场部');

-- 2. 查询比财务部所有人工资都高的员工信息
SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '财务部');
SELECT * FROM emp WHERE salary > ALL (SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '财务部'));

-- 3. 查询比研发部其中任意一人工资高的员工信息
SELECT * FROM emp WHERE salary > ANY (SELECT salary FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = '研发部'));

三、行子查询

子查询返回的结果是一行(可以是多列),常用操作符:= <> IN NOT IN

-- 查询与"张无忌"的薪资及直属领导相同的员工信息
SELECT salary, managerid FROM emp WHERE name = '张无忌';
SELECT * FROM emp WHERE (salary, managerid) = (SELECT salary, managerid FROM emp WHERE name = '张无忌');

四、表子查询

子查询返回的结果是多行多列,常用操作符:IN

-- 1. 查询与"鹿杖客""宋远桥"的职位和薪资相同的员工信息
SELECT job, salary FROM emp WHERE name = '鹿杖客' || name = '宋远桥';
SELECT * FROM emp WHERE (job, salary) IN (SELECT job, salary FROM emp WHERE name = '鹿杖客' || name = '宋远桥');

-- 2. 查询入职日期是"2006-01-01"之后的员工信息,及其部门信息(子查询放在 FROM 之后当临时表)
SELECT * FROM (SELECT * FROM emp WHERE entrydate > '2006-01-01') e
    LEFT JOIN dept d ON e.dept_id = d.id;

五、速查

类型结果形态常用操作符典型写法
标量子查询单个值= <> > >= < <=WHERE 字段 = (SELECT ...)
列子查询一列多行IN / NOT IN / ANY / ALLWHERE 字段 IN (SELECT ...)
行子查询一行多列= / INWHERE (字段1, 字段2) = (SELECT ...)
表子查询多行多列INFROM (SELECT ...) 别名 JOIN ...

相关

  • 多表查询(连接查询):内连接 / 外连接 / 自连接 / 联合查询
  • 多表查询案例:12 道综合练习题与答案
  • SQL - DQL:条件 / 聚合 / 分组 / 排序 / 分页
最近更新: 2026/10/9 13:59
Contributors: liujw
Prev
隐式内连接 vs 显式内连接
Next
多表查询案例