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后算法工程師