1. 程式人生 > 實用技巧 >sql多表查詢學習

sql多表查詢學習

我們先建立一個表 EMP(15行):

如果想查詢所有資料,很簡單

select * from EMP;

這樣就能查詢到EMP的所有資料

在瞭解多表查詢之前 我們應該先複習一下數學中笛卡爾積的概念

比如一個集合有(1,2,3)三個元素 另一個集合有(4,5,6)三個元素

他們的笛卡爾積 其實有3*3 9種情況


連線查詢分為 內連線 ,外連線,交叉連線

內連線

內連線分顯式和隱式 關鍵字是inner join 其實這個inner可以不寫

隱式的內連線就是笛卡爾積

這裡 建立一個DEPT表(4行)

我們想看到這兩個表所有的東西,所以要求它們的笛卡爾積 也就是隱式的內連線

隱式的內連線用cross join 關鍵字

select *from emp cross join dept;

這兩個表就會結合到一起:

很明顯有15*4 = 60種情況

顯式內連線

之前的資料太重疊了 我們實際中不想這樣

這裡先介紹一種等值連線

原理就是先做笛卡爾積 然後再根據條件篩選,條件是:欄位的值要相同,才能篩選 也就是說其實兩個欄位的名字可以不同

等值連線 有一個自然連線 自然連線就是根據名稱相同的欄位進行連線 關鍵字:natural join

我們注意到 emp和dpt這兩個表有一個相同欄位 :DEPTNO

我們直接做一個 natural join

select *from emp natural join dept;

執行:

此時就是15 行 這個自然連線其實就能幫到我們很多忙了

如果欄位名稱不相同呢:

用這種語法:

表一 inner join 表二 on 篩選條件

我們可以這麼寫:

select * from emp e inner join dept p on e.deptno = p.deptno

結果和上一個natural join 是類似的 但是有一點不同:

這個重複列 並沒有消去

其實欄位的名稱相同也可以:

表一 inner join 表二 using (欄位名)
select * from emp inner join dept using (deptno);

結果和natural join 一樣

下面再介紹一種不等值連線:

select * from emp e inner join dept p on e.sal between 1000 and 1500;

還有一種自連線

select * from emp a inner join emp b on a.empno = b.mgr

外連線:

我們研究內連線的時候都是研究的等值 不等值的情況就會被忽略 外連線還是比較重要的

外連線分為左連線和右連線

我們先改一下表emp

改為50 很顯然 關鍵字“馬雲”和另一個表的對應是不存在的

我們用內連線查一下

select * from emp e inner join dept p on e.deptno = p.deptno

這個表成為了14行

我們想用emp作為主表 將那行沒有篩選到的資料加入進來

所以下面介紹左外連線:

表一 leftouterjoin 表二 on 篩選條件

這個outer 也可以省

我們來跑一下

select * from emp e left join dept p on e.deptno = p.deptno

就會發現 這個沒有被篩選的不等條件 關鍵字“馬雲”這一行被查了出來

左外連線是以左表為主 那麼右外連線就是以右表為主唄

滿外連線:整合了左外連線和右外連結 關鍵字full join

就先介紹到這裡