HAVing group by的区别

在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 SELECT SUM(population) FROM bbc

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

  通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。

  HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前.

  而 HAVING子句在聚合后对组记录进行筛选。

  让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。

  SQL实例:

  一、显示每个地区的总人口数和总面积: 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子句可以让我们筛选成组后的各组数据.

比如原表数据

id  first_name last_name add city
1	dick1	wei1	长安区1	西安1
2	dick2	wei2	长安区2	西安2
3	dick3	wei3	长安区3	西安3
4	dick4	wei4	长安区4	西安4
5	dick5	wei5	长安区5	西安5
6	dick6	wei6	长安区6	西安6
7	dick7	wei7	长安区7	西安7
8	dick8	wei8	长安区8	西安8
9	dick9	wei9	长安区9	西安9
10	dick10	wei10	长安区10	西安10
11	dick11	wei11	长安区11	西安11
12	dick12	wei12	长安区12	西安12
13	dick13	wei13	长安区13	西安13
14	dick14	wei14	长安区14	西安14
15	dick	wei	weiqu	西安
16	dick	wei	weiqu	西安
17	zhangsan	张三	北门	武汉
18	lily	smith	广东省深圳市	北京
19	lily	smith	广东省深圳市	北京

使用group by语句

select id,city,count(city) as count_city from people GROUP BY city ORDER BY count_city desc;

id  city    count_city
15	西安	2
18	北京	2
2	西安2	1
12	西安12	1
9	西安9	1
6	西安6	1
3	西安3	1
17	武汉	1
13	西安13	1
10	西安10	1
7	西安7	1
4	西安4	1
1	西安1	1
14	西安14	1
11	西安11	1
8	西安8	1
5	西安5	1

使用 having语句结果

select id,city,count(city) as count_city from people GROUP BY city HAVING count(city)>1 ORDER BY count_city desc;
id  city    count_city
18	北京	2
15	西安	2

猜你喜欢

转载自blog.csdn.net/wqbs369/article/details/82797194
今日推荐