mysql創(chuàng)建計算字段使用子查詢圖文說明教程
發(fā)表時間:2023-08-31 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]作為計算字段使用子查詢使用子查詢的另一方法是創(chuàng)建計算字段。假如需要顯示 customers表中每個客戶的訂單總數(shù)。訂單與相應(yīng)的客戶ID存儲在 orders 表中。為了執(zhí)行這個操作,遵循下面的步驟。(1) 從 customers 表中檢索客戶列表。(2) 對于檢索出的每個客戶,統(tǒng)計其在 orders...
作為計算字段使用子查詢使用子查詢的另一方法是創(chuàng)建計算字段。假如需要顯示 customers表中每個客戶的訂單總數(shù)。訂單與相應(yīng)的客戶ID存儲在 orders 表中。
為了執(zhí)行這個操作,遵循下面的步驟。
(1) 從 customers 表中檢索客戶列表。
(2) 對于檢索出的每個客戶,統(tǒng)計其在 orders 表中的訂單數(shù)目。
正如前兩章所述,可使用 SELECT COUNT ( *) 對表中的行進行計數(shù),并且通過提供一條 WHERE 子句來過濾某個特定的客戶ID,可僅對該客戶的訂單進行計數(shù)。例如,下面的代碼對客戶 10001 的訂單進行計數(shù):
輸入:
select count(*) as orders from orders where cust_id = 10001;
為了對每個客戶執(zhí)行 COUNT(*) 計算,應(yīng)該將 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 是一個計算字段,它是由圓括號中的子查詢建立的。該子查詢對檢索出的每個客戶執(zhí)行一次。在此例子中,該子查詢執(zhí)行了5次,因為檢索出了5個客戶。
子查詢中的 WHERE 子句與前面使用的 WHERE 子句稍有不同,因為它使用了完全限定列名(在第4章中首次提到)。下面的語句告訴SQL比較orders 表中的 cust_id 與當前正從 customers 表中檢索的 cust_id :
where orders.cust_id = customers.cust_id
相關(guān)子查詢(correlated subquery) 涉及外部查詢的子查詢。這種類型的子查詢稱為相關(guān)子查詢。任何時候只要列名可能有多義性,就必須使用這種語法(表名和列名由一個句點分隔)。為什么這樣?
我們來看看如果不使用完全限定的列名會發(fā)生什么情況:
輸入:
select cust_name,cust_state,(select count(*) from orders where cust_id = cust_id) as orders from customers order by cust_name;
輸出:
分析:顯然,返回的結(jié)果不正確(請比較前面的結(jié)果),那么,為什么會這樣呢?有兩個 cust_id 列,一個在 customers 中,另一個在orders 中,需要比較這兩個列以正確地把訂單與它們相應(yīng)的顧客匹配。如果不完全限定列名,MySQL將假定你是對 orders 表中的 cust_id 進行自身比較。而 SELECT COUNT(*) FROM orders WHERE cust_id = cust_id;總是返回 orders 表中的訂單總數(shù)(因為MySQL查看每個訂單的 cust_id是否與本身匹配,當然,它們總是匹配的)。
雖然子查詢在構(gòu)造這種 SELECT 語句時極有用,但必須注意限制有歧義性的列名。
不止一種解決方案 正如本章前面所述,雖然這里給出的樣例代碼運行良好,但它并不是解決這種數(shù)據(jù)檢索的最有效的方法。在后面的章節(jié)中我們還要遇到這個例子。
逐漸增加子查詢來建立查詢 用子查詢測試和調(diào)試查詢很有技巧性,特別是在這些語句的復雜性不斷增加的情況下更是如此。用子查詢建立(和測試)查詢的最可靠的方法是逐漸進行,這與MySQL處理它們的方法非常相同。首先,建立和測試最內(nèi)層的查詢。然后,用硬編碼數(shù)據(jù)建立和測試外層查詢,并且僅在確認它正常后才嵌入子查詢。這時,再次測試它。對于要增加的每個查詢,重復這些步驟。這樣做僅給構(gòu)造查詢增加了一點點時間,但節(jié)省了以后(找出查詢?yōu)槭裁床徽#┑拇罅繒r間,并且極大地提高了查詢一開始就正常工作的可能性。
【相關(guān)推薦】
1.什么是mysql子查詢?如何利用子查詢進行過濾?
2.mysql中什么是聯(lián)結(jié)和關(guān)系表?
3.為什么使用聯(lián)結(jié)和如何創(chuàng)建聯(lián)結(jié)
4.MySQL中WHERE子句重要性和如何聯(lián)結(jié)多個表
以上就是mysql創(chuàng)建計算字段使用子查詢教程的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學習教程快速掌握從入門到精通的SQL知識。