1. 程式人生 > >第十六章 創建高級聯結

第十六章 創建高級聯結

sql where 們的 卡爾 類型 不同 custom 可能 工作

學習目的: 了解另外一些聯結類型,包括它們的含義和使用方法,如何對被聯結的表使用別名和聚集函數。 使用表別名: 別名除了用於列名和計算字段外,SQL還允許給表名起別名。這樣做主要有兩個理由:
  • 縮短SQL語句
  • 允許在單個SELECT語句中多次使用相同的表
Q: 對表使用別名 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‘; 應該註意,表別名只在查詢執行中使用。與列別名不一樣,表別名不返回客戶機。 使用不同類型的聯結: 自聯結: 字聯結通常作為外部語句來替代從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是相同的,但有時候處理聯結遠比處理子查詢要快的多。 Q找出供應商(其ID為DTNTR,這裏的ID為prod_id )生產的其他物品。 問題分析: (1)找出prod_id = ‘DTNTR‘的vend_id products表 (2)通過vend_id 找到其生產的其他產品。vendoes表 ##用子查詢的方式 SELECT prod_id, prod_name FROM products WHERE vend_id = (SELECT `vend_id` FROM products WHERE prod_id = ‘DTNTR‘ ); ##用自聯結的方式 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 = ‘DTNTR‘; 自然聯結: 無論何時對表進行聯結,應該至少有一個列出現在不知一個表中(被聯結的列)。標準的聯結(前一章介紹的內部聯結)返回所有數據,甚至相同的列多次出現。自然聯結排除多次出現,使每個列只返回一次。 自然聯結是這樣一種聯結,其中你只能選擇那些唯一的列。這一般是通過對表使用通配符(SELECT *),對所有其他表的列使用明確的子集來完成的。 #自熱聯結(不太明白)返回產品ID為FB的客戶信息和訂單信息。 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‘; 外部聯結: 許多聯結將一個表中的行與另一個表中的行相關聯。但有時候會需要包含沒有關聯行的那些行。例如,可能需要使用聯結來完成以下工作:
  • 對每個客戶下了多少訂單進行計數,包括那些至今尚未下訂單的客戶;
  • 列出所有產品以及訂購數量,包括沒有人訂購的產品;
  • 計算平均銷售規模,包括那些至今尚未下訂單的客戶。
在上述例子中,聯結包含了那些在相關表中沒有關聯行的行。這種類型的聯結稱為外部聯結。 Q:檢索所有客戶,包括那些沒有訂單的客戶。 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指定的是OUTER JOIN左邊的表) 沒有*=操作符,MySQL不支持簡化字符*=和=*的使用,這兩種操作符在其他DBMS中是很流行的。 使用帶聚集函數的聯結: Q: 檢索所有客戶及每個客戶所下的訂單。 SELECT customers.cust_id,customers.cust_name,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 customers.cust_id,customers.cust_name,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; 使用聯結和聯結條件:
  • 註意使用的聯結類型。一般我們使用內部聯結,但使用外部聯結也是有效的。
  • 保證使用正確的聯結條件,否則將返回不正確的數據。
  • 應該總是提供聯結條件,否則得出笛卡爾積。
  • 在一個聯結中可以包含多個表,甚至對於每個聯結可以采用不同的聯結類型。雖然這樣做是合法的,一般也很有用,但應該在一起測試它們前,分別測試每個聯結。這樣做將使故障排除更為簡單。

第十六章 創建高級聯結