> 文章列表 > MySQL复合查询

MySQL复合查询

MySQL复合查询

文章目录

  • 一、多表查询
  • 二、自连接
  • 三、子查询
    • 1.单行子查询
    • 2.多行子查询
    • 3.多列子查询
    • 4.在 from 子句中使用子查询
    • 5.合并查询

一、多表查询

在实际开发中,数据往往来自不同的表,所以需要多表查询。

对多张表做笛卡尔积,实际上就是多张表的所有记录的排列组合

比如:对两张表做笛卡尔积,就是从第一张表中取出第一条记录,和第二张表的所有记录进行组合,然后从第一张表中取出第二条记录,和第二张表的所有记录进行组合,依此类推,最终得到的就是两张表的笛卡尔积。在这里插入图片描述

多表查询,可以理解为单表查询

select 查询出来的记录,都可理解为一张表

现在用三张表 emp、dept、salgrade 来演示如何进行多表查询。

显示雇员名、雇员工资以及所在部门的名字。
MySQL复合查询

显示部门号为 10 的部门名,员工名和工资。
MySQL复合查询

显示各个员工的姓名,工资,及工资级别。
MySQL复合查询

二、自连接

对相同的表做笛卡尔积。

由于自连接是对同一张表做笛卡尔积,所以需要至少给一张表取别名,否则无法区分这两张表中的列。

显示员工 FORD 的上级领导的编号和姓名。

法一:使用子查询。MySQL复合查询
法二:使用多表查询。MySQL复合查询

三、子查询

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

1.单行子查询

返回一行记录的子查询。

显示 SMITH 同一部门的员工。
MySQL复合查询

2.多行子查询

返回多行记录的子查询。

  • in 关键字:

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

  • all 关键字:

显示工资比部门 30 的所有员工的工资高的员工的姓名、工资和部门号。
MySQL复合查询

  • any关键字:

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

3.多列子查询

单行子查询是指只返回单列单行数据的子查询;多行子查询是指返回单列多行数据的子查询。它们都是针对单列而言的。

而多列子查询则是指返回多列数据的子查询。

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

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

若子查询语句出现在 from 子句中,把这个子查询当做一个临时表即可

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资。
思路:需要先获取各个部门的平均工资,并将其看作临时表。MySQL复合查询

查找每个部门工资最高的人的姓名、工资、部门、最高工资。
MySQL复合查询

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

法一:使用子查询。MySQL复合查询法二:使用多表查询。MySQL复合查询

5.合并查询

为了合并多个 select 的执行结果,可以使用集合操作符 union 和 union all 。

  • union:用于取得两个结果集的并集(自动去掉结果集中的重复行)。
  • union all:用于取得两个结果集的并集(不会去掉结果集中的重复行)。

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

法一:使用 or 。在这里插入图片描述
法二:使用 union 。MySQL复合查询

使用 union all 不会去重。
MySQL复合查询