目录
复合查询
多表查询
自连接
子查询
单行子查询
多行子查询
多列子查询
在from子句中使用子查询
合并查询
union all
union
复合查询
之前我们对于MySQL表的查询都是基于单表进行操作的,这远远不够。复合查询就是对多表进行查询的,在实际应用中也比较多。
我们准备三张表来学习复合查询:
部门表:
员工表:
薪资等级表:
多表查询
对多表进行查询时,我们往往需要对多表进行笛卡尔积操作,什么是笛卡尔积呢?笛卡尔积就是把一张表中的每一项和另一张表中的每一项组合形成一张新的大表。
如何进行笛卡尔积呢?很简单,只需要在from的后面将要进行笛卡尔积的表分开即可,我们将dept表和slagrade表进行笛卡尔积:
使用示例
示例一:显示雇员名、雇员工资以及所在部门的名字。
- 因为上面的数据来自emp和dept表,因此要多表联合查询。
示例二:显示部门号为10的部门名,员工名和工资
示例三:显示各个员工的姓名,工资,及工资级别
自连接
一张表可以和其他表进行笛卡尔积,那么一张表也可以和自己进行笛卡尔积,这就叫做自连接。
示例一:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)
子查询
子查询时指嵌入在其他SQL语句中的select子句,也叫做嵌套查询。
单行子查询
返回单行记录的子查询就叫做单行子查询。
示例一:显示SMITH同一部门的员工
多行子查询
返回多行记录的子查询就叫做多行子查询。
示例一:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自
己的。
示例二:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号。
示例三:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门
的员工)
多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
示例一:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
在from子句中使用子查询
子查询语句出现在from子句中,也就是把一个子查询的结果当做一个临时表使用。
示例一:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
示例二:查找每个部门工资最高的人的姓名、工资、部门、最高工资
示例三:显示每个部门的信息(部门名,编号,地址)和人员数量
合并查询
在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。
union all
- 该操作符用于取得两个结果集的并集。
- 当使用该操作符时,不会去掉结果集中的重复行。
使用示例:将工资大于2500或职位是MANAGER的人找出来。
union
- 该操作符用于取得两个结果集的并集。
- 当使用该操作符时,会自动去掉结果集中的重复行。
使用示例:将工资大于2500或职位是MANAGER的人找出来。