SQL中的連接查詢詳解
Join連接(SQL Join)
SQL Join (連接)是利用不同數(shù)據(jù)表之間字段的關(guān)連性來結(jié)合多數(shù)據(jù)表之檢索。
SQL Join是結(jié)合多個數(shù)據(jù)表而組成一抽象的暫時性數(shù)據(jù)表以供數(shù)據(jù)查詢,在原各數(shù)據(jù)表中之紀(jì)錄及結(jié)構(gòu)皆不會因此連接查詢而改變。
這是一個客戶數(shù)據(jù)表「customers」:
C_Id | Name | City | Address | Phone |
---|---|---|---|---|
1 | 張一 | 臺北市 | XX路100號 | 02-12345678 |
2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 |
而這是產(chǎn)品訂單的數(shù)據(jù)表「orders」:
O_Id | OrderNo | C_Id |
---|---|---|
1 | 2572 | 3 |
2 | 7375 | 3 |
3 | 7520 | 1 |
4 | 1054 | 1 |
5 | 1257 | 5 |
其中,C_Id是客戶數(shù)據(jù)表中的主鍵(Primary Key)字段,我們怎么將這兩張不同的數(shù)據(jù)表依相關(guān)字段來作個連接結(jié)合以便查詢呢?這就是接下來的主題Join!
SQL的Join查詢有哪幾種類型?
Inner Join :內(nèi)部連接
LEFT (OUTER) JOIN :左外部連接
RIGHT (OUTER) JOIN :右外部連接
FULL (OUTER) JOIN :全部外部連接
CROSS JOIN :交叉連接
NATURAL JOIN :自然連接
INNER JOIN-內(nèi)部連接
INNER JOIN (內(nèi)部連接)為等值連接,必需指定等值連接的條件,而查詢結(jié)果只會返回符合連接條件的數(shù)據(jù)。
INNER JOIN語法(SQL INNER JOIN Syntax)
SELECT table_column1, table_column2··· FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name;
或
SELECT table_column1, table_column2··· FROM table_name1 INNER JOIN table_name2 USING (column_name);
INNER JOIN查詢實例(Example)
現(xiàn)在我們想列出所有客戶的訂單編號數(shù)據(jù),我們可以作一個INNER JOIN查詢:
SELECT customers.Name, orders.Order_No FROM customers INNER JOIN orders ON customers.C_Id=orders.C_Id;
其中用點(diǎn)號連接之「XXX.YYY」表示XXX數(shù)據(jù)表中的YYY字段。
查詢結(jié)果如下:
Name | Order_No |
---|---|
李三 | 2572 |
李三 | 7375 |
張一 | 7520 |
張一 | 1054 |
查詢結(jié)果只會返回符合連接條件的數(shù)據(jù)!
LEFT JOIN-左外部連接
LEFT JOIN可以用來建立左外部連接,查詢的SQL敘述句LEFT JOIN左側(cè)數(shù)據(jù)表(table_name1)的所有記錄都會加入到查詢結(jié)果中,即使右側(cè)數(shù)據(jù)表(table_name2)中的連接字段沒有符合的值也一樣。
LEFT JOIN語法(SQL LEFT JOIN Syntax)
SELECT table_column1, table_column2··· FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name;
有些數(shù)據(jù)庫的語法會是LEFT OUTER JOIN。
LEFT JOIN查詢實例(Example)
現(xiàn)在我們想查詢所有客戶與其訂單狀況的數(shù)據(jù),我們可以作一個LEFT JOIN查詢:
SELECT customers.Name, orders.Order_No FROM customers LEFT JOIN orders ON customers.C_Id=orders.C_Id;
查詢結(jié)果如下:
Name | Order_No |
---|---|
張一 | 7520 |
張一 | 1054 |
王二 | |
李三 | 2572 |
李三 | 7375 |
LEFT JOIN會返回左側(cè)數(shù)據(jù)表中所有數(shù)據(jù)列,就算沒有符合連接條件,而右側(cè)數(shù)據(jù)表中如果沒有匹配的數(shù)據(jù)值就會顯示為「NULL」。
RIGHT JOIN-右外部連接
相對于LEFT JOIN,RIGHT JOIN可以用來建立右外部連接,查詢的SQL敘述句RIGHT JOIN右側(cè)數(shù)據(jù)表(table_name2)的所有記錄都會加入到查詢結(jié)果中,即使左側(cè)數(shù)據(jù)表(table_name2)中的連接字段沒有符合的值也一樣。
RIGHT JOIN語法(SQL RIGHT JOIN Syntax)
SELECT table_column1, table_column2··· FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name;
有些數(shù)據(jù)庫的語法會是RIGHT OUTER JOIN。
RIGHT JOIN查詢實例(Example)
現(xiàn)在我們想查詢所有訂單與相應(yīng)的客戶之資料,我們可以作一個RIGHT JOIN查詢:
SELECT customers.Name, orders.Order_No FROM customers RIGHT JOIN orders ON customers.C_Id=orders.C_Id;
查詢結(jié)果如下:
Name | Order_No |
---|---|
李三 | 2572 |
李三 | 7375 |
張一 | 7520 |
張一 | 1054 |
1257 |
RIGHT JOIN會返回右側(cè)數(shù)據(jù)表中所有數(shù)據(jù)列,就算是沒有符合連接條件,而左側(cè)數(shù)據(jù)表中如果沒有匹配的數(shù)據(jù)值就會顯示為「NULL」。
FULL JOIN-全部外部連接
FULL JOIN即為LEFT JOIN與RIGHT JOIN的聯(lián)集,它會返回左右數(shù)據(jù)表中所有的紀(jì)錄,不論是否符合連接條件。
FULL JOIN語法(SQL FULL JOIN Syntax)
SELECT table_column1, table_column2··· FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name;
FULL JOIN查詢實例(Example)
我們來作一個FULL JOIN查詢:
SELECT customers.Name, orders.Order_No FROM customers FULL JOIN orders ON customers.C_Id=orders.C_Id;
查詢結(jié)果如下:
Name | Order_No |
---|---|
李三 | 2572 |
李三 | 7375 |
張一 | 7520 |
張一 | 1054 |
1257 | |
王二 |
MySQL數(shù)據(jù)庫中沒有FULL JOIN,但是您可以用UNION來模擬。
CROSS JOIN-交叉連接
交叉連接為兩個數(shù)據(jù)表間的笛卡兒乘積(Cartesian product),兩個數(shù)據(jù)表在結(jié)合時,不指定任何條件,即將兩個數(shù)據(jù)表中所有的可能排列組合出來,以下例而言CROSS JOIN出來的結(jié)果資料列數(shù)為3×5=15筆,因此,當(dāng)有WHERE、ON、USING條件時不建議使用。
CROSS JOIN語法(SQL CROSS JOIN Syntax)
SELECT table_column1, table_column2··· FROM table_name1 CROSS JOIN table_name2;
或
SELECT table_column1, table_column2··· FROM table_name1, table_name2;
或
SELECT table_column1, table_column2··· FROM table_name1 JOIN table_name2;
FULL JOIN查詢實例(Example)
這是一個客戶數(shù)據(jù)表「customers」:
C_Id | Name | City | Address | Phone |
---|---|---|---|---|
1 | 張一 | 臺北市 | XX路100號 | 02-12345678 |
2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 |
而這是產(chǎn)品訂單的數(shù)據(jù)表「orders」:
O_Id | Order_No | C_Id |
---|---|---|
1 | 2572 | 3 |
2 | 7375 | 3 |
3 | 7520 | 1 |
4 | 1054 | 1 |
5 | 1257 | 5 |
我們來作一個CROSS JOIN查詢:
SELECT customers.Name, orders.Order_No FROM customers CROSS JOIN orders;
查詢結(jié)果如下:
Name | Order_No |
---|---|
張一 | 2572 |
王二 | 2572 |
李三 | 2572 |
張一 | 7375 |
王二 | 7375 |
李三 | 7375 |
張一 | 7520 |
王二 | 7520 |
李三 | 7520 |
張一 | 1054 |
王二 | 1054 |
李三 | 1054 |
張一 | 1257 |
王二 | 1257 |
李三 | 1257 |
NATURAL JOIN-自然連接
自然連接有NATURAL JOIN、NATURAL LEFT JOIN、NATURAL RIGHT JOIN,兩個表格在進(jìn)行JOIN時,加上NATURAL這個關(guān)鍵詞之后,兩數(shù)據(jù)表之間同名的字段會被自動結(jié)合在一起。
NATURAL JOIN語法(SQL NATURAL JOIN Syntax)
SELECT table_column1, table_column2··· FROM table_name1 NATURAL JOIN table_name2;
NATURAL JOIN查詢實例(Example)
這是一個客戶數(shù)據(jù)表「customers」:
C_Id | Name | City | Address | Phone |
---|---|---|---|---|
1 | 張一 | 臺北市 | XX路100號 | 02-12345678 |
2 | 王二 | 新竹縣 | YY路200號 | 03-12345678 |
3 | 李三 | 高雄縣 | ZZ路300號 | 07-12345678 |
而這是產(chǎn)品訂單的數(shù)據(jù)表「orders」:
O_Id | Order_No | C_Id |
---|---|---|
1 | 2572 | 3 |
2 | 7375 | 3 |
3 | 7520 | 1 |
4 | 1054 | 1 |
5 | 1257 | 5 |
現(xiàn)在我們想列出所有客戶的訂單編號數(shù)據(jù),我們可以作一個NATURAL JOIN查詢:
SELECT customers.Name, orders.Order_No FROM customers NATURAL JOIN orders;
查詢結(jié)果如下:
Name | Order_No |
---|---|
李三 | 2572 |
李三 | 7375 |
張一 | 7520 |
張一 | 1054 |
注意到了嗎?返回結(jié)果同等于下面這個INNER JOIN查詢:
SELECT customers.Name, orders.Order_No FROM customers INNER JOIN orders ON customers.C_Id=orders.C_Id;
到此這篇關(guān)于SQL連接查詢的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。