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作為主表 將那行沒有篩選到的資料加入進來
所以下面介紹左外連線:
表一 left (outer) join 表二 on 篩選條件
這個outer 也可以省
我們來跑一下
select * from emp e left join dept p on e.deptno = p.deptno
就會發現 這個沒有被篩選的不等條件 關鍵字“馬雲”這一行被查了出來
左外連線是以左表為主 那麼右外連線就是以右表為主唄
滿外連線:整合了左外連線和右外連結 關鍵字full join
就先介紹到這裡