SQL必知必會 筆記 第十三章 建立進階連接,sql必知

來源:互聯網
上載者:User

SQL必知必會 筆記 第十三章 建立進階連接,sql必知
13.1使用表別名

別名除了用於列名和計算欄位外,SQL還允許給表明起別名。這樣做有兩個主要理由:
(1)縮短SQL語句
(2)允許在單條SELECT語句中多次使用相同的表。

SELECT cust_name,cust_contactFROM Customers AS C,Orders AS O,OrderItems AS OIWHERE C.cust_id = O.cust_id     AND OI.order_num = O.order_num     AND prod_id = 'RGAN01';

Oracle中沒有AS:Oracle不支援AS關鍵字,為在Oracle中使用別名,可以不用AS,簡單地指定列名即可。

13.2使用不同類型的連接13.2.1自連接
SELECT c1.cust_id,c1.cust_name,c1.cust_contactFROM Customers AS c1,Customers AS c2WHERE c1.cust_name = c2.cust_name     AND c2.cust_contact = 'Jim Jones';

使用自連接而不用子查詢

13.2.2自然連接

無論何時對錶進行連接,應該至少有一個列出現在不止一個表中(被連接的列)。標準的連接返回所有資料,甚至相同的列多次出現。自然連接排除多次出現,使每個列只返回一次。

SELECT C.*,O.order_num,O.order_date,OI.prod_id,OI.quantity,OI.item_priceFROM Customers AS C,Order AS O,OrderItems AS OIWHERE C.cust.id = O.cust.id     AND OI.order_num = O.order_num     AND prod_id = 'RGAN01';
13.2.3外部連接

許多連接將一個表中的行與另一個表中的行相關聯。但有時候會需要包含沒有關聯線的那些行。連接包含了那些在相關表中沒有關聯線的行。這種類型的連接稱為外部連接。
檢索所有使用者及其訂單
內連結

SELECT Customers.cust_id,Orders.order_numFROM Customers INNER JOIN Orders     ON Customer.cust_id = Orders.order_id;

外連接,包括那些沒有訂單的客戶

SELECT Customers.cust_id,Orders.order_numFROM Customers LEFT OUTER JOIN Orders     ON Customer.cust_id = Orders.order_id;

在使用OUTER JOIN文法時必須使用RIGHT或LEFT關鍵字指定包括其所有行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)。
SQL伺服器額外支援一種簡化的外部連接文法。

SELECT Customers.cust_id,Orders.order_numFROM Customers ,Orders     ON Customer.cust_id *= Orders.order_id;

*=左連接 ,=*右連接
OUTER JOIN文法還有另一種形式(僅由Oracle使用),它需要在表明後使用(+)操作符

SELECT Customers.cust_id,Orders.order_numFROM Customers ,Orders     ON Customer.cust_id (+) = Orders.order_id;

全外連接(full outer join),他檢索兩個表中的所有行並關聯那些可以關聯的行。與左外部連接或右外部連接不一樣(他們包含來自一個表的不關聯的行),全外部連接包含來自兩個表的不關聯的行。

SELECT Customers.cust_id,Orders.order_numFROM Customers FULL OUTER JOIN Orders     ON Customer.cust_id = Orders.order_id;
13.3使用帶聚集合函式的連接

內連接

SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ordFROM Customers INNER JOIN Orders     ON Customer.cust_id = Orders.order_idGROUP BY Customers.cust_id;

外連接

SELECT Customers.cust_id,COUNT(Orders.order_num) AS num_ordFROM Customers LEFT OUTER JOIN Orders     ON Customer.cust_id = Orders.order_idGROUP BY Customers.cust_id;
13.4使用連接和連接條件

關於連接及使用的某些要點:
(1)注意所使用的連接類型。一般我們使用內部連接,但使用外部連接也是有效。
(2)關於確切的連接文法,應該查看具體的文檔。
(3)保證使用正確的連接條件,否則將返回不正確的資料。
(4)應該總是提供連接條件,否則會得出笛卡兒積。
(5)在一個連接中可以包含多個表,甚至對於每個連接可以採用不同的連接類型。雖然這樣做是合法的,一般也很有用,但應該在一起測試他們前,分別測試每個連結。這將使故障排除更為簡單。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.