MySQL子查询

前言

通过子父查询完成更加强大功能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 尚硅谷

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值