目錄
一,多表查詢的分類
角度1:等值連接 ?vs ?非等值連接
角度2:自連接 ?vs ?非自連接
角度3:內連接 ?vs ?外連接
二,SQL92語法實現內連接:見上,略SQL92語法實現外連接:使用 + ?----------MySQL不支持SQL92語法中外連接的寫法!
三,SQL99語法如何實現多表的查詢。
1,SQL99語法實現內連接:
2,SQL99語法實現外連接:
3,UNION ?和 UNION ALL的使用
四,7種JOIN的實現:
1.中圖:內連接
2.左上圖:左外連接
3.右上圖:右外連接
4.左中圖:
5.右中圖:
6.左下圖:滿外連接
方式1:左上圖 UNION ALL 右中圖
方式2:左中圖 UNION ALL 右上圖
7.右下圖:左中圖 ?UNION ALL 右中圖
五,SQL99語法的新特性
1:自然連接
2:USING
一,多表查詢的分類
角度1:等值連接 ?vs ?非等值連接
#非等值連接的例子:
SELECT *
FROM 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`;
WHERE e.`salary` >= j.`lowest_sal` AND e.`salary` <= j.`highest_sal`;
員工無法與等級相等,使用between and連接
角度2:自連接 ?vs ?非自連接
SELECT * FROM employees;#自連接的例子
#練習:查詢員工id,員工姓名及其管理者的id和姓名SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp ,employees mgr
WHERE emp.`manager_id` = mgr.`employee_id`;
員工和管理者不在一個表中,是非自鏈接
角度3:內連接 ?vs ?外連接
內連接:合并具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id; ?#只有106條記錄
外連接:合并具有同一列的兩個以上的表的行, 結果集中除了包含一個表與另一個表匹配的行之外,還查詢到了左表 或 右表中不匹配的行。
?外連接的分類:左外連接、右外連接、滿外連接
左外連接:兩個表在連接過程中除了返回滿足連接條件的行以外還返回左表中不滿足條件的行,這種連接稱為左外連接。
右外連接:兩個表在連接過程中除了返回滿足連接條件的行以外還返回右表中不滿足條件的行,這種連接稱為右外連接。
#練習:查詢所有的員工的last_name,department_name信息?SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id; ? # 需要使用左外連接
二,SQL92語法實現內連接:見上,略
SQL92語法實現外連接:使用 + ?----------MySQL不支持SQL92語法中外連接的寫法!
#不支持:
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id(+);
SQL99語法中使用 JOIN ...ON 的方式實現多表的查詢。這種方式也能解決外連接的問題。MySQL是支持此種方式的。
三,SQL99語法如何實現多表的查詢。
1,SQL99語法實現內連接:
SELECT last_name,department_name
FROM employees e INNER JOIN departments d
ON e.`department_id` = d.`department_id`;SELECT last_name,department_name,city
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
JOIN locations l
ON d.`location_id` = l.`location_id`;
2,SQL99語法實現外連接:
#練習:查詢所有的員工的last_name,department_name信息?
# 左外連接:
SELECT last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;#右外連接:
SELECT last_name,department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.`department_id` = d.`department_id`;#滿外連接:mysql不支持FULL OUTER JOIN
SELECT last_name,department_name
FROM employees e FULL OUTER JOIN departments d
ON e.`department_id` = d.`department_id`;
3,UNION ?和 UNION ALL的使用
UNION:會執行去重操作
UNION ALL:不會執行去重操作
結論:如果明確知道合并數據后的結果數據不存在重復數據,或者不需要去除重復的數據,則盡量使用UNION ALL語句,以提高數據查詢的效率。
四,7種JOIN的實現:
1.中圖:內連接
SELECT employee_id,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
2.左上圖:左外連接
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
3.右上圖:右外連接
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
4.左中圖:
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL;
5.右中圖:
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
6.左下圖:滿外連接
方式1:左上圖 UNION ALL 右中圖
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
方式2:左中圖 UNION ALL 右上圖
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
7.右下圖:左中圖 ?UNION ALL 右中圖
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
五,SQL99語法的新特性
1:自然連接:自動查詢等值數據,自動連接,但不靈活,全部連接
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
AND e.`manager_id` = d.`manager_id`;# NATURAL JOIN : 它會幫你自動查詢兩張連接表中`所有相同的字段`,然后進行`等值連接`。
SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;
2:USING:用于替換等值連接,但不適用于非等值連接和自連接
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
USING (department_id);#拓展:
SELECT last_name,job_title,department_name?
FROM employees INNER JOIN departments INNER JOIN jobs?
ON employees.department_id = departments.department_id?
AND employees.job_id = jobs.job_id;