▐ 子查询概述
• 子查询可以出现在from 后面 或where后面
• 出现在 from 后称表子查询,结果集一般为多行多列(把查询结果继续当做一张表)
• 出现在 where 后称标量子查询 或列子查询 结果集只有一行一列,或一行多列.
• 标量子查询的结果集只有一行一列;列子查询的结果集是一列多行 (区别)
接下来我会通过一个实例,通过代码给大家演示子查询
▐ 准备工作
📰 创建一个员工表(employee)和一个部门表(dept),两个表是关联关系.
-- 创建一个员工表employee(手动加入数据) CREATE TABLE employee( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), gender VARCHAR(1), age VARCHAR(3), money INT , deptid INT, CONSTRAINT FK_employee_dept_on_deptid FOREIGN KEY (deptid) REFERENCES dept(id) ) -- 创建一个部门表dept并插入数据 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10) )
📰 我们将在此表的基础上进行子查询
▐ 标量子查询
• 结果集:只有一行一列
• 位置:where后
🏷️例如要查询工资最高的员工
SELECT * FROM employee WHERE money = (SELECT MAX(money) FROM employee)
代码解读:📰
先查询出工资最高是多少(一行一列,最高工资肯定是一个数)
SELECT MAX(money) FROM employee
再将此作为条件再进行一次查询
SELECT * FROM employee WHERE money = (SELECT MAX(money) FROM employee)
▐ 列子查询
• 结果集:一列多行
• 位置:where后
🏷️例如要查询工资在2000~3000的员工信息
SELECT * FROM employee WHERE money IN (SELECT money FROM employee WHERE money>2000 AND money<3000)
代码解读:📰
先查询出工资在2000~3000之间的值(一列多行,这个范围的工资值有多个)
SELECT money FROM employee WHERE money>2000 AND money<3000
再将此作为条件再进行一次查询,只要工资符合条件的员工就被查询出来
SELECT * FROM employee WHERE money IN (条件,也就是第一次的查询结果)
▐ 表子查询
• 结果集:多列多行(可以看做又一张表)
• 位置:from后
🏷️例如要查询同龄的年龄
SELECT * FROM (SELECT age,COUNT(*)c FROM employee GROUP BY age)t WHERE t.c>1
代码解读:📰
通过年龄对员工表分组,并计数每个年龄的人数(多行多列)
SELECT age, COUNT(*) FROM employee GROUP BY age
再将此结果当做一个新表进行二次查询( 同龄的年龄,条件就是count(*)>1 )
SELECT * FROM (SELECT age,COUNT(*)c FROM employee GROUP BY age)t WHERE t.c>1
< 这里要注意对表的重命名 >
▐ 多信息嵌套
🏷️例如要查询出每个部门工资最高的员工信息
SELECT * FROM employee s INNER JOIN (SELECT MAX(money)maxmoney,deptid FROM employee GROUP BY deptid)t ON s.money = t.maxmoney AND s.deptid = t.deptid
代码解读:📰
先按部门 分组查询出每个部门的最高工资是多少
SELECT MAX(money)maxmoney, deptid FROM employee GROUP BY deptid
再将此查询结果与员工表关联查询
SELECT * FROM employee s
INNER JOIN //内连接
(SELECT MAX(money)maxmoney, deptid FROM employee GROUP BY deptid ) t
ON s.money = t.maxmoney AND s.deptid = t.deptid //查询条件
▐ 结语:
希望这篇关于MySQl数据库—子查询的介绍能对大家有所帮助,欢迎大佬们留言或私信与我交流~~学海漫浩浩,我亦苦作舟!大家一起学习,一起进步!