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是用户评论数,最后结果如下