使用連接在多個表中查詢數據:
在 WHERE 子句中寫入連接條件。
在表中有相同列時,在列名之前加上表名前綴。
使用表名前綴在多個表中區分相同的列。
在不同表中具有相同列名的列可以用表的別名加以區分。
使用別名可以簡化查詢。
使用表名前綴可以提高執行效率。
內連接和外連接:
內連接: 合併具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行。
外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,這種連接稱爲左(或右) 外連接。
沒有匹配的行時, 結果表中相應的列爲空(NULL)。
外連接的 WHERE 子句條件類似於內部連接, 但連接條件中沒有匹配行的表的列後面要加外連接運算符, 即用圓括號括起來的加號(+)。
一、內連接:
1、等值連接:
例如:
方式1:
SELECT
A .employee_id,
b.department_id,
b.department_name
FROM
employees A,
departments b
WHERE
A .department_id = b.department_id;
方式2(join+ 連接的表名+on+匹配條件):
SELECT
a.last_name ,
a.department_id ,
b.department_name
FROM
employees a
JOIN departments b ON a.department_id=b.department_id;
三張表查詢:
方式1:
SELECT
A .employee_id,
b.department_id,
b.department_name,
c.city
FROM
employees A,
departments b,
locations c
WHERE
A .department_id = b.department_id
AND b.location_id = c.location_id;
方式2:
SELECT
a .last_name,
a .department_id,
b.department_name,
c.city
FROM
employees a
JOIN departments b ON a .department_id = b.department_id
JOIN locations c ON b.location_id = c.location_id;
總結:連接 n個表,至少需要 n-1個連接條件。
2、非等值連接:
例如:
SELECT
employee_id,
last_name,
grade_level
FROM
employees A,
job_grades b
WHERE
A .salary BETWEEN b.lowest_sal
AND b.highest_sal;
二、外連接:
左外連接:
方式1:
SELECT
a .last_name,
a .department_id,
b.department_name
FROM
employees a,
departments b
WHERE
a.department_id = b.department_id(+);
方式2:
SELECT
A .last_name,
A .department_id,
b.department_name
FROM
employees A
LEFT OUTER JOIN departments b ON A .department_id = b.department_id;
右外連接:
方式1:
SELECT
a .last_name,
a .department_id,
b.department_name
FROM
employees a,
departments b
WHERE
a.department_id(+) = b.department_id;
方式2:
SELECT
A .last_name,
A .department_id,
b.department_name
FROM
employees A
RIGHT OUTER JOIN departments b ON A .department_id = b.department_id;
滿外連接:
SELECT
A .last_name,
A .department_id,
b.department_name
FROM
employees A
FULL OUTER JOIN departments b ON A .department_id = b.department_id;
自連接:
查詢公司中員工'chen'的manager的信息:
SELECT
empl.last_name,
manager.employee_id,
manager.last_name,
manager.manager_id,
manager.salary,
manager.email
FROM
employees empl,
employees manager
WHERE
empl.manager_id = manager.employee_id
AND LOWER (empl.last_name) = 'chen';
參考來自尚硅谷視頻