作為計算欄位使用子查詢
使用子查詢的另一個方法是建立計算欄位。假如需要顯示 customers表中每位顧客的訂單總數。訂單與對應的客戶ID儲存在 orders 表中。
為了執行這個動作,請遵循下面的步驟。
(1) 從 customers 表中檢索客戶清單。
(2) 對於檢索出的每位客戶,統計其在 orders 表中的訂單數目。
如前兩章所述,可使用SELECT COUNT ( *) 對錶中的行進行計數,並且透過提供一條WHERE 子句來過濾某個特定的客戶ID,可僅對該客戶的訂單進行計數。例如,下面的程式碼對客戶10001 的訂單進行計數:
#輸入:
select count(*) as orders from orders where cust_id = 10001;
為了對每個客戶執行COUNT(*) 計算,應該將COUNT(*) 作為子查詢。請看下面的程式碼:
輸入:
select cust_name,cust_state,(select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;
輸出:
分析:這個SELECT 語句對customers 表中每個客戶傳回3 列:cust_name 、 cust_state 和orders 。 orders 是一個計算字段,它是由圓括號中的子查詢建立的。此子查詢對檢索出的每個客戶執行一次。在此範例中,該子查詢執行了5次,因為檢索出了5個客戶。
子查詢中的 WHERE 子句與前面使用的 WHERE 子句稍有不同,因為它使用了完全限定列名(在第4章中首次提到)。下面的語句告訴SQL比較orders 表中的 cust_id 與目前正從 customers 表中檢索的 cust_id :
where orders.cust_id = customers.cust_id
相關子查詢(correlated subquery) 涉及外部查詢的子查詢。這種類型的子查詢稱為相關子查詢。任何時候只要列名可能有多義性,就必須使用這種語法(表名和列名由一個句點分隔)。為什麼這樣?
我們來看看如果不使用完全限定的列名會發生什麼情況:
輸入:
select cust_name,cust_state,(select count(*) from orders where cust_id = cust_id) as orders from customers order by cust_name;
輸出:
#分析:顯然,回傳的結果不正確(請比較前面的結果),那麼,為什麼會這樣呢?有兩個 cust_id 列,一個在 customers 中,另一個在orders 中,需要比較這兩個列以正確地將訂單與它們相應的顧客匹配。如果不完全限定列名,MySQL將假定你是對 orders 表中的 cust_id 進行自身比較。而 SELECT COUNT(*) FROM orders WHERE cust_id = cust_id;總是傳回 orders 表中的訂單總數(因為MySQL查看每個訂單的 cust_id是否與本身相符,當然,它們總是匹配的)。
雖然子查詢在建構這個 SELECT 語句時極有用,但必須注意限制有歧義義性的列名。
不只一種解決方案 如本章前面所述,雖然這裡給出的範例程式碼運作良好,但它並不是解決這種資料檢索的最有效的方法。在後面的章節我們還要遇到這個例子。
逐漸增加子查詢來建立查詢 用子查詢測試和調試查詢很有技巧性,特別是在這些語句的複雜性不斷增加的情況下更是如此。用子查詢建立(和測試)查詢的最可靠的方法是逐漸進行,這與MySQL處理它們的方法非常相同。首先,建立和測試最內層的查詢。然後,用硬編碼資料建立和測試外層查詢,並且僅在確認它正常後才嵌入子查詢。這時,再次測試它。對於要增加的每個查詢,重複這些步驟。這樣做只為構造查詢增加了一點點時間,但節省了以後(找出查詢為什麼不正常)的大量時間,並且大大提高了查詢一開始就正常工作的可能性。
【相關推薦】
1.什麼是mysql子查詢?如何利用子查詢進行過濾?
2.mysql中什麼是聯結和關係表?
3.為什麼使用聯結和如何建立聯結
4.MySQL中WHERE子句重要性和如何聯結多個表
以上是mysql建立計算欄位使用子查詢教學課程的詳細內容。更多資訊請關注PHP中文網其他相關文章!