文章目录
- 一、多表查询
- 二、自连接
- 三、子查询
- 1.单行子查询
- 2.多行子查询
- 3.多列子查询
- 4.在 from 子句中使用子查询
- 5.合并查询
一、多表查询
在实际开发中,数据往往来自不同的表,所以需要多表查询。
对多张表做笛卡尔积,实际上就是多张表的所有记录的排列组合。
比如:对两张表做笛卡尔积,就是从第一张表中取出第一条记录,和第二张表的所有记录进行组合,然后从第一张表中取出第二条记录,和第二张表的所有记录进行组合,依此类推,最终得到的就是两张表的笛卡尔积。
多表查询,可以理解为单表查询。
select 查询出来的记录,都可理解为一张表。
现在用三张表 emp、dept、salgrade 来演示如何进行多表查询。
显示雇员名、雇员工资以及所在部门的名字。
显示部门号为 10 的部门名,员工名和工资。
显示各个员工的姓名,工资,及工资级别。
二、自连接
对相同的表做笛卡尔积。
由于自连接是对同一张表做笛卡尔积,所以需要至少给一张表取别名,否则无法区分这两张表中的列。
显示员工 FORD 的上级领导的编号和姓名。
法一:使用子查询。
法二:使用多表查询。
三、子查询
子查询是指嵌入在其他 SQL 语句中的 select 语句,也叫嵌套查询。
1.单行子查询
返回一行记录的子查询。
显示 SMITH 同一部门的员工。
2.多行子查询
返回多行记录的子查询。
- in 关键字:
查询和 10 号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含 10 自己的。
- all 关键字:
显示工资比部门 30 的所有员工的工资高的员工的姓名、工资和部门号。
- any关键字:
显示工资比部门 30 的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)。
3.多列子查询
单行子查询是指只返回单列单行数据的子查询;多行子查询是指返回单列多行数据的子查询。它们都是针对单列而言的。
而多列子查询则是指返回多列数据的子查询。
查询和 SMITH 的部门和岗位完全相同的所有雇员,不含 SMITH 本人。
4.在 from 子句中使用子查询
若子查询语句出现在 from 子句中,把这个子查询当做一个临时表即可。
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资。
思路:需要先获取各个部门的平均工资,并将其看作临时表。
查找每个部门工资最高的人的姓名、工资、部门、最高工资。
显示每个部门的信息(部门名,编号,地址)和人员数量。
法一:使用子查询。法二:使用多表查询。
5.合并查询
为了合并多个 select 的执行结果,可以使用集合操作符 union 和 union all 。
- union:用于取得两个结果集的并集(会自动去掉结果集中的重复行)。
- union all:用于取得两个结果集的并集(不会去掉结果集中的重复行)。
将工资大于 2500 或职位是 MANAGER 的人找出来。
法一:使用 or 。
法二:使用 union 。
使用 union all 不会去重。