MySQL的复合查询

在这里插入图片描述

1. 多表查询

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够。实际开发中往往数据来自不同的表,所以需要多表查询。我们还是用一个简单的公司管理系统,有三张表EMP、DEPT、SALGRADE来演示如何进行多表查询。

显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询。
在这里插入图片描述
可以看到雇员名、雇员工资在员工表,部门的名字在另外一张表。但是MySQL支持查询多张表。
在这里插入图片描述
它是从第一张表中选出第一条记录,和第二条表的所有记录进行组合。然后从第一张表中选出第二条记录,再和第二条表的所有记录进行组合,依此类推。
在这里插入图片描述
不加过滤条件,得到的结果称为笛卡尔积,它的本质其实就是数据的穷举。
因为是穷举,有许多的消息是没有意义的,在这个表中,部门号不一样的就没有意义,所以我们需要过滤掉。
在这里插入图片描述
在判断的时候,我们需要指明是哪张表的字段才能进行比较。下面我们再进行筛选:
在这里插入图片描述
多表查询的思路:
1.先确定和哪些表有关
2.把多张表转成一张表
3.根据要求进行比较过滤

显示各个员工的姓名,工资,及工资级别:
员工表在emp中,工作级别在salgrade表中:
在这里插入图片描述
因为薪水是在一个范围的,所以我们可以通过这个范围来过滤。

2. 自连接

自连接是指在同一张表连接查询。
在这里插入图片描述
我们直接自链接是不可以的,需要先给表重命名才能进行自链接。

显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号–empno):
在这里插入图片描述
我们要找一个员工上级领导的姓名,因为上级领导也是员工,所以他也在这个表里。
方法一:使用的子查询
在MySQL中select是支持嵌套的:
在这里插入图片描述
这是分两步的查询,我们也可以合在一起。
在这里插入图片描述

方法二:使用多表查询(自查询)
在这里插入图片描述
我们先把所有的结果算出来了,下面我们就开始进行筛选,如果表1里的mgr等于表2的empno就是有效的:
在这里插入图片描述

3. 子查询

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

3.1 单行子查询

返回一行记录的子查询
显示和SMITH员工同一部门的员工
在这里插入图片描述

3.2 多行单列子查询

返回多行记录的子查询
in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
首先,我们先把10号部门的工作岗位列举出来:
在这里插入图片描述
那么我们就需要找出其它部门和这几个岗位相同的,这里我们就需要使用关键字in:
在这里插入图片描述
in的意思是在这个范围中任何一个就被筛选出来。

最后我们需要把10号部门的给去掉:
在这里插入图片描述

all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
按照之前的方法:
在这里插入图片描述
我们先把30号部门的最高工资取出来,然后用其它部门的来进行比较。

用all关键字:
在这里插入图片描述
这是30号部门的所有人的工资。
在这里插入图片描述
any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
在这里插入图片描述

3.3 单行多列子查询

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

查询和SMITH员工的部门和岗位完全相同的所有雇员,不含SMITH本人
在这里插入图片描述
我们要查询工作和部门都是这个的员工。
在这里插入图片描述
最后我们需要把SMITH自己给去掉。
在这里插入图片描述

3.4 在from子句中使用子查询

我们知道多表查询,在from后面是可以跟多张表进行笛卡尔积的。
在这里插入图片描述
在前面我们可以把查询的结果看作成一张表,然后进行笛卡尔积:
在这里插入图片描述
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
在这里插入图片描述
我们先把每个部门的平均工资算出来。然后和我们的员工进行笛卡尔积。
在这里插入图片描述
最后根据这个表来筛选:
在这里插入图片描述
查找每个部门工资最高的人的姓名、工资、部门、最高工资
在这里插入图片描述
首先,我们把每个部门的最高工资查出来。
在这里插入图片描述
然后我们和员工表进行笛卡尔积,把有效数据筛选出来。
在这里插入图片描述

4. 合并查询

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

4.1 union all

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

将工资大于25000或职位是MANAGER的人找出来
在这里插入图片描述

4.2 union

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

将工资大于2500或职位是MANAGER的人找出来
在这里插入图片描述
这里去掉了重复记录。

5. 内连接

表的连接分为内连和外连。内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

正规的语法:
在这里插入图片描述
显示SMITH的名字和部门名称:

用前面的写法:
在这里插入图片描述
用标准的内连接写法:
在这里插入图片描述

6. 外连接

外连接分为左外连接和右外连接。

6.1 左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接
在这里插入图片描述
举个例子:
我们先建两张表:
在这里插入图片描述
我们先创建一个学生表,然后插入4条数据。
在这里插入图片描述
我们在成绩表也插入一些数据,但是两个表对应不上。

查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
在这里插入图片描述
当左边表和右边表没有匹配时,也会显示左边表的数据。

6.2 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接
在这里插入图片描述
对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值