第四章 多表查詢
1.笛卡爾集
笛卡爾集會在下面條件下產生:
省略連接條件
連接條件無效
所有表中的所有行互相連接
爲了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。
2.Oracle 連接
使用連接在多個表中查詢數據。
select table1.column,table2.column
from table1,table2
where table1.column = table2.column
在 WHERE 子句中寫入連接條件。
在表中有相同列時,在列名之前加上表名前綴
2.1等值連接:
多個連接條件與 AND 操作符
區分重複的列名,使用表名前綴在多個表中區分相同的列,在不同表中具有相同列名的列可以用表的別名加以區分。
表的別名:
使用別名可以簡化查詢。
使用表名前綴可以提高執行效率。
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e , departments d
WHERE e.department_id = d.department_id;
連接多個表:連接 n個表,至少需要 n-1個連接條件。 例如:連接三個表,至少需要兩個連接條件。
2.2非等值連接:
SELECT e.last_name, e.salary, j.grade_level
FROM employees e, job_grades j
WHERE e.salary
BETWEEN j.lowest_sal AND j.highest_sal;
3.內連接和外連接:
內連接: 合併具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,這種連接稱爲左(或右) 外連接。沒有匹配的行時, 結果表中相應的列爲空(NULL). 外連接的 WHERE 子句條件類似於內部連接, 但連接條件中沒有匹配行的表的列後面要加外連接運算符, 即用圓括號括起來的加號(+).
外連接語法:
使用外連接可以查詢不滿足連接條件的數據。
外連接的符號是 (+)。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;//右外連接
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);//左外連接
自連接:
題目:查詢employees表,返回“Xxx works for Xxx”
SELECT worker.last_name || ' works for '
|| manager.last_name
FROM employees worker, employees manager
WHERE worker.manager_id = manager.employee_id ;
4.
叉集(瞭解):
使用CROSS JOIN 子句使連接的表產生叉集。
叉集和笛卡爾集是相同的。
SELECT last_name, department_name
FROM employees
CROSS JOIN departments ;
自然連接:
NATURAL JOIN 子句,會以兩個表中具有相同名字的列爲條件創建等值連接。
在表中查詢滿足等值條件的數據。
如果只是列名相同而數據類型不同,則會產生錯誤。
SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations ;
使用 USING 子句創建連接:
在NATURAL JOIN 子句創建等值連接時,可以使用 USING 子句指定等值連接中需要用到的列。
使用 USING 可以在有多個列滿足條件時進行選擇。
不要給選中的列中加上表名前綴或別名。
JOIN 和 USING 子句經常同時使用。
SELECT e.employee_id, e.last_name, d.location_id
FROM employees e JOIN departments d
USING (department_id) ;
使用ON 子句創建連接(常用):
自然連接中是以具有相同名字的列爲連接條件的。
可以使用 ON 子句指定額外的連接條件。
這個連接條件是與其它條件分開的。
ON 子句使語句具有更高的易讀性。
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);
使用 ON 子句創建多表連接:
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
補充:
SQL語句的多表查詢方式:
例如:按照department_id查詢employees(員工表)和departments(部門表)
的信息。
方式一(通用型):SELECT ... FROM ... WHERE
SELECT e.last_name,e.department_id,d.department_name
FROM employees e,departments d
where e.department_id = d.department_id
方式二:SELECT ... FROM ... NATURAL JOIN ...
有侷限性:會自動連接兩個表中相同的列(可能有多個:department_id和manager_id)
SELECT last_name,department_id,department_name
FROM employees
NATURAL JOIN departments
方式三:SELECT ... JOIN ... USING ...
有侷限性:好於方式二,但若多表的連接列列名不同,此法不合適
SELECT last_name,department_id,department_name
FROM employees
JOIN departments
USING(department_id)
方式四:SELECT ... FROM ... JOIN ... ON ...
常用方式,較方式一,更易實現外聯接(左、右、滿)
SELECT last_name,e.department_id,department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id