計算機技術學習與應用
表連線進行查詢都是會產生一張中間的臨時表,然後再將這張臨時表返回給使用者。通用的SQL語句:SELECT (待查詢欄位名) FROM 表一 (JOIN TYPE) 表二ON (JOIN CONDITION) [其他對臨時表記錄進行過濾的條件];
幾種連線方式查詢結果區別大致如下:
INNER JOIN:只返回兩個表中連線欄位相同的行(即符合條件的行);
LEFT JOIN: 返回包括左表中的所有記錄和右表中聯結欄位相等的記錄;
RIGHT JOIN: 返回包括右表中的所有記錄和左表中聯結欄位相等的記錄;
FULL JOIN:兩個連線表的所有記錄;
CROSS JOIN:不帶WHERE子句,返回所有資料行的笛卡爾乘積.
表一:TAB_EMP
ID |
EMP_NAME |
DEPT |
1 |
Eric Huang |
1 |
2 |
Alice |
3 |
3 |
Peter |
1 |
4 |
Green |
表二:TAB_DEPT
ID |
DEPT_NAME |
1 |
研發部 |
2 |
財務部 |
3 |
國際事業部 |
4 |
綜合管理部 |
5 |
銷售部 |
INNER JOIN 方式:
SQL>SELECT t1.emp_name, t2.dept_nameFROM tab_emp t1INNERJOIN tab_dept t2ON t1.dept=t2.id;
執行結果:
分析:可以看出採用INNER JOIN方式時,只會列出滿足連線條件的記錄;
LEFT JOIN 方式:
SQL>SELECT t1.emp_name, t2.dept_nameFROM
tab_emp t1LEFTJOIN tab_dept t2
執行結果:
分析:可以看出採用LEFT JOIN方式時,左表中的記錄和右表中聯結欄位相等的記錄會全部列出,而右表中連線欄位不相等的欄位全部為null;
RIGHT JOIN 方式:
SQL>SELECT t1.emp_name, t2.dept_nameFROM tab_emp t1RIGHTJOIN tab_dept t2ON t1.dept=t2.id;
執行結果:
分析:可以看出採用RIGHT JOIN方式時,返回包括右表中的所有記錄和左表中聯結欄位相等的記錄;,若左表中連線欄位不相等的欄位全部為null;
FULL JOIN 方式:
SQL>SELECT t1.emp_name, t2.dept_nameFROM tab_emp t1FULLJOIN tab_dept t2ON t1.dept=t2.id;
執行結果:
分析:可以看出採用FULL JOIN方式時,左表的所有記錄會全部返回,右表的所有記錄也會全部返回,匹配的就直接列出,不匹配的某一邊的記錄值為null就行;
CROSS JOIN方式:
值得注意的是該方式語法上和其他幾種有點差別,不能用on子句。
SELECT * FROM [表一] CROSS JOIN [表二] 或者
SELECT * FROM [表一], [表二]
SQL> SELECT t1.emp_name, t2.dept_nameFROM tab_emp t1CROSSJOIN tab_dept t2;
分析:最後返回的記錄數實際上就是兩張表記錄數的乘積。該型別的JOIN句法不需要連線條件,一個表中的所有行分別都會連線另一個表的所有行,得到的結果被稱為一個笛卡爾積。
最後總結一下,實際專案開發中CROSS JOIN用得比較少,它是不能使用ON關鍵字的,其它都要用。一般先進行連接獲取到需要的新表資料,然後使用其他子句如where子句進行過濾,group by子句進行聚合,order by子句進行排序等等操作。
採用JOIN方式多表連線查詢時,如果如果用到了GROUP BY,GROUP BY 的排序順序必須和SELECT中列出的欄位順序的一致. 這可能是由於GROUP BY 決定了表的排序方式, 如果是左外連線, 如果右邊沒有對應的話,還要填補空值. 如果排序方式對應不起來, 就會錯亂。