MySQL 子查询与多表联合查询
子查询:就是一个查询的结果作为另一个查询的数据源或者条件。
如何查询出工资最大的人的姓名?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | mysql> select max(sal) from emp; --查询出工资最大值 +----------+ | max(sal) | +----------+ | 5000.00 | +----------+ 1 row in set (0.00 sec) mysql> select ename,sal from emp where sal = ( select max(sal) from emp);--可以将工资的最大值最为一个筛选条件, select ename,sal from emp执行完之后赋值给sal sal = ( select max(sal) from emp); +-------+---------+ | ename | sal | +-------+---------+ | KING | 5000.00 | +-------+---------+ 1 row in set (0.32 sec) mysql> select ename,sal from emp where sal = ( select min(sal) from emp);--查询最小工资 +-------+--------+ | ename | sal | +-------+--------+ | SMITH | 800.00 | +-------+--------+ 1 row in set (0.00 sec) |
子查询情况;将查询结果作为另一个查询的条件
查询出公司都有那些人是经理人;看那些对应的的empno出现在mgr字段中,谁就是经理人
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | mysql> select mgr from emp; 查询 +------+ | mgr | +------+ | 7902 | | 7698 | | 7698 | | 7839 | | 7698 | | 7839 | | 7839 | | 7566 | | NULL | | 7698 | | 7788 | | 7698 | | 7566 | | 7782 | | NULL | +------+ 15 rows in set (0.00 sec) mysql> select distinct mgr from emp; --去重 +------+ | mgr | +------+ | 7902 | | 7698 | | 7839 | | 7566 | | NULL | | 7788 | | 7782 | +------+ 7 rows in set (0.00 sec) mysql> select distinct mgr from emp where mgr is not null; --去掉null空值,通过这条语句得到的信息就是都有哪些empno出现在mgr字段中 +------+ | mgr | +------+ | 7902 | | 7698 | | 7839 | | 7566 | | 7788 | | 7782 | +------+ 6 rows in set (0.01 sec) mysql> select ename,empmo from emp where empmo in ( select distinct mgr from emp);--查询公司都有哪些人是经理人 in 关键字 +-------+-------+ | ename | empmo | +-------+-------+ | JONES | 7566 | | BLAKE | 7698 | | CLARK | 7782 | | SCOTT | 7788 | | KING | 7839 | | FORD | 7902 | +-------+-------+ 6 rows in set (0.00 sec) mysql> select ename,empmo from emp where empmo in ( select distinct mgr from emp where mgr is not null); +-------+-------+ | ename | empmo | +-------+-------+ | JONES | 7566 | | BLAKE | 7698 | | CLARK | 7782 | | SCOTT | 7788 | | KING | 7839 | | FORD | 7902 | +-------+-------+ 6 rows in set (0.00 sec) |
注意:以上这两种情况都是将整个查询的一个结果作为另一个查询的条件,作为条件的时候这里用到了等值比较、in,其他的<\>\<=\>=都是可以的。查出平均工资最大的部门是那个?
1、每个部门的平均工资需要先查出来,组函数不可以嵌套
查询结果作为另一个查询的数据源,可以当成一张表。
注意:当成表的过程中必须起别名
1 2 3 4 5 6 7 8 9 10 | mysql> select avg(sal),deptno from emp group by deptno;--查询平均工资和对应的部门编号 +-------------+--------+ | avg(sal) | deptno | +-------------+--------+ | 2356.540000 | NULL | | 2916.666667 | 10 | | 2175.000000 | 20 | | 1566.666667 | 30 | +-------------+--------+ 4 rows in set (0.00 sec) |
MySQL多表联合查询
查询员工的姓名和员工所在部门的名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | mysql> select ename,DNAME from emp,dept; +------------+------------+ | ename | DNAME | +------------+------------+ | SMITH | ACCOUNTING | | SMITH | RESEARCH | | SMITH | SALES | | SMITH | OPERATIONS | | ALLEN | ACCOUNTING | | ALLEN | RESEARCH | | ALLEN | SALES | | ALLEN | OPERATIONS | | WARD | ACCOUNTING | | WARD | RESEARCH | | WARD | SALES | | WARD | OPERATIONS | | JONES | ACCOUNTING | | JONES | RESEARCH | | JONES | SALES | | JONES | OPERATIONS | | MARTIN | ACCOUNTING | | MARTIN | RESEARCH | | MARTIN | SALES | | MARTIN | OPERATIONS | | BLAKE | ACCOUNTING | | BLAKE | RESEARCH | | BLAKE | SALES | | BLAKE | OPERATIONS | | CLARK | ACCOUNTING | | CLARK | RESEARCH | | CLARK | SALES | | CLARK | OPERATIONS | | SCOTT | ACCOUNTING | | SCOTT | RESEARCH | | SCOTT | SALES | | SCOTT | OPERATIONS | | KING | ACCOUNTING | | KING | RESEARCH | | KING | SALES | | KING | OPERATIONS | | TURNER | ACCOUNTING | | TURNER | RESEARCH | | TURNER | SALES | | TURNER | OPERATIONS | | ADAMS | ACCOUNTING | | ADAMS | RESEARCH | | ADAMS | SALES | | ADAMS | OPERATIONS | | JAMES | ACCOUNTING | | JAMES | RESEARCH | | JAMES | SALES | | JAMES | OPERATIONS | | FORD | ACCOUNTING | | FORD | RESEARCH | | FORD | SALES | | FORD | OPERATIONS | | MILLER | ACCOUNTING | | MILLER | RESEARCH | | MILLER | SALES | | MILLER | OPERATIONS | | zhang | ACCOUNTING | | zhang | RESEARCH | | zhang | SALES | | zhang | OPERATIONS | +------------+------------+ 60 rows in set (0.29 sec) |
笛卡尔积
(14*4)emp的每一条数据与dept表的每一条数据组合。也就是56条数据。
多表联合查询
两个表中的deptno是相等的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | mysql> select ename,DNAME from emp,dept where emp.deptno = dept.deptno; +--------+------------+ | ename | DNAME | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+ 14 rows in set (0.01 sec) |
关键字join= 联和 on = 条件;查询ename和dname在emp表和dept表查询,查询对应的数据on emp.deptno = dept.deptno
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | mysql> select ename,dname from emp join dept on emp.deptno = dept.deptno; +--------+------------+ | ename | dname | +--------+------------+ | SMITH | RESEARCH | | ALLEN | SALES | | WARD | SALES | | JONES | RESEARCH | | MARTIN | SALES | | BLAKE | SALES | | CLARK | ACCOUNTING | | SCOTT | RESEARCH | | KING | ACCOUNTING | | TURNER | SALES | | ADAMS | RESEARCH | | JAMES | SALES | | FORD | RESEARCH | | MILLER | ACCOUNTING | +--------+------------+ 14 rows in set (0.00 sec) |
查询某个人的姓名、所在的部门、工资的等级
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | mysql> select ename,DNAME,GRADE from emp join dept join salgrade on emp.deptno = dept.deptno and emp.sal between losal and hisal; +--------+------------+-------+ | ename | DNAME | GRADE | +--------+------------+-------+ | SMITH | RESEARCH | 1 | | ADAMS | RESEARCH | 1 | | JAMES | SALES | 1 | | WARD | SALES | 2 | | MARTIN | SALES | 2 | | MILLER | ACCOUNTING | 2 | | ALLEN | SALES | 3 | | TURNER | SALES | 3 | | JONES | RESEARCH | 4 | | BLAKE | SALES | 4 | | CLARK | ACCOUNTING | 4 | | SCOTT | RESEARCH | 4 | | FORD | RESEARCH | 4 | | KING | ACCOUNTING | 5 | +--------+------------+-------+ 14 rows in set (0.01 sec) |
草都可以从石头缝隙中长出来更可况你呢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏