學習目標:
?使用等值和不等值連接在SELECT語句中查詢多個表中的數據。 ?使用自連接。 使用外連接查詢不滿足連接條件的數據
Oracle連接
等值連接:
使用連接在多個表中查詢數據。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1= table2.column2;
?在 WHERE 子句中寫入連接條件。 ?在表中有相同列時,在列名之前加上表名前綴
內連接和外連接:
內連接: 合並具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行 外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行,這種連接稱為左(或右)外連接。
沒有匹配的行時, 結果表中相應的列為空(NULL). 外連接的 WHERE子句條件類似於內部連接, 但連接條件中沒有匹配行的表的列後面要加外連接運算符,即用圓括號括起來的加號(+).
--左外連接
select e.employee_id,e.last_name,d.department_name
from employees e,departments d
where e.department_id = d.department_id(+)
--右外連接
select e.employee_id,e.last_name,d.department_name
from employees e,departments d
where e.department_id(+) = d.department_id
使用SQL: 1999語法連接:
使用連接從多個表中查詢數據:
SELECT table1.column, table2.column
FROM table1
[CROSS JOINtable2] |
[NATURAL JOINtable2] |
[JOINtable2 USING(column_name)] |
[JOINtable2 ON(table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOINtable2 ON(table1.column_name =table2.column_name)];
自然連接:
?NATURALJOIN 子句,會以兩個表中具有相同名字的列為條件創建等值連接。
?在表中查詢滿足等值條件的數據。
如果只是列名相同而數據類型不同,則會產生錯誤。
select e.employee_id,e.last_name,d.department_name
from employees e natural join departments d
使用USING子句創建連接:
?在NATURAL JOIN 子句創建等值連接時,可以使用 USING子句指定等值連接中需要用到的列。 ?使用USING 可以在有多個列滿足條件時進行選擇。
JOIN和USING子句經常同時使用。
select e.employee_id,e.last_name,d.department_name
from employees e join departments d
using(department_id)
這種方法有局限性:如果兩個表中的列名(一個叫department_id,另外一個叫id)不一樣,這個方法就失效了。
使用ON子句創建連接(常用):
?自然連接中是以具有相同名字的列為連接條件的。 ?可以使用 ON子句指定額外的連接條件。 ?這個連接條件是與其它條件分開的。 ON子句使語句具有更高的易讀性
select e.employee_id,e.last_name,d.department_name
from employees e
join departments d
on e.department_id = d.department_id
這個和等值連接是很相似的
左外連接
select e.employee_id,e.last_name,d.department_name
from employees e
left outer join departments d
on e.department_id = d.department_id
select e.employee_id,e.last_name,d.department_name
滿外連接
select e.employee_id,e.last_name,d.department_name
from employees e
full outer join departments d
on e.department_id = d.department_id