MySQL之复合查询

张开发
2026/5/11 23:29:30 15 分钟阅读

分享文章

MySQL之复合查询
MySQL之复合查询1.基本查询回顾2.多表查询3.自连接4.子查询4.1. 单行子查询4.2.多行子查询4.3. 多列子查询4.4.在from子句中使用子查询5.合并查询hello各位读者大大们你们好呀系列专栏【MySQL的学习】本篇内容基本查询回顾多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询⬆⬆⬆⬆上一篇MySQL之表的增删查改作者简介轩情吖请多多指教( •̀֊•́ ) ̖́-1.基本查询回顾我们来看几个例子下面的三张图是这篇文章中必备的表格内容太大了后面不在一一展示查询工资高于500或岗位为MANAGER的雇员同时还要满足他们的姓名首字母为大写的J按照部门号升序而雇员的工资降序排序使用年薪进行降序排序年薪每月工资*12奖金即sal *12comm显示工资最高的员工的名字和工作岗位我们这边使用了两种方式进行查找但是第一种方式需要两句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的执行结果可以使用集合操作符 unionunion allunion该操作符用于取得两个结果集的并集。当使用该操作符时会自动去掉结果集中的重复行。union all该操作符用于取得两个结果集的并集。当使用该操作符时不会去掉结果集中的重复行。将工资大于2500或职位是MANAGER的人找出来MySQL之复合查询大概就讲到这里啦博主后续会继续更新更多Qt的相关知识干货满满如果觉得博主写的还不错的话希望各位小伙伴不要吝啬手中的三连哦如有小伙伴需要Qt的安装包可以私信我你们的支持是博主坚持创作的动力

更多文章