時間:2022-06-20來源:www.farandoo.com作者:電腦系統城
SQL Join (連接) 是利用不同數據表之間字段的關連性來結合多數據表之檢索。
SQL Join是結合多個數據表而組成一抽象的暫時性數據表以供數據查詢,在原各數據表中之紀錄及結構皆不會因此連接查詢而改變。
這是一個客戶數據表「customers」:
C_Id |
Name |
City |
Address |
Phone |
---|---|---|---|---|
1 |
張一 |
臺北市 |
XX路100號 |
02-12345678 |
2 |
王二 |
新竹縣 |
YY路200號 |
03-12345678 |
3 |
李三 |
高雄縣 |
ZZ路300號 |
07-12345678 |
而這是產品訂單的數據表「orders」:
O_Id |
OrderNo |
C_Id |
---|---|---|
1 |
2572 |
3 |
2 |
7375 |
3 |
3 |
7520 |
1 |
4 |
1054 |
1 |
5 |
1257 |
5 |
其中,C_Id 是客戶數據表中的主鍵 (Primary Key) 字段,我們怎么將這兩張不同的數據表依相關字段來作個連接結合以便查詢呢?這就是接下來的主題 Join!
Inner Join : 內部連接
LEFT (OUTER) JOIN : 左外部連接
RIGHT (OUTER) JOIN : 右外部連接
FULL (OUTER) JOIN : 全部外部連接
CROSS JOIN : 交叉連接
NATURAL JOIN : 自然連接
INNER JOIN (內部連接) 為等值連接,必需指定等值連接的條件,而查詢結果只會返回符合連接條件的數據。
1 2 3 4 |
SELECT table_column1, table_column2··· FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name; |
或
1 2 3 4 |
SELECT table_column1, table_column2··· FROM table_name1 INNER JOIN table_name2 USING (column_name); |
現在我們想列出所有客戶的訂單編號數據,我們可以作一個 INNER JOIN 查詢:
1 2 3 4 |
SELECT customers. Name , orders.Order_No FROM customers INNER JOIN orders ON customers.C_Id=orders.C_Id; |
其中用點號連接之「XXX.YYY」表示XXX數據表中的YYY字段。
查詢結果如下:
Name |
Order_No |
---|---|
李三 |
2572 |
李三 |
7375 |
張一 |
7520 |
張一 |
1054 |
查詢結果只會返回符合連接條件的數據!
LEFT JOIN 可以用來建立左外部連接,查詢的 SQL 敘述句 LEFT JOIN 左側數據表 (table_name1) 的所有記錄都會加入到查詢結果中,即使右側數據表 (table_name2) 中的連接字段沒有符合的值也一樣。
1 2 3 4 |
SELECT table_column1, table_column2··· FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name; |
有些數據庫的語法會是LEFT OUTER JOIN。
現在我們想查詢所有客戶與其訂單狀況的數據,我們可以作一個 LEFT JOIN 查詢:
1 2 3 4 |
SELECT customers. Name , orders.Order_No FROM customers LEFT JOIN orders ON customers.C_Id=orders.C_Id; |
查詢結果如下:
Name |
Order_No |
---|---|
張一 |
7520 |
張一 |
1054 |
王二 |
|
李三 |
2572 |
李三 |
7375 |
LEFT JOIN會返回左側數據表中所有數據列,就算沒有符合連接條件,而右側數據表中如果沒有匹配的數據值就會顯示為「NULL」。
相對于LEFT JOIN,RIGHT JOIN 可以用來建立右外部連接,查詢的 SQL 敘述句 RIGHT JOIN 右側數據表 (table_name2) 的所有記錄都會加入到查詢結果中,即使左側數據表 (table_name2) 中的連接字段沒有符合的值也一樣。
1 2 3 4 |
SELECT table_column1, table_column2··· FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name; |
有些數據庫的語法會是RIGHT OUTER JOIN。
現在我們想查詢所有訂單與相應的客戶之資料,我們可以作一個 RIGHT JOIN 查詢:
1 2 3 4 |
SELECT customers. Name , orders.Order_No FROM customers RIGHT JOIN orders ON customers.C_Id=orders.C_Id; |
查詢結果如下:
Name |
Order_No |
---|---|
李三 |
2572 |
李三 |
7375 |
張一 |
7520 |
張一 |
1054 |
1257 |
RIGHT JOIN會返回右側數據表中所有數據列,就算是沒有符合連接條件,而左側數據表中如果沒有匹配的數據值就會顯示為「NULL」。
FULL JOIN 即為 LEFT JOIN 與 RIGHT JOIN 的聯集,它會返回左右數據表中所有的紀錄,不論是否符合連接條件。
1 2 3 4 |
SELECT table_column1, table_column2··· FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name; |
我們來作一個 FULL JOIN 查詢:
1 2 3 4 |
SELECT customers. Name , orders.Order_No FROM customers FULL JOIN orders ON customers.C_Id=orders.C_Id; |
查詢結果如下:
Name |
Order_No |
---|---|
李三 |
2572 |
李三 |
7375 |
張一 |
7520 |
張一 |
1054 |
1257 |
|
王二 |
MySQL數據庫中沒有FULL JOIN,但是您可以用UNION來模擬。
交叉連接為兩個數據表間的笛卡兒乘積 (Cartesian product),兩個數據表在結合時,不指定任何條件,即將兩個數據表中所有的可能排列組合出來,以下例而言 CROSS JOIN 出來的結果資料列數為 3×5=15 筆,因此,當有WHERE、ON、USING條件時不建議使用。
1 2 3 |
SELECT table_column1, table_column2··· FROM table_name1 CROSS JOIN table_name2; |
或
1 2 |
SELECT table_column1, table_column2··· FROM table_name1, table_name2; |
或
1 2 3 |
SELECT table_column1, table_column2··· FROM table_name1 JOIN table_name2; |
這是一個客戶數據表「customers」:
C_Id |
Name |
City |
Address |
Phone |
---|---|---|---|---|
1 |
張一 |
臺北市 |
XX路100號 |
02-12345678 |
2 |
王二 |
新竹縣 |
YY路200號 |
03-12345678 |
3 |
李三 |
高雄縣 |
ZZ路300號 |
07-12345678 |
而這是產品訂單的數據表「orders」:
O_Id |
Order_No |
C_Id |
---|---|---|
1 |
2572 |
3 |
2 |
7375 |
3 |
3 |
7520 |
1 |
4 |
1054 |
1 |
5 |
1257 |
5 |
我們來作一個 CROSS JOIN 查詢:
1 2 3 |
SELECT customers. Name , orders.Order_No FROM customers CROSS JOIN orders; |
查詢結果如下:
Name |
Order_No |
---|---|
張一 |
2572 |
王二 |
2572 |
李三 |
2572 |
張一 |
7375 |
王二 |
7375 |
李三 |
7375 |
張一 |
7520 |
王二 |
7520 |
李三 |
7520 |
張一 |
1054 |
王二 |
1054 |
李三 |
1054 |
張一 |
1257 |
王二 |
1257 |
李三 |
1257 |
自然連接有 NATURAL JOIN、NATURAL LEFT JOIN、NATURAL RIGHT JOIN,兩個表格在進行 JOIN 時,加上 NATURAL 這個關鍵詞之后,兩數據表之間同名的字段會被自動結合在一起。
1 2 3 |
SELECT table_column1, table_column2··· FROM table_name1 NATURAL JOIN table_name2; |
這是一個客戶數據表「customers」:
C_Id |
Name |
City |
Address |
Phone |
---|---|---|---|---|
1 |
張一 |
臺北市 |
XX路100號 |
02-12345678 |
2 |
王二 |
新竹縣 |
YY路200號 |
03-12345678 |
3 |
李三 |
高雄縣 |
ZZ路300號 |
07-12345678 |
而這是產品訂單的數據表「orders」:
O_Id |
Order_No |
C_Id |
---|---|---|
1 |
2572 |
3 |
2 |
7375 |
3 |
3 |
7520 |
1 |
4 |
1054 |
1 |
5 |
1257 |
5 |
現在我們想列出所有客戶的訂單編號數據,我們可以作一個 NATURAL JOIN 查詢:
1 2 3 |
SELECT customers. Name , orders.Order_No FROM customers NATURAL JOIN orders; |
查詢結果如下:
Name |
Order_No |
---|---|
李三 |
2572 |
李三 |
7375 |
張一 |
7520 |
張一 |
1054 |
注意到了嗎?返回結果同等于下面這個INNER JOIN查詢:
1 2 3 4 |
SELECT customers. Name , orders.Order_No FROM customers INNER JOIN orders ON customers.C_Id=orders.C_Id; |
到此這篇關于SQL連接查詢的文章就介紹到這了。希望對大家的學習有所幫助。
2022-09-11
系統之家分享SqlServer創建自動收縮事務日志任務的圖文教程2022-03-09
sql語句中union的用法與踩坑記錄2022-03-05
MSSQL 附加數據庫提示“錯誤 823”數據恢復實操這篇文章主要給大家分享的是sqlserver數據庫加密后無法使用MDF,LDF,log文件名稱被修改的數據恢復案例,如果工作中你也遇到這樣的問題,可以參考一下...
2022-03-05
交叉聯接(cross join)的概念 2、交叉聯接的語法格式 3、交叉查詢的使用場景 3.1 交叉聯接可以查詢全部數據 3.2 交叉聯接優化查詢性能...
2021-04-22