SQL讀書筆記(八) 聯結表

筆記參考SQL必知必會,把書中一些有用的資源摘錄下來,方便以後查閱,也供道友們參考

SQL最強大的功能之一就是能在數據查詢的執行中聯結(join)表。聯結是利用SQL的SELECT能執行的最重要的操作,很好地理解聯結及其語法是學習SQL的極爲重要的部分。

聯結表我的理解是如果我們需要輸出多個表的查詢數據,我們就需要使用聯結表,比如我們輸出2個表的中的一個屬性時,我們就需要從2個表中查詢,之前有類似的子查詢,當查詢的兩者有關係時,可以使用子查詢來查詢,但當兩者沒關係時,那我們只能用聯結表查詢,可能理解的有點片面,之後經過時間積累在修改。希望道友能指正。。。。

SQL最強大的功能之一就是能在數據查詢的執行中聯結(join)表。聯結是利用SQL的SELECT能執行的最重要的操作,很好地理解聯結及其語法是學習SQL的極爲重要的部分。

2 、創建聯結

SELECT vend_name, prod_name, prod_price FROM Vendors, Products WHERE Vendors.vend_id = Products.vend_id;
vend_name                prod_name                prod_price 
--------------------     --------------------     ---------
Doll House Inc.          Fish bean bag toy        3.4900 
Doll House Inc.          Bird bean bag toy        3.4900 
Doll House Inc.          Rabbit bean bag toy      3.4900 
Bears R Us                 8 inch teddy bear        5.9900 

看FROM子句。與以前的SELECT語句不一樣,這條語句的FROM子句列出了兩個表:Vendors和Products。它們就是這條SELECT語句聯結的兩個表的名字。這兩個表用WHERE子句正確地聯結,WHERE子句指示DBMS將Vendors表中的vend_id與Products表中的vend_id匹配起來。

2.3、內聯結

上面的聯結是等值聯結,它基於兩個表之間的相等測試。這種聯結也稱爲內聯結(inner join)。其實,可以對這種聯結 使用稍微不同的語法,明確指定聯結的類型。下面的SELECT語句返回與前面例子完全相同的。

SELECT vend_name, prod_name, prod_price FROM Vendors INNER JOIN Products ON Vendors.vend_id = Products.vend_id;

中的SELECT與前面的SELECT語句相同,但FROM子句不同。這裏,兩個表之間的關係是以INNER JOIN指定的部分FROM子句。在使用 這種語法時,聯結條件用特定的ON子句而不是WHERE子句給出。傳遞給ON的實際條件與傳遞給WHERE的相同。

根據DBMS支持選擇這兩種方法

2.4、聯結多個表

SELECT prod_name, vend_name, prod_price, quantity
FROM OrderItems, Products, Vendors
WHERE Products.vend_id = Vendors.vend_id
AND OrderItems.prod_id = Products.prod_id
AND order_num = 20007;

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

3、創建高級聯結

介紹如何使用表別名,如何對被聯結的表使用聚集函數

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’;

FROM子句中的三個表全都有別名。Customers AS C使用C作爲Customers的別名,如此等等。這樣,就可以使用省略的C而不用全 名Customers。在這個例子中,表別名只用於WHERE子句。其實它不僅能用於WHERE子句,還可以用於SELECT的列表、ORDER BY子句以及其他語句部分。

需要注意,表別名只在查詢執行中使用。與列別名不一樣,表別名不返回到客戶端。

3.2、使用不同類型的聯結

迄今爲止,我們使用的只是內聯結或等值聯結的簡單聯結。現在來看三種其他聯結:自聯結(self-join)、自然聯結(natural join)和外聯結 (outer join)。

3.2.1、自聯結

假如要給與Jim Jones同一公司的所有顧客發送一封信件。這個查詢要求首先找出Jim Jones工作的公司,然後找出在該公司工作的顧客。下面 是解決此問題的一種方法:

SELECT cust_id, cust_name, cust_contact
FROM Customers
WHERE cust_name = (SELECT cust_name
FROM Customers
WHERE cust_contact = ‘Jim Jones’);

使用了子查詢。內部的SELECT語句做了一個簡單檢索,返回Jim Jones工作公司的cust_name。該名字用於外部查詢的WHERE子句中,以檢索出爲該公司工作的所有僱員

3.2.3、外聯結

http://blog.sina.com.cn/s/blog_3d48dbb70100hyz4.html非常好的博客講解了外聯結

3.2.4、使用帶聚集函數的聯結

要檢索所有顧客及每個顧客所下的訂單數,下面的代碼使用COUNT()函數完成此工作:

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;

這條SELECT語句使用INNER JOIN將Customers和Orders表互相關聯。GROUP BY子句按顧客分組數據,因此,函數調 用COUNT(Orders.order_num)對每個顧客的訂單計數,將它作爲num_ord返回。

SELECT Customers.cust_id,
       COUNT(Orders.order_num) AS num_ord 
FROM Customers LEFT OUTER JOIN Orders 
ON Customers.cust_id = Orders.cust_id 
GROUP BY Customers.cust_id;

這個例子使用左外部聯結來包含所有顧客,甚至包含那些沒有任何訂單的顧客。結果中也包含了顧客1000000002,他有0個訂單。

使用聯結和聯結條件

注意所使用的聯結類型。一般我們使用內聯結,但使用外聯結也有效。 關於確切的聯結語法,應該查看具體的文檔,看相應的DBMS支持何種語法。 保證使用正確的聯結條件(不管採用哪種語法),否則會返回不正確的數據。 應該總是提供聯結條件,否則會得出笛卡兒積。 在一個聯結中可以包含多個表,甚至可以對每個聯結采用不同的聯結類型。雖然這樣做是合法的,一般也很有用,但應該在一起測試它們前分別測試每個聯結。這會使故障排除更爲簡單。

發佈了83 篇原創文章 · 獲贊 68 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章