数据库 11 -- 多表查询(2)

120 阅读2分钟

1 . 联合查询 union ,union all

联合查询就是把多次查询的结果和并起来,形成一个新的查询结果集 。

0617.png

注意:

  • 对于联合查询的多张表的列数必须保持一致,即字段类型必须保持一致。

  • union all 会把全部的数据直接合并在一起

  • union 会将全部的数据合并在一起 ,并对合并后的数据进行去重!!

例: 查询薪资低于5000的员工 ,和年龄大于58岁的员工全部查询出来

select * from emp where salary < 5000 ;
union all
select * from emp where age > 50 ;

2 . 子查询

2 . 1 子查询的定义

如果 SQL 语句中嵌套 SELECT 语句,则称为嵌套查询,又叫做子查询 。

2 . 2 子查询的分类

2 . 2 . 1根据子查询结果不同,可分为 4 类

0619.png

2 . 2 . 2根据子查询位置可分为 3 类

0621.png 2 . 3 子查询的语法

0620.png

2 . 4 标量子查询

返回的结果是单个值(数字、字符串、日期等),最简单的形式。

常用操作符: = < > <= >=

例1: 查询"销售部"的所有员工信息

// 先查询 "销售部" 的部门 ID
select id from dept where name = '销售部' ;
// 再根据部门ID查询员工信息
select * from emp where dept_id = 4 ;

// 可以将两条语句合在一起
select * from emp where dept_id = (select id from dept where name = '销售部') ;

例2: 查询 在方东白 的入职日期之后入职的员工信息

select * from emp where entrydate > (select entrydate from emp where name = '方东白') ;

2 . 5 列子查询

返回的结果是一列(多行)

常用操作符: IN 、NOT IN 、ANY 、SOME 、 ALL

0622.png

例1: 查询"销售部" 和 "市场部"的所有员工信息

select * from emp where  dept_id **in** ( select id from dept where name = '销售部' or name = '市场部') ;

**例2:**查询比财务部所有员工的工资都高的员工信息

select * from emp where salary > **all** (select salary from emp where dept_id = (select id from dept where name = '财务部')) ;

2 . 6 行子查询

返回的结果是一行(可以是多列)

常见操作符: = 、< > 、 in 、not in

例: 查询与 张无忌 的薪资及领导相同的公司

select * from emp where (salary ,managerid)= (select salary , managerid from emp where name = '张无忌') ;
// 上面括号的写法意为必须分别对照满足

2 . 7 表子查询

返回的结果是多行多列

常见操作符 : in

例1: 查询与 马嘉祺 ,严浩翔的职位和薪资相同的员工信息

select * from emp where (job ,salary) inselect job ,salary from emp where name = '严浩翔' or name = '马嘉祺') ;

// 跟行子查询的区别是 ,行子查询用的是 = ,而表子查询用的是 in

例2: 查询入职日期是 '2006-01-01'之后的员工信息,及其部门信息

// 先查询'2006-01-01'之后的员工信息(返回的是一张表) ,再查询其对应的部门信息
select e.* , d.* from (select * from emp where entrydate > '2006-01-01') e left outer join dept d on e.dept_id = d.id ;