您的位置:首页 > 数据库 > MySQL

mysql group by having用法+having where之间的区别+group by按日期分组统计的查询

2015-12-23 15:42 766 查看


以下是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, ***G等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

SELECT SUM(population) FROM tablename

这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有

国家的总人口数。 通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。

当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值.

也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.

H***ING子句可以让我们筛选成组后的各组数据.

H***ING子句在聚合后对组记录进行筛选

而WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和H***ING子句前

看下面这几个例子吧:

一、显示每个地区的总人口数和总面积.

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

H***ING SUM(area)>1000000

在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

相反,H***ING子句可以让我们筛选成组后的各组数据.

以下示例使用的数据库是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.H***ING 子句用来从分组的结果中筛选行。

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


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: