MySQL必知必會知識預覽 第一章——了解SQL 第二章——MySQL簡介 第三章——使用MySQL 第四章——檢索數(shù)據(jù) 第五章——排序檢索數(shù)據(jù) 第六章——過濾數(shù)據(jù) 第七章——數(shù)據(jù)過濾 第八章——用通配符進行過濾 第九章——用正則表達式進行搜索 第十章——創(chuàng)建計算字段 第十一章——使用數(shù)據(jù)處理函數(shù) 第十二章——匯總數(shù)據(jù) 第十三章——分組數(shù)據(jù) 第十四章——使用子查詢 第十五章——聯(lián)結表 第十六章——創(chuàng)建高級聯(lián)結 第十七章——組合查詢 第十八章——全文本搜索 第十九章——插入數(shù)據(jù) 第二十章——更新和刪除數(shù)據(jù) 第二十一章——創(chuàng)建和操縱表 第二十二章——使用視圖 第二十三章——使用儲存過程 第二十四章——使用游標 第二十五章——使用觸發(fā)器 第二十六章——管理事務處理 第二十七章——全球化和本地化 第二十八章——安全管理 第二十九章——數(shù)據(jù)庫維護 第三十章——改善性能
————————————– 華麗的分隔符 ————————————————–
聚合函數(shù)使用原因 我們常常需要匯總數(shù)據(jù)而不用把它們實際檢索出來,返回實際表數(shù)據(jù)是對時間和處理資源的一種浪費,為此MySQL提供了專門的函數(shù),使用這些函數(shù),MySQL查詢可用于檢索數(shù)據(jù),以便分析和報表生成。利用聚合函數(shù)匯總數(shù)據(jù),比你自己在客戶機應用程序中效率要高得多。 常見的聚合函數(shù)使用場景 1.確定表中的行數(shù)(或者滿足某個條件或者包含某個特定值的行數(shù)) 2.獲取表中行組的和。 3.找出表列的最大值、最小值、平均值。 聚集函數(shù)定義 運行在行組上,計算和返回單個值的函數(shù) 五個聚集函數(shù) 1. AVG() 2. COUNT() 3. MAX() 4. MIN() 5. SUM()
AVG() // 求該列的平均值 select AVG(PRod_price) as avg_price from products; 注意: AVG只能用來確定特定數(shù)值列的平均值,并且列名作為函數(shù)參數(shù)給出,為了獲取多個列的平均值,必須使用多個AVG()函數(shù)。 AVG函數(shù)忽略值為NULL的行。
Count() //進行計數(shù)。 select count(*) as num_cust from customers; select count (cust_email) as num_cust from customers; 
注意: Count 參數(shù)帶不帶引號 //應該為不帶,帶引號的應該為匹配的全部,包括null列 Null值 如果指定列名,則指定列的值為空的行被count()函數(shù)忽略,但如果count(*)則不被忽略。
Max() // 求最大值 select Max(prod_price) as max_price from products; 注意: 對非數(shù)值數(shù)據(jù)使用MAX()函數(shù),雖然MAX()函數(shù)一般用來找出最大的數(shù)值或日期值,但MySQL允許將它用來返回任意列中的最大值,包括返回文本列中的最大值。在用于文本數(shù)據(jù)時,如果數(shù)據(jù)按相應的列排序,則MAX()返回最后一行。 MAX()函數(shù)忽略列值為NULL的行。
Min() //求最小值 規(guī)則同Max函數(shù)
SUM() //用來返回指定列值的和; select sum(quantity) as items_ordered from orderitems where order_num = 20005; select SUM(listprice*unitcost) as total_Prices from orderitems where order_num = 20005; select AVG(distinct pord_price) as avg_price from products where vend_id = 1003; 
注意: 1.利用標準的算術操作符,所有的聚合函數(shù)都可以用來執(zhí)行多個列上的計算。 2.如果是只包含不同的值,指定distinct參數(shù)。(在5.03中添加該功能)。 3.DISTINCT用于count函數(shù)時,必須指定列名,不能用于count(*) 。 4.DISTINCT在聚合函數(shù)中的使用(使用在MAX和MIN中沒有實際意義)。 5.DISTINCT只能使用列名,而不能使用于計算或者表達式。
select vend_id,count(*) as num_prods from products group by vend_id; 
說明:group by 子句,指示MySQL 按照vend_id 排序并分組數(shù)據(jù)。這導致對每個vend_id而不是整個表計算num_prods一次。從輸出中可以看出,供應商1001有3個產(chǎn)品,1002有2個產(chǎn)品。
Group By 子句指示MySQL分組數(shù)據(jù),然后對每個組而不是整個結果集進行聚集。
Group By一些重要的規(guī)定: 1. 可以包含任意數(shù)量的列.這使得能對分組進行嵌套,為數(shù)據(jù)分組提供更細致的控制。 2. 如果在group by子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進行匯總。也就是說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回數(shù)據(jù))。 3. Group By子句中列出的每個列都必須是檢索列,或有效的表達式(但不能是聚合函數(shù))。如果在select中使用表達式,則必須在group By子句中指定相同的表達式,不能使用別名(5.5可以使用別名,而且效率高于不使用別名的)。 4. 除聚集計算語句外,select語句中的每個列都必須在group By 子句中給出(5.5可以使用不打印的列進行分組)。 5. 如果分組具有NULL值,則NULL將作為一個分組返回。如果列中有多個NULL,他們將被分為一組。 6. Group By子句必須出現(xiàn)在where子句之后,order By 子句之前。
Where 與Having的聯(lián)系 上述所學的where子句都可以用having來代替,唯一的差別就是where過濾行,having過濾分組。Having支持所有where操作符(包括通配符條件和帶多個操作符的子句),所學的有關where的所有技術都適用于having,他們的語法是相同的,只是關鍵字有差別。 【5.5 中Where子句中不能使用別名,having中可以使用】
select vend_id,count(*) as num_prods from products group by vend_id having count(*)>=3;//與上述group by 相比較 
Having和where的差別: Where在數(shù)據(jù)分組前進行過濾,having在數(shù)據(jù)分組后進行過濾,這是一個重要的區(qū)別。Where排除的行不包括在分組中,這可能會改變計算值,從而影響having子句中基于這些數(shù)值過濾掉的分組?!菊f明where子句優(yōu)先級高于having】
select vend_id,count(*) as num_prods from products where vend_id>1002 group by vend_id having count(*)>=3;
Having出現(xiàn)則必定有group by出現(xiàn)【having是過濾分組】
Group By(分組) 和 Order By(排序) 
select order_num ,SUM(quantity * item_price) as ordertotal from orderitems Group By order_num Having SUM(quantity*item_price)>=50;
select order_num ,SUM(quantity * item_price) as ordertotal from orderitems Group By order_num Having SUM(quantity*item_price)>=50 order by ordertotal; 
select –>from –>where –>group by –>having –>order by –> limit

新聞熱點
疑難解答