MySQL之复合查询

MySQL之复合查询

🌟🌟hello,各位读者大大们你们好呀🌟🌟

🚀🚀系列专栏:【MySQL的学习】

📝📝本篇内容:基本查询回顾;多表查询;自连接;子查询;单行子查询;多行子查询;多列子查询;在from子句中使用子查询;合并查询

⬆⬆⬆⬆上一篇:MySQL之表的增删查改

💖💖作者简介:轩情吖,请多多指教(>> •̀֊•́ ) ̖́-

1.基本查询回顾

我们来看几个例子,下面的三张图是这篇文章中必备的表格,内容太大了,后面不在一一展示



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

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

使用年薪进行降序排序

年薪=每月工资*12+奖金,即sal *12+comm

显示工资最高的员工的名字和工作岗位


我们这边使用了两种方式进行查找,但是第一种方式需要两句SQL语句,因此我们引入了"子查询"的概念,我们的where中可以使用select进行子查询。

但是这边要注意我们的where中不能使用相关的聚合函数,会报错的,主要原因是因为where是逐行过滤原始数据,此时全表数据未遍历完,无法计算聚合值;而select用max(),虽然没有group by但合法,因为 SQL 会把全表当作「一个分组」,遍历完所有行后计算聚合值。

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

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

显示平均工资低于2000的部门号和它的平均工资


显示每种岗位的雇员总数,平均工资

2.多表查询

我们之前学的都是查询一个表,但是MySQL其实也是支持一下子查询多个表的

现在假设要显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询

表太大了,只看一部分,这其实就是一种穷举法

但是很多的内容就是多余的,压根对不上,我们只需要deptno对上的行数据即可,因此我们需要做一个筛选,我们只要emp表中的deptno = dept表中的deptno字段的记录

再看两个例子

显示部门号为10的部门名,员工名和工资

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

3.自连接

自连接是指在同一张表连接查询

看个案例

显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)

第一种方式是使用子查询,但是看上去比较麻烦

第二种方式是使用多表查询(自查询)

使用到表的别名from emp leader, emp worker,给表起别名,因为要先做笛卡尔积(from优先级比他们高),所以别名可以在where识别。因为from的优先级最高,所以说其实from后面给表起的别名,基本上在SQL语句的其他地方都可以用。

4.子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

4.1. 单行子查询

返回一行记录的子查询

显示SMITH同一部门的员工

4.2.多行子查询

返回多行记录的子查询

查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

in 是 SQL 中行级过滤的常用运算符,属于 WHERE 子句的配套用法,核心作用是:判断某个字段的值,是否在指定的「值列表 / 子查询结果」中

显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

all是 SQL 中用于比较运算的关键字,核心作用是:判断某个值是否满足「与指定集合中所有值的比较条件」,常和比较运算符(>/</=/>= 等)搭配使用,且必须结合子查询(不能直接跟固定值列表)。


显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

这里的任意员工指的是只要高于部门30任意一个员工就算

any是 SQL 中与集合做比较的关键字,和all 是「互补关系」,核心作用:判断某个值是否满足「与指定集合中任意一个值的比较条件」,需搭配比较运算符(>/</=/>= 等)+ 单列子查询使用,部分场景可等价替代in。

4.3. 多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

其实这样写的话可以看成是"多行"多列,只不过这边的"多行"只有一行

4.4.在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资




这里面的临时表中的字段如果想要在外面使用就需要取别名,否则外面无法使用,并且临时表必须要取别名,否则也无法使用。

查找每个部门工资最高的人的姓名、工资、部门、最高工资



其实总的来说我们任何时候,查询出来的临时结构,本质在逻辑上也是表结构。

解决多表问题的本质:想办法将多表转化成为单表,所以 mysql 中,所有 select 的问题全部都可以转成单表问题,这是多表查询的指导思想。

显示每个部门的信息(部门名,编号,地址)和人员数量


前面使用的是子查询,推荐使用这种方式,但是还有另一种方式,就是使用多表,虽然也可以达到相同的结果,但是非常不推荐



但是当我们想要查看ename时就不行了,这主要是因为其他列(ename)既不在 group by中,也没有被聚合,因此group by不知道怎么做了。所以说我们想要查看,就必须要group by后面添加,dept.loc也是同样的道理。但是这种写法就不太合理,本身dname和loc不需要分组了,还要不得不这样写。

当然这跟MySQL版本也有很大关系,新版本就不会有这种问题,可以直接查看

5.合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all

union该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

union all该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

将工资大于2500或职位是MANAGER的人找出来


🌸🌸MySQL之复合查询大概就讲到这里啦,博主后续会继续更新更多Qt的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!如有小伙伴需要Qt的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪

相关推荐
jinanwuhuaguo4 小时前
OpenClaw协议霸权——从 MCP 标准到意图封建化的政治经济学(第十八篇)
android·人工智能·kotlin·拓扑学·openclaw
gmaajt4 小时前
JavaScript中闭包对垃圾回收器GC标记清除算法的影响
jvm·数据库·python
NineData4 小时前
NineData 亮相 2026 德国汉诺威工业博览会,加速拓展欧洲及全球市场
运维·数据库·人工智能·数据库管理·ninedata·ai服务·玖章算术
撩得Android一次心动4 小时前
Android Room 数据库详解【源码篇】
android·数据库·android jetpack·room
m0_495496414 小时前
C#怎么操作音频文件 C#如何用NAudio播放录制和处理WAV MP3音频文件【工具】
jvm·数据库·python
dFObBIMmai5 小时前
CSS如何检测页面浮动元素位置_使用审查工具与clear
jvm·数据库·python
qq_460978405 小时前
实现 Svelte 中基于数组索引的 details 元素单开单关交互
jvm·数据库·python
TO_ZRG5 小时前
Android WorkManager 完全入门指南
android
这个DBA有点耶5 小时前
3步抓出慢SQL,别等半夜被叫醒😴
数据库·代码规范
dfdfadffa5 小时前
SQL窗口函数如何优化嵌套子查询_提升执行效率
jvm·数据库·python