1.sql中group by的使用

“group by”从字面上理解就是根据“by”指定的规则对数据进行分组,所谓的分组就是讲一个“数据集”划分成若干个“小区域”,然后进行数据处理。下面看一份原始表

雷小天博客

简单的group by案例

select 类别,sum(数量) as 数量之和

form A

group by 类别

返回结果如下,实际就是分类汇总

雷小天博客

group by和order by的示例

select 类别,sum(数量) as 数量之和

from A

group by 类别

order by sum(数量) desc

返回结果如下表

雷小天博客

group by all示例

select 类别,摘要,sum(数量) as 数量之和

form A

group by all 类别,摘要

示例中则可以指定“摘要”字段,其原因在于“多列分组”,其执行结果如下表

雷小天博客

2.sql中where和having使用

where子句的作用是在对查询进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件过滤出特定的组,也可以使用多个分组标准镜像分组

select 类别,sum(数量) as数量之和 from A
group by 类别
having sum(数量) > 18

示例:having和where的联合使用方法
select 类别,sum(数量) from A
where 数量 gt; 8
group by 类别
having sum(数量) gt; 10

3.单篇文章多条评论SQL案例运用

社区网站案例,单篇文章有多条评论,我想一个SQL语句搞定。一般思路是先查询出所有的文章,再foreach遍历去评论表中根据文章id查询评论数,但是这里不需要,我们只需要在查询字段中虚拟一个commnum评论数的字段。

SELECT
	cy_comment.postid,
	Count(cy_comment.postid) AS commnum,
	cy_post.title
FROM
	cy_comment
INNER JOIN cy_post ON cy_comment.postid = cy_post.id
WHERE
	cy_post.addtime BETWEEN 1519975017
AND 1519975667
GROUP BY
	cy_comment.postid
ORDER BY
	commnum DESC,
	cy_post.addtime DESC
LIMIT 15

文章评论表SQL语句查询前后结果对比,其中postid是文章id,ouid是用户id

雷小天博客

查询出我只需要的id结果集

雷小天博客

还有一种案例被广泛应用,就是某个时间段用户发评论数的排行

SELECT
	cy_oauth_user.id,
	cy_oauth_user.nickname,
	cy_oauth_user.head_img,
	Count(cy_comment.ouid) AS usernum
FROM
	cy_oauth_user
INNER JOIN cy_comment ON cy_comment.ouid = cy_oauth_user.id
WHERE
	cy_comment.date BETWEEN 1480681424
AND 1495988770
GROUP BY
	cy_comment.ouid
ORDER BY
	usernum DESC
LIMIT 12

跟上面类似,usernum是用户评论数,最后结果如下

雷小天博客