MySQL -- 复合查询 - 指南

前言

个人主页:不会c嘎嘎
专栏传送门:【数据结构】【C++】【Linux】【算法】【MySQL】
学习方向:C++方向学习爱好者
⭐人生格言:谨言慎行,戒骄戒躁

每日一鸡汤:

“别怕走得慢,只怕停下来。每一个不曾起舞的日子,都是对生命的辜负。你流下的每一滴汗水,都会在未来某个时刻开花结果。即使现在看不到希望,也要相信,黑夜再长,也挡不住黎明的光。坚持下去,不是因为看见了希望才努力,而是努力了,才能看见希望。”

目录

1.回顾基本查询

2.多表查询

3.自连接

4.子查询

结语


1.回顾基本查询

先带大家来做一下便捷的复合查询,这是一个来自oracle 9i的经典测试表题目,大家许可自行导入scott_data: 雇员信息表,练习mysql语法

(1)查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

(2)按照部门号升序而雇员的工资降序排序

(3)使用年薪进行降序排序

(4)呈现工资最高的员工的名字和工作岗位

这里使用了子查询获取最高工资,继而再查询工资等于这个值的员工

(5)显示工资高于平均工资的员工信息

这里使用了子查询获取平均工资,然后再查询工资大于这个值的员工

(6)显示每个部门的平均工资和最高工资

先对表通过deptno进行分组,然后再使用聚合函数查询值

(7)显现平均工资低于2000的部门号和它的平均工资

这里的having可以在分组以后采用,相当于where筛选条件

(8)表现每种岗位的雇员总数,平均工资

先对数据通过job分组,然后求人数和平均工资

2.多表查询

实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个容易的公司管理系统,有三张EMP,DEPT,SALGRADE来演示如何进行多表查询。

案例:(1)显示雇员名、雇员工资以及所在部门的名字

缘于上面的数据来自EMPDEPT表,因此要联合查询

不加过滤的笛卡尔积表

通过deptno进行过滤

再从过滤后的表中显示出雇员名字,雇员工资以及部门名

(2)表现部门号为10的部门名,员工和工资

先对两个表做笛卡尔积,然后过滤没用的行,最终筛选出deptno=10的员工信息

(3)显示各个员工的姓名,工资,及工资级别

先对两张表做笛卡尔积,根据工资介于工资的等级进行筛选数据

3.自连接

自连接是指在同一张表连接查询,需要对同一张表进行笛卡尔积
(1)显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno
1.使用子查询,先在子查询中查出ford的上级编号,然后再在emp表中找到这个编号相等的员工编号的员工就是ford的上级

2.运用多表查询,先查出下级的上级编号与员工表中对应的员工编号的人

然后根据上面的临时表再进行筛选出名字叫ford的员工

4.子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询
(1)显示SMITH同一部门的员工
先查询smith的部门号
再筛选和这个部门号相同的员工
多行子查询
(1)使用 in关键字查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,然而不包含10号己的
先用子查询出10号部门的岗位
再查询在这些工作岗位并且不是10号部门中的员工,in指的是一个范围。
(2)使用 all关键字显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
先子查询30号部门员工的工资
再查询比30号部门所有员工的工资都多的员工
(3)any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(具备自己部门的员工)
只需要把all换成any表示任意一个其中的值
多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
案例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
先查询smith的部门和岗位
再查询 完全相同的所有雇员,不含SMITH本人
在from子句中使用子查询
子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
(1)显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
先对部门进行分组查询每个部门的平均工资
然后把上面的查询结果当做一个临时表格与emp进行多表查询
在这个多表查询的结果中查找大于平均部门工资的员工
(2)查找每个部门工资最高的人的姓名、工资、部门、最高工资
先查询每个部门最高工资
然后作为临时表与emp进行多表查询
最后查询工资等于max_sal的员工
(3) 显示每个部门的信息(部门名,编号,地址)和人员数量
使用多表:这里虽然group by后面跟了很多列参数,但是真正决定分组的仍然是“业务键”(这里是 deptno)
运用多表子查询:
先查询部门和部门人数
再与dept进行多表查询

结语

本文介绍了MySQL数据库查询操作,包括基本查询、多表查询、自连接和子查询等高级技巧。通过经典的scott_data雇员信息表案例,详细讲解了复合查询条件设置、分组聚合、排序操作等基础查询方法。在多表查询部分,演示了笛卡尔积过滤和表连接应用。特别讲解了自连接查询和子查询的多种用法,包括单行/多行子查询、多列子查询及在FROM子句中使用子查询作为临时表的技巧。文章还提供了部门统计、工资级别筛选等实用案例,适合数据库学习者提升SQL查询技能。

本期博客的全部内容,感谢各位的阅读以及观看。如果内容有误请大佬们多多指教,一定积极改进,加以学习。就是以上就

posted @ 2025-12-22 19:58  clnchanpin  阅读(51)  评论(0)    收藏  举报