MYSQL复合查询(多表查询、自连接、子查询、union、union all)

文章目录


前言

我们依旧采用之前文章中出现的表来进行演示MYSQL的复合查询:

部门表dept(部门编号,部门名,地点):

员工表emp(员工编号,名字,职位,领导编号,入职时间,薪水,奖金,所属部门)

薪水等级表salgrade(等级,最低工资,最高工资)


一、多表查询

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

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

我们发现查询两张表时,会对两张表进行笛卡尔积,但这些信息并不全是匹配的:

这个时候我们只要emp表中的deptno 等于 dept表中的deptno字段的记录:

我们再来看两个例子:

显示部门号为10的部门名,员工名和工资

显示各个员工的姓名,工资,及工资级别

所以多表查询的特点就是对多张表的笛卡尔积进行条件筛选,先筛选出有效的信息,再按照需求在有效的信息里进行筛选。

二、自连接

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

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

对于这个需求,我们可以进行子查询:

我们还可以使用多表查询(自查询):

这里的多表查询是对同一张表命名两次,这样做条件匹配时思路会更加清楚!

三、子查询

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

这个例子就是子查询:显示SMITH同一部门的员工

我们在子查询中还可以用到几个关键字:

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

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

  3. any
    显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号

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

我们还可以在from子句中使用子查询。

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

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

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

四、合并查询

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

1.union

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

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

2.union all

相关推荐
TDengine (老段)几秒前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
大气层煮月亮39 分钟前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang1 小时前
达梦数据库的命名空间
数据库·oracle
三三木木七1 小时前
mysql拒绝连接
数据库·mysql
蹦跶的小羊羔1 小时前
sql数据库语法
数据库·sql
唐古乌梁海2 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql
我变秃了也没变强2 小时前
pgsql配置密码复杂度策略
数据库·postgresql
PawSQL2 小时前
企业级SQL审核工具PawSQL介绍(1) - 六大核心能力
数据库·sql·oracle
幼稚园的山代王2 小时前
NoSQL介绍
数据库·nosql
꒰ঌ 安卓开发໒꒱2 小时前
Mysql 坏表修复
android·mysql·adb