(一)笛卡爾問題
1、笛卡爾積會在下面條件下產生:
- 省略連接條件
- 連接條件無效
- 所有表中的所有行互相連接
2.為了避免笛卡爾積,可以在WHERE加入有效的連接條件
(二)Oracle連接
1、內連接
合並具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
(1)等值連接
使用連接在多個表中查詢數據
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
- 在 WHERE 子句中寫入連接條件
- 在表中有相同列時,在列名之前加上表名前綴
兩表連接:查詢出公司員工的 last_name, department_name
三表連接:查詢出公司員工的 last_name, department_name, city
(2)非等值連接
查詢員工工資對應的檔次
2、外連接
兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,這種連接稱為左(或右) 外連接。沒有匹配的行時, 結果表中相應的列為空(NULL). 外連接的 WHERE 子句條件類似於內部連接, 但連接條件中沒有匹配行的表的列后面要加外連接運算符, 即用圓括號括起來的加號(+).
外連接語法
- 使用外連接可以查詢不滿足連接條件的數據
- 外連接的符號是(+)
左外連接
右外連接
(三)SQL:1999語法連接
使用連接從多個表中查詢數據:
SELECT table1.column, table2.column
FROM table1
[CROSS JOIN table2] |
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2 ON(table1.column_name = table2.column_name)] |
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)];
1、叉集(了解)
- 使用CROSS JOIN自居連接的表產生叉集
- 叉集和笛卡爾集是相同的
2、NATURAL JOIN:自然連接
- 會以兩個表中具有相同名字的列為條件創建等值連接。
- 在表中查詢滿足等值條件的數據
- 如果只是列名相同而數據類型不同,則會產生錯誤
返回的是,兩個表中具有相同名字的列的“且、交集”,而非“或,並集”。
即:比如employee類和department類都有department_id和manager_id,返回二者都相同的結果。
3、使用 USING 子句創建連接、
- 在NATURAL JOIN 子句創建等值連接時,可以使用 USING 子句指定等值連接中需要用到的列
- 使用 USING 可以在有多個列滿足條件時進行選擇
- 不要給選中的列中加上表名前綴或別名
- JOIN 和 USING 子句經常同時使用
4、使用ON 子句創建連接(常用)
- 自然連接中是以具有相同名字的列為連接條件的。
- 可以使用 ON 子句指定額外的連接條件。
- 這個連接條件是與其它條件分開的。
- ON 子句使語句具有更高的易讀性。
(1)內連接
(2)左外連接
(3)右外連接
(4)滿外連接
5、自連接
查詢公司中員工‘Chen’的manager的信息
(四)總結
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
--內連接
1)
--等值連接
--不等值連接
2)
--非自連接
--自連接
--外連接
--左外連接、右外連接、滿外連接