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規則定的書寫方式。兩個說的是一碼事。