前言
通过子父查询完成更加强大功能SQL查询。
一、子查询
出现在其它语句中的select 语句,称其为子查询或内查询。
1、按结果集的行列数
1)一行一列,常量子查询。
2)一行多列,行子查询。
3)多行一列,列子查询。
4)多行多列,表子查询。
2、按子查询出现的位置
1)select后,只能接一行一列的常量子查询。
# SELECT 放常量
# 查询每个部门的员工个数
SELECT
d.*,
( SELECT COUNT( 1 ) FROM employees e WHERE e.department_id = d.department_id ) count
FROM
departments d
2)from后,接表子查询,把子查询当一个view。
# FROM 接view 必须取别名,不然找不到该view的名字
# 查询部门号》102且平均工资大于10000的部门名
SELECT
b.department_name
FROM
employees a
JOIN ( SELECT * FROM departments WHERE department_id > 102 ) b ON a.department_id = b.department_id
GROUP BY
salary
HAVING
AVG( salary ) > 10000
3)where后,接列、行、常量子查询。
# WHERE 子查询一般用括号括起放在右边
# 1.跟常量
# 查比Abel工资高的员工
USE myemployees;
SELECT
salary
FROM
employees
WHERE
salary > ( SELECT salary FROM employees WHERE last_name = 'Abel' ) # 2. # 跟列子查询+IN/NOT IN | ANY/SOME) | ALL(结合大于小于,可用MIN() |MAX(expr)来代替)
# 在部门号大于102的所有员工且该部分平均工资》10000
SELECT
last_name
FROM
employees
WHERE
department_id IN ( SELECT department_id FROM employees WHERE department_id > 102 GROUP BY department_id HAVING AVG( salary ) > 10000 ) # 跟行子查询,即一行多列
# 查询员工编号最小且工资最高
SELECT
last_name
FROM
employees
WHERE
( employee_id, salary ) = ( SELECT min( employee_id ), MAX( salary ) FROM employees )
4)exists后(相关子查询),接表子查询。
# exists() 返回子查询是否有无值,返回一个布尔值
# 查询有员工的部门名
SELECT
department_name
FROM
departments d
WHERE
EXISTS ( SELECT * FROM employees e WHERE d.department_id = e.department_id )
二、分页查询
# 分页 LIMIT OFFSET size;index从0开始
# 有时候只想看看一些数据,不会往下看了,一下加载处理太浪费性能
SELECT
*
FROM
employees
LIMIT 10,
6;
/*
语法
SELECT 查询列表 7
FROM TABLE1 别名 1
JOIN TABLE2 别名 【连接方式】 2
ON 连接条件 3
WHERE 筛选条件 4
GROUP BY 排序字段 5
HAVING 分组后的筛选条件 6
ORDER BY 排序字段 [ASC|DESC] 8
LIMIT OFFSET,SIZE 9
*/# 查询有奖金员工的工资较高的前10条
SELECT
salary
FROM
employees
ORDER BY
salary DESC
LIMIT 0,
10;
三、联合查询
# UNION 合并:将多条查询语句的结果合并成一个结果
# 拆分的好处就是条件分类,条件太多时,可读性好。
# 拆分的好处还有多表的字段一样时,可合并两张查出的view(如每个高校男生》25岁的学生)
# 查询部门编号>90或邮箱中包含a的员工信息
SELECT
*
FROM
employees
WHERE
email LIKE '%a%' UNION
SELECT
*
FROM
employees
WHERE
department_id > 90;
# 不同高校男生
# 特点 :要求查询列数一致 | 会自动去重(不想去重为UNION ALL)
SELECT
id,
sname
FROM
U1 UNION
SELECT
sid,
stu_name
FROM
U2
总结
1)子查询
2)分页查询
3)联合查询
参考文献
[1] MySQL 尚硅谷