MySQL必知必會——第16章 創建高級聯結 讀書筆記

如何對被聯結的表使用表別名?
如何對被聯結的表使用聚集函數?
1 使用表別名
回顧:如何使用別名引用被檢索的表列?

select Concat(vend_name,'(',vend_country) as vend_title
from vendors
order by vend_name;

別名除了用於列名和計算字段外,SQL還允許給表名起別名。
爲什麼要表別名?
①縮短SQL語句
②允許在單條select語句中多次使用相同的表
使用表別名改寫上一章例子中的語句
未改寫前:

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='TNT2';

改寫後:

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='TNT2';

與列別名不同,表別名不返回到客戶機,只在查詢執行中使用。
2 自聯結
使用表別名的主要原因之一是能在單條select語句中不止一次引用相同的表。
舉例:目的:找出某物品的供應商生產的所有物品

方法一:

select prod_name
from products
where vend_id=(select vend_id 
                          from products
                          where prod_id='3' );

方法二:

select p1.prod_id,p1.prod_name
from products as p1,products as p2
where p1.vend_id = p2.vend_id
and p2.prod_id ='3';

如上語句首先聯結兩個表,然後按照第二個表中的prod_id過濾數據,返回所需的數據。
自聯結通常作爲外部語句用來替代從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是相同的, 但有時候處理聯結遠比處理子查詢快的多。
3 自然聯結
無論何時對錶進行聯結,應該至少有一個列出現在不止一個表中(被聯結的列)。
標準的聯結(上一章中介紹的內部聯結)返回所有數據,甚至相同的列多次出現。自然聯結排除多次出現,使每個列只返回一次。系統不完成這項工作,由你自己完成它。通常是通過對錶使用通配符(select *),對其他表的列使用明確的子集來完成的。

select c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price
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='FB';

迄今爲止,我們建立的每個內部聯結都是自然聯結,很可能我們永遠都不會用到不是自然聯結的內部聯結。
4 外部聯結
許多聯結將一個表中的行與另一個表中行相關聯,但有時候會需要包含沒有關聯行的那些行。可能需要使用聯結來完成以下工作:
①對每個客戶下了多少訂單進行計數,包括那些至今尚未下訂單的客戶;
②列出所有產品以及訂購數量,包括沒有人訂購的產品;
③計算平均銷售規模,包括那些至今尚未下訂單的客戶。
聯結包含了那些在相關表中沒有關聯行的行,這種類型的聯結成爲外部聯結。
內部聯結語句:

select customers.cust_id,orders.order_num
from customers INNER JOIN orders
ON customers.cust_id=orders.cust_id;

外部聯結語句:

select customers.cust_id,orders.order_num
from customers LEFT OUTER JOIN orders
ON customers.cust_id =orders.cust_id;

在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關鍵字指定包括其所有行的表(RIGHT指的是OUTER JOIN右邊的表,LEFT指的是左邊的)
左外部聯結可以通過顛倒表的順序來實現
5 使用帶聚集函數的聯結
例子:目的:檢索所有客戶及每個客戶所下的訂單數

select customers.cust_name,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;

6 使用聯結和聯結條件
①注意使用聯結類型。一般使用內部聯結,但使用外部聯結也是有效的。
②應該總是提供聯結條件,否則會得出笛卡爾積

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章