1 . 联合查询 union ,union all
联合查询就是把多次查询的结果和并起来,形成一个新的查询结果集 。
注意:
-
对于联合查询的多张表的列数必须保持一致,即字段类型必须保持一致。
-
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 类
2 . 2 . 2根据子查询位置可分为 3 类
2 . 3 子查询的语法
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
例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) in (select 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 ;