目錄
一、多表查詢
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;