架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10164|回复: 3

[技巧] 分组查询group by的技巧

[复制链接]
发表于 2017-8-4 13:04:14 | 显示全部楼层 |阅读模式
1.group by 单独使用,查询结果只显示一个分组的一条记录。
     SELECT * FROM `employee`; 显示结果
P{17L45P`)~0O`T~NIGWLSB.png
select * from employee group by sex;显示结果
BV1W6TYQQIB[JT2})JCT`(6.png
将只显示两条记录,这个值显然是不正确的,没有使用到集合函数,显示的值只是每一个组的第一条数据。
如果既要分组,也要显示数据,可以考虑使用group_concat()函数,




2.与group_concat()函数一起使用,每个分组中指定字段值显示出

select sex,group_concat(name) from employee group by sex;
69WFHQWGVDZVK9}Q{6J@8V4.png
再通过explode,implode函数的使用拿出数据。
3.与集合函数一起使用,集合函数包括count(),sum(),avg(),max()和min()。
select *,count(sex) as total from employee group by sex;
J41NT(VY8_K80_T`SQ[UTPH.png

4与having一起使用
“having条件表达式”,可以限制输出结果。只有满足条件表达式的结果才显示。
实例:
[color=white !important]
?

select sex,count(sex) from employee group by sex having count(sex) >= 3;


结果:
[color=white !important]
?

1

2

sex | count(sex
男 | 3





having条件表达式”作用于分组后的记录。
5.按多字段进行分组
select  * from employee from group by sex,score;
查询结果先按sex分组,再按score进行分组
6与与with rollup一起使用
使用with rollup将会在所有记录的最后加上一条记录,这条记录是上面所有记录的总和
1

select sex,count(sex) from employee group by sex with rollup;




结果:
[color=white !important]
?

1

2

3

4

sex | count(sex)
女 | 1
男 | 5
null | 6




如果是字符串的话,比如姓名就会生成“张三,李四,王五”这种类型的结果,即name总和。

评分

参与人数 1MB +10 贡献 +5 收起 理由
小渣渣 + 10 + 5 香蕉计划奖励,排版有点问题

查看全部评分





上一篇:抵制济宁任兴路建设快速路合集
下一篇:MySQL中优化sql语句查询常用的几种方法
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-8-4 13:10:17 | 显示全部楼层
having 与where 的异同点

                    having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写
                    where针对表中的列发挥作用,查询数据
                    having对查询结果中的列发挥作用,筛选数据
                    #查询本店商品价格比市场价低多少钱,输出低200元以上的商品
                    select goods_id,good_name,market_price - shop_price as s from goods having s>200 ;
                    //这里不能用where因为s是查询结果,而where只能对表中的字段名筛选
                    如果用where的话则是:
                    select goods_id,goods_name from goods where market_price - shop_price > 200;

                    #同时使用where与having
                    select cat_id,goods_name,market_price - shop_price as s from goods where cat_id = 3 having s > 200;
                    #查询积压货款超过2万元的栏目,以及该栏目积压的货款
                    select cat_id,sum(shop_price * goods_number) as t from goods group by cat_id having s > 20000
                    #查询两门及两门以上科目不及格的学生的平均分
                          思路:
                            #先计算所有学生的平均分
                             select name,avg(score) as pj from stu group by name;
                            #查出所有学生的挂科情况
                            select name,score<60 from stu;
                                    #这里score<60是判断语句,所以结果为真或假,mysql中真为1假为0
                            #查出两门及两门以上不及格的学生
                            select name,sum(score<60) as gk from stu group by name having gk > 1;
                            #综合结果
                            select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk >1;
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-8-4 17:47:19 | 显示全部楼层
QQ截图20170804174704.jpg

这个可以插入代码
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-8-7 13:47:02 | 显示全部楼层
楼主 group by 后查*  不报错?
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 20:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表