MySQL複雜查詢 —— 跨表/多表查詢,如何解決MySQL不支援全連線的問題 —— 使用結果集的合併
SELECT sex, MAX(salary), MIN(salary), AVG(salary)
FROM emp
GROUP BY sex;
5.MySQL複雜查詢 —— 跨表/多表查詢 —— 瞭解
查詢結果集中的資料來自於多個不同的表。
示例:查詢每個員工的姓名及其所在部門的名稱
SELECT ename, dname
FROM emp, dept ; #笛卡爾積!錯誤!
-----------------------------------------------------------
SELECT ename, deptId, did, dname
FROM emp, dept
WHERE deptId = did ; #跨表查詢必須有連線條件
注意:上述寫法是SQL-92版本中的寫法。存在一定的缺陷:
(1)無法顯示沒有部門的員工 —— KING
(2)無法顯示沒有員工的部門 —— 測試部
SQL-99標準對此進行了改變,但是SQL變得很複雜,有四種寫法:
(1)內連線查詢:inner join ... on ...
SELECT ename, dname
FROM emp INNER JOIN dept
ON deptId=did ;
#內連線的效果與SQL-92標準完全一樣
(2)左外連線查詢: left outer join ... on ...
SELECT ename, dname
FROM emp LEFT OUTER JOIN dept
ON deptId=did ; #13+1
#可以顯示出“左側表”中所有的記錄!即使右側表中沒有對應的記錄
(3)右外連線查詢:right outer join ... on ...
SELECT ename, dname
FROM emp RIGHT OUTER JOIN dept
ON deptId=did ; #13+1
#可以顯示出“右側表”中所有的記錄!即使左側表中沒有對應的記錄
(4)全外連線查詢:full join ... on ...
SELECT ename, dname
FROM emp FULL JOIN dept
ON deptId=did ; #13+1+1
#可以顯示出“右側表”和“右側表”中所有的記錄!—— MySQL不支援
課外小知識:如何解決MySQL不支援全連線的問題 —— 使用結果集的合併 select ename, salary from emp_us ; select ename, salary from emp_cn ; |
結果集的合併:UNION,把兩條查詢語句的結果合併為一個大結果 (select ename, salary from emp_us) UNION (select ename, salary from emp_cn) ; 兩個結果集中的相同資料只顯示一次 |
(select ename, salary from emp_us) UNION ALL (select ename, salary from emp_cn) ; 兩個結果集中的相同資料各自顯示 |
練習:查詢出員工姓名及其所在部門的名字,要求必須顯示出所有的員工和所有的部門:左外連接合並上右外連線 ( SELECT ename, dname FROM emp LEFT OUTER JOIN dept ON deptId=did ) UNION ( SELECT ename, dname FROM emp RIGHT OUTER JOIN dept ON deptId=did ) ; |
練習:查詢出員工姓名及其所在部門的名字,要求必須顯示出所有的員工和所有的部門:左外連接合並上右外連線 ( SELECT ename, dname FROM emp LEFT OUTER JOIN dept ON deptId=did ) UNION ( SELECT ename, dname FROM emp RIGHT OUTER JOIN dept ON deptId=did ) ; |