目录
一、多表查询
1、定义:通过不同表中具有相同意义的关键字段,将多个表进行连接,查询不同表中的字段信息。
2、连接方式:
- 内连接([inner] join):A表和B表重合(相交)部分
select 字段1[,…] from 表1[ inner] join 表2 on 表1.key=表2.key;
- 左连接(left join):写在join前面的是左表,除了返回满足连接条件的行,还会返回左表所有行。
select 字段1[,…] from 表1 left join 表2 on 表1.key=表2.key;
- 右连接(right join):写在join后面的是右表,除了返回满足连接条件的行,还会返回右表所有行。
select 字段1[,…] from 表1 right join 表2 on 表1.key=表2.key;
- 全连接(full join):A表和B表连接,返回所有行,就会产生笛卡尔积
Select 字段[……] from表1 full join 表2on 表1.key=表2.key;
Select 字段[……] from表1,表2;
【注意】
- 不等值连接(类似excel的vlookup函数模糊匹配):
Select * from表1
left join表2
on表1.key between表2.列1 and表2.列2;
【例】用表1员工工资详细表匹配表2的工资等级表
Select a.*,b.工资等级 from员工工资详细a
Left join工资等级b
on a.工资between b.最低工资and b.最高工资;
二、联合查询
- 定义:把多条select语句的查询结果合并为一个结果集。被合并的结果集的列数、顺序和数据类型必须完全一致。
- union去重:select 字段1[,字段2,…] from 表名 union select 字段1[,字段2,…] from 表名;
- union all不去重: select 字段1[,字段2,…] from 表名 union all select 字段1[,字段2,…] from 表名;
【注意】
- 是两个表重合部分union all 不会去重,直接整合到一个表中。
三、子查询
1、定义:在查询语句中包含另一个或多个完整的查询语句。通常可出现在select、where、having、from关键词后。
2、子查询分类:
- 标量子查询:返回一个数据(单行单列)
- 行子查询:返回一行数据(单行多列)
- 列子查询:返回一列数据(多行单列)
- 表子查询:返回一张表(多行多列)
3、子查询出现的位置:
- select子句中:子查询只能是标量子查询、列子查询(只能单列);
- where/having子句中:可以是标量子查询、行子查询、列子查询、表子查询;
- from子句中:可以是标量子查询、行子查询、列子查询、表子查询。
【列】
1、select deptno, count(1)/(select count(1) from emp)
from emp
group by deptno;
- 标量子查询:(单行单列,括号里的返回的是一个数据)
Select * from emp
Where sal > (select avg(sal) from emp);
- 行子查询:(单行多列,括号里的返回的是一行数据)
Select empno, ename, job, deptno
from emp
Where (deptno,job)= (select deptno, job from emp where ename='smith') and ename !='smith';
- 列子查询(多行单列)表子查询(多行多列): 必须用到in、any、all操作符,可将其看作矩阵。单行多列行子查询也可用到in、any、all,只是用比较运算符更简便。
Select empno, ename, job, deptno from emp
Where (deptno,job) in (select deptno, job from emp where ename='smith') and ename!='smith';
4、子查询操作符
- [not]in:等于或不等于其中一个
- any:比数据集中任意(其中)一组数据要大或小
- all:比数据集中所有一组数据要大或小
【理解】
- in是等于或不等于
- any和all是可对比大小的
- any是任意其中一个,all是所有
【例子】
- 查询基本工资高于30号部门任意员工的员工信息(即比30部门最低工资员工工资高)
Select * from emp
Where sal > any(select sal from emp where deptno=30)
and deptno!=30 order by deptno, saldesc;
- 查询基本工资高于30号部门所有员工的员工信息(即比30部门最高工资员工工资高)
Select * from emp
Where sal > all (select sal from emp where deptno=30)
and deptno!=30 order by deptno,saldesc;