使用別名引用被檢索的表列函數
別名除了用於列名和計算字段外,SQL還容許給表名起別名。這樣作
有兩個主要理由:性能
能夠看到, 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 個訂單。
在總結關於聯結的這兩章前,有必要彙總一下關於聯結及其使用的
某些要點。
本章從講授如何以及爲何要使用 別名開始,而後討論不一樣的聯結類型及對每種類型的聯結使用的各類語 法形式。咱們還介紹瞭如何與聯結一塊兒使用匯集函數,以及在使用聯結 時應該注意的某些問題