【MySQL】:复合查询

准备三张表

在这里插入图片描述

emp表

在这里插入图片描述

dept表

在这里插入图片描述

salgrade表

在这里插入图片描述

一.多表查询

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

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

首先什么是笛卡尔积

在这里插入图片描述

简而言之就是对多张表进行组合排列。

接着进行联合查询

在所有组合排列里选出合法的数据(员工的部门号与该部门相对应)

在这里插入图片描述

二.自连接

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

注意因为表名原因,所以在进行笛卡尔积时需要进行重命名避免名字重复

在这里插入图片描述

一个例子

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

由于领导也是员工,也在emp表里,所以我们一般的查找顺序是先在emp表里找到员工FORD,再找到对应的领导编号。接着再用该编号又在emp表里找到领导,把领导的信息筛选出来。

我们可以让emp和emp进行笛卡尔积(组合,两张表拼在一起),然后再从所有组合里找出符合条件的。

在这里插入图片描述

三.子查询

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

1.单行子查询

返回一行记录的子查询。

显示SMITH同一部门的员工

首先找到SMITH所在的部门,再查找该部门员工的信息。

在这里插入图片描述

2.多行子查询

返回多行记录的子查询.

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

in关键字表示在某个集合之中。10号部门的工作岗位有多个,所以是一个集合,我们只需要找到其他员工的工作岗位与10号部门集合中的任意一个相匹配,就将其筛选出来。

所以,先找出10号部门的工作岗位集合,在找与之相匹配的员工。

在这里插入图片描述

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

all关键字代表所有。这里要找工资比30号部门的所有员工工资都高,可以使用all关键字。(当然也可以用max).

先找到30号部门所有员工的工资,再筛选出工资更高的员工。

在这里插入图片描述

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

any关键字代表任意一个。(当然这里也可以使用min)

在这里插入图片描述

3.多列子查询

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

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

在这里插入图片描述

4.在from语句里使用子查询

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

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

我们可以把各个部门的平均工资看作临时表(注意这个表需要取别名),然后再从这个表和emp表里查询需要的信息。

在这里插入图片描述

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

先找到每个部门的最高工资和部门号形成临时表,再在临时表和emp表里找需要的信息。

在这里插入图片描述

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

把部门号和部门人数形成临时表,与dept表一起再进行信息查询。

在这里插入图片描述

5.合并查询

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

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

去重

在这里插入图片描述

不去重

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咸蛋挞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值