MySQL之复合查询
- 1.基本查询回顾
- 2.多表查询
- 3.自连接
- 4.子查询
-
- [4.1. 单行子查询](#4.1. 单行子查询)
- 4.2.多行子查询
- [4.3. 多列子查询](#4.3. 多列子查询)
- 4.4.在from子句中使用子查询
- 5.合并查询
🌟🌟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的安装包可以私信我,你们的支持是博主坚持创作的动力!💪💪
