mysql必知必會-建立高級聯結

使用表別名

使用別名引用被檢索的表列函數

別名除了用於列名和計算字段外,SQL還容許給表名起別名。這樣作
有兩個主要理由:性能

  • 縮短SQL語句;
  • 容許在單條 SELECT 語句中屢次使用相同的表。

能夠看到, FROM 子句中3個表全都具備別名。 customers AS c
創建 c 做爲 customers 的別名,等等。這使得能使用省寫的 c 而
不是全名 customers 。在此例子中,表別名只用於 WHERE 子句。可是,表
別名不只能用於 WHERE 子句,它還能夠用於 SELECT 的列表、 ORDER BY 子句
以及語句的其餘部分。測試

應該注意,表別名只在查詢執行中使用。與列別名不同,表別名
不返回到客戶機ui

使用不一樣類型的聯結

迄今爲止,咱們使用的只是稱爲內部聯結或等值聯結(equijoin)的簡
單聯結。如今來看3種其餘聯結,它們分別是自聯結、天然聯結和外部聯結blog

自聯結

如前所述,使用表別名的主要緣由之一是能在單條 SELECT 語句中不
止一次引用相同的表。下面舉一個例子語法

假如你發現某物品(其ID爲 DTNTR )存在問題,所以想知道生產該物
品的供應商生產的其餘物品是否也存在這些問題。此查詢要求首先找到
生產ID爲 DTNTR 的物品的供應商,而後找出這個供應商生產的其餘物品。
下面是解決此問題的一種方法引用

這是第一種解決方案,它使用了子查詢。內部的 SELECT 語句作
了一個簡單的檢索,返回生產ID爲 DTNTR 的物品供應商的
vend_id 。該ID用於外部查詢的 WHERE 子句中,以便檢索出這個供應商生
產的全部物品方法

如今來看使用聯結的相同查詢:
im

此查詢中須要的兩個表其實是相同的表,所以 products 表在
FROM 子句中出現了兩次。雖然這是徹底合法的,但對 products
的引用具備二義性,由於MySQL不知道你引用的是 products 表中的哪一個
實例。
爲解決此問題,使用了表別名。 products 的第一次出現爲別名 p1 ,
第二次出現爲別名 p2 。如今能夠將這些別名用做表名。例如, SELECT 語
句使用 p1 前綴明確地給出所需列的全名。若是不這樣,MySQL將返回錯
誤,由於分別存在兩個名爲 prod_id 、 prod_name 的列。MySQL不知道想
要的是哪個列(即便它們事實上是同一個列)。 WHERE (經過匹配 p1 中
的 vend_id 和 p2 中的 vend_id )首先聯結兩個表,而後按第二個表中的
prod_id 過濾數據,返回所需的數據。d3

用自聯結而不用子查詢 自聯結一般做爲外部語句用來替代
從相同表中檢索數據時使用的子查詢語句。雖然最終的結果是
相同的,但有時候處理聯結遠比處理子查詢快得多。應該試一
下兩種方法,以肯定哪種的性能更好

天然聯結

不管什麼時候對錶進行聯結,應該至少有一個列出如今不止一個表中(被
聯結的列)。標準的聯結(前一章中介紹的內部聯結)返回全部數據,甚
至相同的列屢次出現。天然聯結排除屢次出現,使每一個列只返回一次。

天然聯結是這樣一種聯結,其中你只能選擇那些惟一的列。這一
般是經過對錶使用通配符( SELECT * ),對全部其餘表的列使用明確的子
集來完成的。下面舉一個例子:

在這個例子中,通配符只對第一個表使用。全部其餘列明確列
出,因此沒有重複的列被檢索出來

事實上,迄今爲止咱們創建的每一個內部聯結都是天然聯結,極可能
咱們永遠都不會用到不是天然聯結的內部聯結

外部聯結

許多聯結將一個表中的行與另外一個表中的行相關聯。但有時候會需
要包含沒有關聯行的那些行

下面的 SELECT 語句給出一個簡單的內部聯結。它檢索全部客戶及其
訂單


SELECT 語句使用了關
鍵字 OUTER JOIN 來指定聯結的類型(而不是在 WHERE 子句中指
定)。可是,與內部聯結關聯兩個表中的行不一樣的是,外部聯結還包括沒
有關聯行的行。在使用 OUTER JOIN 語法時,必須使用 RIGHT 或 LEFT 關鍵字
指定包括其全部行的表( RIGHT 指出的是 OUTER JOIN 右邊的表,而 LEFT
指出的是 OUTER JOIN 左邊的表)。上面的例子使用 LEFT OUTER JOIN 從 FROM
子句的左邊表( customers 表)中選擇全部行。爲了從右邊的表中選擇所

沒有 = 操做符 MySQL不支持簡化字符 = 和 =* 的使用,這兩
種操做符在其餘DBMS中是很流行的。

外部聯結的類型 存在兩種基本的外部聯結形式:左外部聯結
和右外部聯結。它們之間的惟一差異是所關聯的表的順序不
同。換句話說,左外部聯結可經過顛倒 FROM 或 WHERE 子句中
有行,應該使用 RIGHT OUTER JOIN

使用帶彙集函數的聯結

彙集函數用來彙總數據。雖然至今爲止彙集函數
的全部例子只是從單個表彙總數據,但這些函數也能夠與聯結一塊兒使用

此 SELECT 語句使用 INNER JOIN 將 customers 和 orders 表互相關聯。
GROUP BY 子句按客戶分組數據,所以,函數調用 COUNT
(orders.order_num) 對每一個客戶的訂單計數,將它做爲 num_ord 返回

這個例子使用左外部聯結來包含全部客戶,甚至包含那些沒有
任何下訂單的客戶。結果顯示也包含了客戶 Mouse House ,它
有 0 個訂單。

使用聯結和聯結條件

在總結關於聯結的這兩章前,有必要彙總一下關於聯結及其使用的
某些要點。

  • 注意所使用的聯結類型。通常咱們使用內部聯結,但使用外部聯
    結也是有效的。
  • 保證使用正確的聯結條件,不然將返回不正確的數據。
  • 應該老是提供聯結條件,不然會得出笛卡兒積。
  • 在一個聯結中能夠包含多個表,甚至對於每一個聯結能夠採用不一樣
    的聯結類型。雖然這樣作是合法的,通常也頗有用,但應該在一
    起測試它們前,分別測試每一個聯結。這將使故障排除更爲簡單。

本章從講授如何以及爲何要使用 別名開始,而後討論不一樣的聯結類型及對每種類型的聯結使用的各類語 法形式。咱們還介紹瞭如何與聯結一塊兒使用匯集函數,以及在使用聯結 時應該注意的某些問題

相關文章
相關標籤/搜索