<a name="sql多表查詢"></a>
SQL多表查詢
<a name="等值和不等值連接查詢"></a>
等值和不等值連接查詢
- 從多個(gè)表中獲取數(shù)據(jù):如果在查詢的時(shí)候光督,直接從多個(gè)表中獲取數(shù)據(jù)雕憔。沒有添加條件判斷酬蹋,會出現(xiàn)“笛卡爾積”錯(cuò)誤
-
笛卡爾積錯(cuò)誤
- 笛卡爾集會在下面條件下產(chǎn)生
- 省略連接條件
- 連接條件無效
- 所有表中的所有行互相連接
- 為了避免笛卡爾集萧吠, 可以在 WHERE 加入有效的連接條件左冬。
- 笛卡爾集會在下面條件下產(chǎn)生
- Oracle 連接多表查詢
- 在 WHERE 子句中寫入連接條件。
- 在表中有相同列時(shí)纸型,在列名之前加上表名前綴
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
<a name="等值連接"></a>
等值連接
SELECT employees.employee_id, employees.last_name,
employees.department_id, departments.department_id,
departments.location_id
FROM employees, departments
WHERE employees.department_id = departments.department_id;
- 區(qū)分重復(fù)的列名(使用表名或者表的別名)
- 使用表名前綴在多個(gè)表中區(qū)分相同的列拇砰。
- 在不同表中具有相同列名的列可以用表的別名加以區(qū)分。
- 連接 n個(gè)表,至少需要 n-1個(gè)連接條件狰腌。 例如:連接三個(gè)表除破,至少需要兩個(gè)連接條件。
-- 練習(xí):查詢出公司員工的 last_name, department_name, city
SELECT last_name, department_name, city
FROM employees e ,departments d ,locations l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id
<a name="非等值連接"></a>
非等值連接
-- EMPLOYEES表中的列工資應(yīng)在JOB_GRADES表中的最高工資與最低工資之間
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;
<a name="內(nèi)連接琼腔、外連接左(或右)-外連接瑰枫、滿外連接"></a>
內(nèi)連接、外連接(左(或右) 外連接丹莲、滿外連接)
- 內(nèi)連接: 合并具有同一列的兩個(gè)以上的表的行, 結(jié)果集中不包含一個(gè)表與另一個(gè)表不匹配的行
- 外連接: 兩個(gè)表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 光坝,這種連接稱為左(或右) 外連接。沒有匹配的行時(shí), 結(jié)果表中相應(yīng)的列為空(NULL). 外連接的 WHERE 子句條件類似于內(nèi)部連接, 但連接條件中沒有匹配行的表的列后面要加外連接運(yùn)算符, 即用圓括號括起來的加號(+).
<a name="內(nèi)連接"></a>
內(nèi)連接
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
-- SQL1999語法的方式
SELECT e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
<a name="外連語法"></a>
外連語法
使用外連接可以查詢不滿足連接條件的數(shù)據(jù)甥材。
外連接的符號是 (+)盯另。
右外連接
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
-- 示例
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id
-- SQL1999方式
SELECT e.last_name, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id)
- 左外連接
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column = table2.column(+);
-- 示例
SELECT e.last_name, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+)
-- SQL1999方式
SELECT e.last_name, d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id)
<a name="滿外連接"></a>
滿外連接
- 在SQL: 1999中,內(nèi)連接只返回滿足連接條件的數(shù)據(jù)
- 兩個(gè)表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行洲赵,這種連接稱為左(或右) 外連接鸳惯。
- 兩個(gè)表在連接過程中除了返回滿足連接條件的行以外還返回兩個(gè)表中不滿足條件的行 ,這種連接稱為滿 外連接叠萍。
-- 滿外連接
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id)
<a name="自連接"></a>
自連接
- 自連接可以把表本身作為連接的表
-- 練習(xí):查詢出 last_name 為 ‘Chen’ 的員工的 manager 的信息
SELECT worker.last_name || ' works for ' || manager.last_name
FROM employees worker , employees manager
WHERE worker.manager_id = manager.employee_id AND INITCAP(worker.last_name) = 'Chen'
<a name="叉集了解"></a>
叉集(了解)
- 使用
CROSS JOIN
子句使連接的表產(chǎn)生叉集芝发。 - 叉集和笛卡爾集是相同的。
SELECT last_name, department_name
FROM employees
CROSS JOIN departments
<a name="自然連接"></a>
自然連接
- NATURAL JOIN 子句苛谷,會以兩個(gè)表中具有相同名字的列為條件創(chuàng)建等值連接后德。
- 在表中查詢滿足等值條件的數(shù)據(jù)。
- 如果只是列名相同而數(shù)據(jù)類型不同抄腔,則會產(chǎn)生錯(cuò)誤
返回的是瓢湃,兩個(gè)表中具有相同名字的列的“且、交集”赫蛇,而非“或绵患,并集”。即:比如employee類和department類都有
department_id和manager_id悟耘,返回二者都相同的結(jié)果落蝙。
SELECT department_id, department_name,
location_id, city
FROM departments
NATURAL JOIN locations
<a name="使用using創(chuàng)建連接"></a>
使用USING創(chuàng)建連接
- 在NATURAL JOIN 子句創(chuàng)建等值連接時(shí),可以使用 USING 子句指定等值連接中需要用到的列。
- 使用 USING 可以在有多個(gè)列滿足條件時(shí)進(jìn)行選擇筏勒。
- 不要給選中的列中加上表名前綴或別名移迫。
- JOIN 和 USING 子句經(jīng)常同時(shí)使用。
- 有局限性:但若多表的連接列列名不同管行,此法不合適
select last_name,department_name
from employees
join departments using (department_id);
<a name="使用on-子句創(chuàng)建連接-常用"></a>
使用ON 子句創(chuàng)建連接 (常用)
- 自然連接中是以具有相同名字的列為連接條件的厨埋。
- 可以使用 ON 子句指定額外的連接條件。
- 這個(gè)連接條件是與其它條件分開的捐顷。
- 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 創(chuàng)建多表連接
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