天天看點

mysql group by having用法+having where之間的差別+group by按日期分組統計的查詢 以下是count,group by,having的一些用法,以圖書價格表為例

以下是count,group by,having的一些用法,以圖書價格表為例

---所有書籍價格的統計

select sum(price)總價,avg(price)均價,max(price)最高價,min(price)最低價

from titles

---統計where條件的記錄

---business類型書籍價格的統計

select sum(price)總價,avg(price)均價,max(price)最高價,min(price)最低價

from titles where type='business'

--count傳回記錄的條數

--傳回作者共來自幾個州

select count (distinct state)州數 from authors 

select count(au_id) from authors

--傳回表的記錄的條數

select count(*) from authors

select * from titles

--type類型的記錄條數

select count(distinct type) from titles

select count(title_id) from titles

--group by

--傳回各個類别的書籍的統計

select type, sum(price) 總價,avg(price) 均價,max(price) 最高價,min(price) 最低價,

count(*) 條數 from titles group by type

--傳回各個出版社分别出版書籍的數量并排序(降序)

select * from titles

select pub_id, count(*) 數量 from titles group by pub_id order by 數量 desc

---1389出版社出版的書籍數量

select * from titles

select count(*) 數量 from titles where pub_id=1389

--對type,pub_id進行分組統計

select count(*) 數量,type,pub_id from titles group by type,pub_id 

order by 數量 desc

--having篩選組

--傳回類别的均價>15的書籍的統計

select avg(price)均價,type from titles group by type having avg(price)>15

--注:先求平均值,再求均價>15的記錄.

select avg(price) 均價,type from titles

where price>15 group by type

--注:先求價格>15的記錄,再根據類别求其價格>15的均價.

--要傳回平均價格在13到18之間的圖書分類

select avg(price) 均價,type from titles group by type 

having avg(price) between 13 and 18

--傳回出版書籍的數量>=6的出版社編号

select * from titles

select count(*) 數量,pub_id from titles

group by pub_id having count(*)>=6

--傳回作者人數最多的state名字

select * from authors

select top 1 state,count(*)數量 from authors group by state

order by count(*) desc

--傳回business,mod_cook這兩個類别的統計資訊

select * from titles

select type,sum(price) 總價,avg(price) 均價,max(price) 最高價,min(price) 最低價

from titles where type in('business','mod_cook') group by type

--注:先根據where條件将business,mod_cook類别的書籍選出,再進行統計.

select type,sum(price) 總價,avg(price) 均價,max(price) 最高價,min(price) 最低價

from titles group by type having type in('business','mod_cook')

--注:先進行統計,再根據where條件将business,mod_cook類别的書籍選出.

以下是引自另一位網友對having,where差別的描述

####################################################################

having子句與where有相似之處但也有差別,都是設定條件的語句。

在查詢過程中聚合語句(sum,min,max,avg,count)要比having子句優先執行.而where子句在查詢過程中執行優先級别優先于聚合語句(sum,min,max,avg,count)。

簡單說來:

where子句:

select sum(num) as rmb from order where id>10

//隻有先查詢出id大于10的記錄才能進行聚合語句

having子句:

select reportsto as manager, count(*) as reports from employees

group by reportsto having count(*) > 4

以northwind庫為例.having條件表達示為聚合語句。肯定的說having子句查詢過程執行優先級别低于聚合語句。

再換句說話說把上面的having換成where則會出錯。統計分組資料時用到聚合語句。

對分組資料再次判斷時要用having。如果不用這些關系就不存在使用having。直接使用where就行了。

having就是來彌補where在分組資料判斷時的不足。因為where執行優先級别要快于聚合語句。

聚合函數,這是必需先講的一種特殊的函數:

例如SUM, COUNT, MAX, AVG等。這些函數和其它函數的根本差別就是它們一般作用在多條記錄上。

SELECT SUM(population) FROM tablename

這裡的SUM作用在所有傳回記錄的population字段上,結果就是該查詢隻傳回一個結果,即所有

國家的總人口數。 通過使用GROUP BY 子句,可以讓SUM 和 COUNT 這些函數對屬于一組的資料起作用。

當你指定 GROUP BY region 時, 屬于同一個region(地區)的一組資料将隻能傳回一行值.

也就是說,表中所有除region(地區)外的字段,隻能通過 SUM, COUNT等聚合函數運算後傳回一個值.

HAVING子句可以讓我們篩選成組後的各組資料.

HAVING子句在聚合後對組記錄進行篩選

而WHERE子句在聚合前先篩選記錄.也就是說作用在GROUP BY 子句和HAVING子句前

看下面這幾個例子吧:

一、顯示每個地區的總人口數和總面積.

SELECT region, SUM(population), SUM(area)

FROM bbc

GROUP BY region

先以region把傳回記錄分成多個組,這就是GROUP BY的字面含義。分完組後,然後用聚合函數對每組中的不同字段(一或多條記錄)作運算。

二、 顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。

SELECT region, SUM(population), SUM(area)

FROM bbc

GROUP BY region

HAVING SUM(area)>1000000

在這裡,我們不能用where來篩選超過1000000的地區,因為表中不存在這樣一條記錄。

相反,HAVING子句可以讓我們篩選成組後的各組資料.

以下示例使用的資料庫是MySQL 5。

資料表:student

表結構:

Field Name DataType Len

id                int           20

name           varchar    25

major           varchar    25

score           int           20

sex              varchar    20

表資料:

編号/姓名/專業/學分/性别

id   name major     score sex

1    jak    Chinese    40    f

2    rain    Math        89    m

3    leo    Phy          78    f

4    jak    Math         76    f

5    rain    Chinese   56    m

6    leo    Math         97    f

7    jak    Phy          45    f

8    jak    Draw         87    f

9    leo    Chinese    45    f

現在我們要得到一個視圖:

要求查詢性别為男生,并且列出每個學生的總成績:

SQL:

select s.*,sum(s.score) from student s where sex='f' group by s.name

Result:

id   name major     score sex sum(s.score)

1    jak    Chinese    40    f       248

3    leo    Phy         78     f       220

可以看到總共查到有兩組,兩組的學生分别是jak和leo,每一組都是同一個學生,這樣我們就可以使用聚合函數了。

隻有使用了group by語句,才能使用如:count()、sum()之類的聚合函數。

下面我們再對上面的結果做進一步的篩選,隻顯示總分數大于230的學生:

SQL:

select s.*,sum(s.score) from student s where sex='f' group by s.name having sum(s.score)>230

Result:

id   name major     score       sex   sum(s.score)

1    jak    Chinese    40          f       248

可見having于where的功能差不多。

結論:

1.WHERE 子句用來篩選 FROM 子句中指定的操作所産生的行。

2.GROUP BY 子句用來分組 WHERE 子句的輸出。

3.HAVING 子句用來從分組的結果中篩選行。

####################################################################

group by按日期分組統計的查詢

SELECT DATE_FORMAT( timeline, "%Y-%m-%d %H" ) , COUNT( * ) 

FROM test

GROUP BY DATE_FORMAT( timeline, "%Y-%m-%d %H" ) 

查詢某天:timeline, "%Y-%m-%d

某時:timeline, "%Y-%m-%d %H"

其實就是對timeline字段進行處理,然後再對處理後的資料分組

來源:http://www.ithao123.cn/content-735653.html