1. 程式人生 > >計算機技術學習與應用

計算機技術學習與應用

多表查詢常涉及到到表連線的問題,主要涉及到內連線:INNER JOIN,外連線:LEFT JOIN(or LEFT OUTER JOIN),RIGHT JOIN(or RIGHT OUTER JOIN),FULL JOIN和交叉連線:CROSS JOIN。INNER JOIN也叫等值連結。內連線具有排他性,而OUTER JOIN卻是包容性的。

表連線進行查詢都是會產生一張中間的臨時表,然後再將這張臨時表返回給使用者。通用的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

ON t1.dept=t2.id;

執行結果:



 

分析:可以看出採用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 決定了表的排序方式, 如果是左外連線, 如果右邊沒有對應的話,還要填補空值. 如果排序方式對應不起來, 就會錯亂。