MySQL概述
基础篇
通用语法及分类
DCL
DQL
DML
DDL
函数
字符串函数
数值函数
日期函数
流程函数
约束
常用约束
外键约束
多表查询
多表关系
查询
内连接查询
外连接查询
自连接查询
联合查询
子查询
事务
进阶篇
存储引擎
性能分析
查看执行频次
慢查询日志
profile
explain
索引
索引结构
索引分类
语法
使用规则
设计原则
SQL 优化
插入数据
主键优化
order by优化
group by优化
limit优化
count优化
update优化(避免行锁升级为表锁)
视图
存储过程
触发器
锁
InnoDB 引擎
事务原理
MVCC
数据类型
权限一览表
图形化界面工具
子查询 - MySql学习文档 - 笔下光年
网站首页
子查询
SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询。 `SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);` **子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个** 根据子查询结果可以分为: - 标量子查询(子查询结果为单个值) - 列子查询(子查询结果为一列) - 行子查询(子查询结果为一行) - 表子查询(子查询结果为多行多列) 根据子查询位置可分为: - WHERE 之后 - FROM 之后 - SELECT 之后 #### 标量子查询 子查询返回的结果是单个值(数字、字符串、日期等)。 常用操作符:- < > > >= < <= 例子: ```mysql -- 查询销售部所有员工 select id from dept where name = '销售部'; -- 根据销售部部门ID,查询员工信息 select * from employee where dept = 4; -- 合并(子查询) 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 | 子查询返回列表的所有值都必须满足 | 例子: ```mysql -- 查询销售部和市场部的所有员工信息 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 例子: ```mysql -- 查询与xxx的薪资及直属领导相同的员工信息 select * from employee where (salary, manager) = (12500, 1); select * from employee where (salary, manager) = (select salary, manager from employee where name = 'xxx'); ``` #### 表子查询 返回的结果是多行多列 常用操作符:IN 例子: ```mysql -- 查询与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') as e left join dept as d on e.dept = d.id; ```
上一篇:
联合查询
下一篇:
事务