Join操作基本:外連線、自然連線、內連線
Join操作基本分為3大類:外連線(細分為:左連線、右連線、全連線)、自然連線、內連線
Join操作的共性:第一步均為將所有參與操作的表進行了一個笛卡兒積,然後才依據各連線
條件進行記錄的篩選
SQL> select * from employees;
NAME |
DEPARTMENT_ID |
SALARY |
Getz |
10 |
3000 |
Davis |
20 |
1500 |
King |
20 |
2200 |
Davis |
30 |
5000 |
Kochhar |
|
5000 |
SQL> select * from departments;
DEPARTMENT_ID |
DEPARTMENT_NAME |
10 |
Sales |
20 |
Marketing |
30 |
Accounts |
40 |
Administration |
------------------Left outer join----------------
SQL> select * from employees e left outer join departments d on e.department_id=d.department_id;
附加:Oracle9i以前版本中左連線的寫法如下:
SQL> select * from employees e ,departments d on e.department_id=d.department_id(+);
---------------------------Right outer join------------------------
SQL> select * from employees right outer join departments using(department_id);
附加:Oracle9i以前版本中左連線的寫法如下:
SQL> select * from employees e ,departments d where e.department_id(+)=d.department_id;
--------------------------------Full join----------------------------
SQL> select * from employees full join departments using(department_id);
說明:[1]外連線必須使用on或using子句提供相應的連線條件
[2]不能為using子句中所列舉的列指定表別名,即使在group by和select子句中也是如此
[3]外連線規則:左連右補,右連左補,全連左右合併
如:對錶departments表進行右連線時,在兩表完成笛卡兒積後再依據連線條件 using(department_id)來篩選兩表中department_id值相同的記錄,但對DEPARTMENT_ID=40
employees表中沒有與之匹配的記錄,按常理此DEPARTMENT_ID=40所對應的記錄將被拋
棄,但就是為了保全連線表(departments表)中的所有記錄就必須在employees表中虛擬出
一條與之匹配的記錄來保全連線表的所有記錄,當然這條虛擬的記錄顯示時值全為null
--------------------------Natural join-----------------------------
SQL> select * from employees natural join departments;
說明:自然連線是通過對參與表關係中所有同名的屬性對取等(即相等比較)來完成的,故無須自己新增連線條件
與外連線的區別在於對於無法匹配的記錄外連線會虛擬一條與之匹配的記錄來保全連線表中的所有記錄,但自然連線不會
----------------------Inner join----------------
SQL> select * from employees inner join departments using(department_id);
說明:內連線與自然連線基本相同,不同之處在於自然連線只能是同名屬性的等值連線,而內連線可以使用using或on子句來指定連線條件,連線條件中指出某兩欄位相等(可以不同名)。
-------------------------------------------------------------------------------------------------------------------
連線的概念:
連線分為條件連線、等值連線和自然連線三種。
1、條件連線就是在多個表的笛卡爾積中選取滿足條件的行的連線,例如 select * from A,B where A.a > A.b 之類的有條件的查詢。
2、等值連線就是特殊的條件連線,當條件為某欄位=某欄位時,即為等值連線。如SELECT ename,sal,dname FROM emp,dept WHERE emp.deptno=dept.deptno;
3、自然連線是一種特殊的等值連線,他要求多個表有相同的屬性欄位,然後條件為相同的屬性欄位值相等,最後再將表中重複的屬性欄位去掉,即為自然連線。如A中a,b,c欄位,B中有c,d欄位,則select * from A natural join B 相當於 select A.a,A.b,A.c,B.d from A.c = B.c 。
內連線與等值連線的區別:
內連線:兩個表(或連線)中某一資料項相等的連線稱為內連線。等值連線一般用where字句設定條件,內連線一般用on字句設定條件,但內連線與等值連線效果是相同的。
內連線與等值連線其實是一回事情(等效)。
經常有人會問到select a.id,b.name from a,b where a.id=b.pid 與
select a.id,b.name from a inner join b on a.id=b.pid 有什麼區別,哪個效率更高一些。
實際上一回事情了。只是內連線是由SQL 1999規則定的書寫方式。兩個說的是一碼事。
本文轉自:https://www.cnblogs.com/huangfr/archive/2012/06/20/2555530.html