SQL:聯(lián)結表

1 創(chuàng)建聯(lián)結

WHERE子句的重要性:

?? 要保證所有聯(lián)結都有WHERE子句,否則DBMS將返回比想要的數(shù)據(jù)多得多的數(shù)據(jù)。

?? 同理,要保證WHERE子句的正確性。不正確的過濾條件會導致DBMS返回不正確的數(shù)據(jù)。

叉聯(lián)結(cross join):返回笛卡兒積的聯(lián)結

笛卡兒積(cartesian product):由沒有聯(lián)結條件的表關系返回的結果為笛卡兒積。檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù)。

SELECT vend_name, prod_name, prod_price

FROM Vendors, Products

WHERE Vendors.vend_id = Products.vend_id;

內(nèi)聯(lián)結(inner join):基于兩個表之間的相等測試

SELECT vend_name, prod_name, prod_price

FROM Vendors INNER JOIN Products

ON Vendors.vend_id = Products.vend_id;

注意:

雖然這兩種查詢在功能上可能產(chǎn)生相同的結果,但使用 INNER JOIN 語法有以下優(yōu)勢:

明確性:清楚地表明了連接的類型(內(nèi)連接)。

可讀性:提高了查詢的可讀性,使得其他開發(fā)者更容易理解查詢的意圖。

擴展性:更容易擴展到更復雜的連接類型,如左連接、右連接等。

因此,推薦使用 INNER JOIN 語法,因為它更符合現(xiàn)代 SQL 標準,更易于維護和擴展。

聯(lián)結多個表

?? SQL不限制一條SELECT語句中可以聯(lián)結的表的數(shù)目

/* 前面采用子查詢 */

SELECT cust_name, cust_contact

FROM Customers

WHERE cust_id IN (SELECT cust_id

? ? ? ? ? ? ? ? ? FROM Orders

? ? ? ? ? ? ? ? ? WHERE order_num IN (SELECT order_num

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FROM OrderItems

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? WHERE prod_id = 'RGAN01'));

/* 等價于子查詢的聯(lián)結查詢 */

SELECT cust_name, cust_contact

FROM Customers, Orders, OrderItems

WHERE Customers.cust_id = Orders.cust_id

AND OrderItems.order_num = Orders.order_num

AND prod_id = 'RGAN01';

?? 性能警告:DBMS在運行時關聯(lián)指定的每個表,以處理聯(lián)結。這種處理可能非常耗費資源,因此應該注意,不要聯(lián)結不必要的表。聯(lián)結的表越多,性能下降越厲害。

2 創(chuàng)建高級聯(lián)結

SQL除了可以對列名和計算字段使用別名,還允許給表名起別名。這樣做有兩個主要理由:

縮短SQL語句;

允許在一條SELECT語句中多次使用相同的表。

SELECT cust_name, cust_contact

FROM Customers AS C, Orders AS O, OrderItems AS OI

WHERE C.cust_id = O.cust_id

AND OI.order_num = O.order_num

AND prod_id = 'RGAN01';

不同類型的聯(lián)結:

自聯(lián)結(self-join):它將同一個表視為兩個不同的表進行聯(lián)結,基于表中某個列的值來匹配行

自然聯(lián)結(natural join):自動基于兩個表中具有相同列名的字段來進行聯(lián)接,而無需顯式指定連接條件

外聯(lián)結 (outer join):會返回左表、右表或兩個表中的所有行,即使在另一個表中沒有匹配的行。

左外聯(lián)結(LEFT OUTER JOIN)

返回左表(指定的表)的所有行。

如果左表中的行在右表中有匹配的行,則返回匹配的行;否則,返回 NULL 值。

右外聯(lián)結(RIGHT OUTER JOIN)

返回右表的所有行。

如果右表中的行在左表中有匹配的行,則返回匹配的行;否則,返回 NULL 值

全外聯(lián)結FULL OUTER JOIN)

返回左表和右表中的所有行。

如果某個表中的行在另一個表中有匹配的行,則返回匹配的行;否則,返回 NULL 值。

關鍵字INNER JOIN、OUTER JOIN指定聯(lián)結類型,不是在WHERE子句中指定。

SELECT Customers.cust_id, Orders.order_num

FROM Customers LEFT OUTER JOIN Orders

ON Customers.cust_id = Orders.cust_id;

3 帶有聚合函數(shù)的聯(lián)結

SELECT Customers.cust_id,

COUNT(Orders.order_num) AS num_ord

FROM Customers INNER JOIN Orders

ON Customers.cust_id = Orders.cust_id

GROUP BY Customers.cust_id;


我是文熠,一個正在找工作的95后算法工程師

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容