如何分組數據,以便能匯總表內容的子集。這涉及兩個新SELECT語句子句,分別是GROUP BY子句和HAVING子句。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、雅安服務器托管、營銷軟件、網站建設、師宗網站維護、網站推廣。
分組允許把數據分為多個邏輯組,以便能對每個組進行聚集計算。
分組是在SELECT語句的GROUP BY 子句中建立的。
來看例子理解:
mysqlselect vend_id,COUNT(*) AS num_prods from products group by vend_id;
也就是不同的Id的商品總數都能分別查出來。
除了能用GROUP BY分組數據外,Mysql還允許過濾分組,規(guī)定包括哪些分組,排除哪些分組。
也就是HAVING子句。
mysqlselect cust_id,COUNT( /) AS orders from orders uGROUP BY/u cust_id uHAVING/u COUNT( /) =2;
注意:這里HAVING換成WHERE是不管用的。HAVING針對于分組。
WHERE在數據分組前進行過濾,HAVING在數據分組后進行過濾。
那么咱么看看怎么混合WHERE和HAVING。
mysqlselect vend_id, COUNT( / ) AS num_prods from products uwhere prod_price=10 group by/u vend_id HAVING COUNT( /) =2;
mysqlselect order_num,SUM(quantity*item_price) AS ordertotal
from orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) =50
order by ordertotal;
/*語法:
select 分組函數 列(要求出現(xiàn)在group by的后面)
from 表
【where 篩選條件】
group by 分組的列表
[order by 子句]
注意:查詢列表必須特殊,要求是分組函數和group by 后出現(xiàn)的字段
特點:
1.分組查詢中篩選條件分為兩類:
數據源 位置 關鍵字
分組前篩選 原始表 group by子句的前面 where
分組后篩選 分組后的結果集 group by子句的后面 having
1.分組函數做條件肯定是放在having子句中
2.能用分組前篩選的,優(yōu)先考慮使用分組前篩選
2.group by 子句支持單個字段、多個字段分組(用逗號隔開沒有順序要求)表達式或函數(用的較少)
3.也可以添加排序(放在整個group by子句之后)
*/
count(1),其實就是計算一共有多少符合條件的行。
1并不是表示第一個字段,而是表示一個固定值。
其實就可以想成表中有這么一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.
同理,count(2),也可以,得到的值完全一樣,count('x'),count('y')都是可以的。一樣的理解方式。在你這個語句理都可以使用,返回的值完全是一樣的。就是計數。
count(*),執(zhí)行時會把星號翻譯成字段的具體名字,效果也是一樣的,不過多了一個翻譯的動作,比固定值的方式效率稍微低一些。
第二節(jié)為大家介紹了數據的查詢,這一小節(jié)為大家深入講解查詢過程中的數據分組和排序,分組關鍵字為:group by,排序關鍵字為:order by,過濾分組的關鍵字為:having;
group by:對查詢的數據按照某一類型進行分組, group by 一般用在order by子句之前,where子句之后
order by:對查詢的數據進行某一類進行排序 或 對分組后的數據進行排序
having:對分組后的數據進行條件過濾
繼續(xù)以上一章創(chuàng)建的客戶表為例,表名: customer ,表有列: cus_id,cus_no,cus_name,cus_age,cus_adds。
eg:查詢客戶的基本信息,以id進行分組: select?cus_id,count(*) as num from?customer group by?cus_id;? num表示對應的cus_id有多少客戶數據, 查詢結果如下
如果分組的列中有null值,那么null將作為一個分組返回,如果有多個行都為null值,它們將會被分為一組返回。 group by 必須用在where子句之后,order by子句之前。
除group by可以進行分組過濾數據外,having也可以進行過濾分組;having過濾和where類似,唯一區(qū)別在于where是過濾行,而having是過濾分組,可看以下列子:
eg: 查詢以id分組后數據總量兩條以上的數據: select?cus_id,count(*) as num from?customer group by?cus_id having count(*)?= '2'; 滿足條件的就只有一條數據
order by主要用于數據排序的情況,當查詢數據量較大時,有序的數據會讓人更好地直觀觀察數據,order by 關鍵字用于對結果集按照一個列或者多個列進行排序。此外order by 關鍵字默認按照升序對記錄進行排序。如果需要按照降序對記錄進行排序,您可以使用 DESC 關鍵字。使用方法如下
eg:查詢客戶的基本信息,以年齡進行排序,默認升序:select?* from?customer order?by?cus_age;
eg:查詢客戶的基本信息,以年齡進行排序,降序方式排序:select?* from?customer?order?by?cus_age DESC;
升序使用ASC,降序使用DESC,系統(tǒng)默認為升序。注意兩者之間的差異
當對多個列進行排序時,order by使用方法如下:
order by A,B? ?--過濾數據都是默認按升序排列
order by A desc,B? ?--過濾數據時 A 降序,B 升序排列
order by A ,B desc? ?--過濾數據時 A 升序,B 降序排列
desc?或者?asc?只對它緊跟著的第一個列名有效,其他不受影響,仍然是默認的升序。
本小節(jié)介紹排序分組就到這里了,通過多分組排序的介紹,知道了group by,order by,having三者之間的差異和區(qū)別,大家可以在自己電腦多編寫幾個腳本,深入了解三個關鍵字的使用。
group 字段分組查詢,也可以理解為去除重復,使用group關鍵字可以根據你給的字段查詢符合條件的記錄 !
舉個例子 一個班級 42個同學 ,分為7個小組 每個小組的編號分別為1234567 每個學習成績分數好的作為小組的組長,那么 你使用group關鍵字以小組編號字段做分組依據 排序order以成績好的排序 那么這條語句的返回結果應該是 7條數據 7條數組分別是每個組的成績最好的那個組長;能理解嗎