萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> 分組查詢GROUP BY用法例子詳解

分組查詢GROUP BY用法例子詳解

GROUP BY在mysql中是分組查詢了,那麼你對於GROUP BY有了解多少呢,下面我們來看一篇關於GROUP BY使用例子,具體的細節如下所示。

在SQL中使用GROUP BY來對SELECT的結果進行數據分組,在具體使用GROUP BY之前需要知道一些重要的規定。

1、GROUP BY子句可以包含任意數目的列。也就是說可以在組裡再分組,為數據分組提供更細致的控制。
2、如果在GROUP BY子句中指定多個分組,數據將在最後指定的分組上匯總。
3、GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數)。如果在SELECT中使用了表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。
4、出了聚集計算語句外,SELECT語句中的每一列都必須在GROUP BY子句中給出。
5、如果分組列中有NULL值,則NULL將作為一個分組返回。如果有多行NULL值,它們將分為一組。
6、GROUP BY子句必須在WHERE子句之後,ORDER BY之前。

過濾分組

對分組過於采用HAVING子句。HAVING子句支持所有WHERE的操作。HAVING與WHERE的區別在於WHERE是過濾行的,而HAVING是用來過濾分組。

另一種理解WHERE與HAVING的區別的方法是,WHERE在分組之前過濾,而HAVING在分組之後以每組為單位過濾。

分組與排序

一般在使用GROUP BY子句時,也應該使用ORDER BY子句。這是保證數據正確排序的唯一方法。

SQL SELECT語句的執行順序:

1、from子句組裝來自不同數據源的數據;
2、where子句基於指定的條件對記錄行進行篩選;
3、group by子句將數據劃分為多個分組;
4、使用聚集函數進行計算;
5、使用having子句篩選分組;
6、計算所有的表達式;
7、使用order by對結果集進行排序;
8、select 集合輸出。

舉個例子吧

select 考生姓名, max(總成績) as max總成績
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(總成績) > 600
order by max總成績

在上面的示例中 SQL 語句的執行順序如下:

1、首先執行 FROM 子句, 從 tb_Grade 表組裝數據源的數據
2、執行 WHERE 子句, 篩選 tb_Grade 表中所有數據不為 NULL 的數據
3、執行 GROUP BY 子句, 把 tb_Grade 表按 "學生姓名" 列進行分組
4、計算 max() 聚集函數, 按 "總成績" 求出總成績中最大的一些數值
5、執行 HAVING 子句, 篩選課程的總成績大於 600 分的.
6、執行 ORDER BY 子句, 把最後的結果按 "Max 成績" 進行排序.

例子

有數據表 comments
------------------------------------------------
| id | newsID | comment | theTime |
------------------------------------------------
| 1  |        1      |         aaa    |     11       |
------------------------------------------------
| 2  |        1      |         bbb    |     12       |
------------------------------------------------
| 3  |        2      |         ccc     |     12       |

------------------------------------------------

newsID是新聞ID,每條新聞有多條評論comment,theTime是發表評論的時間

現在想要查看每條新聞的最新一條評論:

select * from comments group by newsID 顯然不行

select * from comments group by newsID order by theTime desc 是組外排序,也不行

下面有兩種方法可以實現:

(1)
selet tt.id,tt.newsID,tt.comment,tt.theTime from( 
select id,newsID,comment,theTime from comments order by theTime desc) as tt group by newsID

(2)
select id,newsID,comment,theTime from comments as tt group by id,newsID,comment,theTime having
 theTime=(select max(theTime) from comments where newsID=tt.newsID)

copyright © 萬盛學電腦網 all rights reserved