1、概述
2、連接查詢原理及笛卡爾積現象
3、內連接
---3.1等值連接
---3.2非等值連接
---3.3自連接
4、外連接
---4.1概述
---4.2例子
5、三張表以上的連接查詢
---5.1大致語法
---5.2例子
概述
1、在實際開發中,大部分的情況下都不是從單表中查詢數據,一般都是多張表聯合查詢取出最終的結果。一個業務都會對應多張表,比如:學生和班級,起碼兩張表。(避免產生數據的冗余)
2、連接查詢的分類
①根據語法出現的年代來划分:
SQL92(一些老的DBA可能還在使用這種語法。)
SQL99(比較新的語法)
②根據表的連接方式來划分:
內連接:等值連接、非等值連接、自連接。
外連接:左外連接(左連接)、右外連接(右連接)、全連接。
連接查詢原理及笛卡爾積現象
(以下屬於SQL92)
- 笛卡爾積現象
1、在表的連接查詢方面有一種現象被稱為:笛卡爾積現象。
2、例子:找出每一個員工的部門名稱,要求顯示員工名和部門名。
emp表:
dept表:
SELECT e.ENAME, d.dname
FROM emp e, dept d;
(從e表中拿一個ENAME與d表中的所有dname一一匹配)
3、查詢出來的結果有56條(14*4)。當兩張表進行連接查詢的時候,沒有任何條件進行限制,最終的查詢結果條數是兩張表記錄條數的乘積。這就是笛卡爾積現象。
4、關於表的別名的優點:執行效率高;可讀性好。
- 如何避免笛卡爾積現象?
加條件進行過濾,還有會查56條,但只會顯示有效記錄。
SELECT e.ename, d.dname
FROM emp e, dept d
where e.DEPTNO = d.DEPTNO;
內連接
等值連接
- 內連接之等值連接
最大的特點是:條件是等量關系。 - SQL99(最常用)
SELECT e.ename, d.dname
FROM emp e
join dept d
on e.DEPTNO = d.DEPTNO;
1、語法:
...
A
(inner) join
B
on
連接條件
where
...
inner可省略,加上可讀性更強
2、SQL99語法結構更清晰一些,表的連接條件和后來的where條件分離了。
非等值連接
- 內連接之非等值連接
最大的特點是:連接條件中的關系是非等量關系。 - 例子:
找出每個員工的工資等級,要求顯示員工名、工資、工資等級。
SELECT e.ename, e.sal, s.grade
FROM
emp as e
inner join
salgrade as s
on
e.sal between losal and hisal
order by grade;
自連接
- 自連接
自連接就是一張表看做兩張表,自己連接自己。 - 例子:
找出每個員工的上級領導,要求顯示員工名和對應的領導名。
emp表:
關鍵:
一張表起兩個別名,當做兩張表用。
員工的領導編號 = 領導的員工編號。
SELECT a.ename as emp,
b.ename as mgr
from emp as a
inner join
emp as b
on a.mgr = b.empno;
外連接
概述
- 內連接和外連接的區別
1、內連接:
假設A和B表進行連接,使用內連接的話,凡是A表和B表能夠匹配上的記錄查詢出來,這就是內連接。AB兩張表沒有主副之分,兩張表是平等的。
2、外連接:
假設A和B表進行連接,使用外連接的話, AB兩張表中有一張表是主表,一張表是副表,主要查詢主表中的數據,捎帶着查詢副表。當副表中的數據沒有和主表中的數據匹配上,副表自動模擬出NULL與之匹配。
3、外連接的分類:
左外連接(左連接):表示左邊的這張表是主表。
右外連接(右連接):表示右邊的這張表是主表。
4、左連接有右連接的寫法,右連接也會有對應的左連接的寫法。
5、外連接最重要的特點是:主表的數據無條件的全部查詢出來。
例子
1、找出每個員工的上級領導,要求顯示員工名和對應的領導名。
- 左連接:
SELECT a.ename as emp,
b.ename as mgr
from emp as a
left outer join
emp as b
on a.mgr = b.empno;
outer可以省略
在上面內連接的基礎上將inner換為left (outer),emp as a表示左邊,emp as b表示右邊;因為是left,所以左邊的a為主表。b為副表。
- 右連接
SELECT a.ename as emp,
b.ename as mgr
from emp as b
right outer join
emp as a
on a.mgr = b.empno;
outer可以省略
這時emp as b表示左邊,emp as a表示右邊;right表示右邊的a為主表。b為副表。
上述結果中雖然KING沒有上級,但是有null與之匹配。(內連接就沒有)
2、找出哪個部門沒有員工?
SELECT dept.*
FROM emp
right outer join
dept
on
emp.deptno = dept.deptno
where
emp.empno is null;
三張表以上的連接查詢
大致語法
...
A
inner join
B
on
...
inner join
C
on
...
表示:A表和B表先進行表連接,連接之后A表繼續和c表進行連接。
例子
找出每一個員工的部門名稱以及工資等級、領導。
SELECT e.ename emp, d.dname, s.grade, ee.ename mgr
FROM emp e
inner join dept d
on e.deptno=d.deptno
inner join salgrade s
on e.sal between s.losal and s.hisal
left join emp ee
on e.mgr=ee.empno;