设为首页 收藏本站
查看: 793|回复: 0

[经验分享] sql server——分组查询(方法和思想)

[复制链接]

尚未签到

发表于 2017-7-13 06:40:32 | 显示全部楼层 |阅读模式
  思想
  先排序在汇总
  sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息。而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算。

  使用GROUP BY进行分组查询
  实例演示
  --查询男女生的人数
  在没有学习分组查询之前,我们可以安装常规的思路解决查询需求:
select count(*) from student where sex='男'

select count(*) from student where sex='女'


  那么现在又要个需要时,查询每个班级的总人数
  如果按照常规解决查询,那么我们应该思考的是:
  1.每个班级,我们并不知道在表里有哪些班级,那么我们where 后的条件如何写?
  2.如果该表里有1000个班级,那么我难道要写一千条where查询语句?
  面对这样的问题 sql server为我们准备了Group by 关键字实现分组查询
  在使用介绍Group by关键字之前,我们先来看看系统实现分组查询的原理和逻辑:
   DSC0000.png
  映射成SQL语句:



select sex ,count(*)  as 人数  from student group by sex
这个简短的语句,经过上图的原理,应该要知道,第一步是先from查询表的所有信息,然后group by根据字段进行分组后在统计汇总


  上面的案例是通过Count()函数进行统计,当然分组汇总还可以使用其他的聚合函数进行汇总。
  使用GROUP BY 语句注意事项一:
   DSC0001.png

  图中使用查询语句,包含一个字段和一个聚合函数为什么会报错呢?
  原因,我们把两个字段分开来查询:
DSC0002.png

  总结:为了保证完整性,系统约定俗成,在使用了聚合函数的查询语句中,除了聚合函数,可以在查询列表上,要出现其他字段,那么该字段就必须为分组字段,而且该字段一定要跟随在GROUP BY关键字后面。
  与聚合函数一起出现在select后面进行查询的列,只有两种可能性:被聚合 、被分组







  多列分组查询
  --实例需求,查询每一个班级,男女生的人数
  分析:显然需求是两组,每一个班需要划分组,男女也需要分组
  实现图解:
DSC0003.png

  SQL语句:



select  GradeId,sex,COUNT(*)  from student group by GradeId,Sex order by GradeId
  经验:搞清楚需要分几组,搞清楚分组的顺序,一轮一轮的分,系统是等分组之后才会进行汇总信息

  使用HAVING子句
  演示示例:--查询每一个班级男女生的人数,同时只需要显示人数数量超过3人的记录
  分析:此查询显然是对上一个示例的多列分组进行筛选。

  试在这学的知识范围内来解决此查询需求。。。。
  一、那么就按照我们学的where来进行筛选
  结果如图:
DSC0004.png

  这个错误告诉了我们:where里面不能出现聚合函数作为条件,失败!
  二、既然不能使用聚合函数,那就给聚合函数取一个别名,让它当做一个列
  结果如图:
DSC0005.png

  错误原因:原因是where是对源数据进行筛选的,也就是对from 后面的表进行筛选,既然是源数据,那么where去源数据表里找一个别名字段,怎么可能会有!所以才会报错
  让我们来探讨一下,这里为什么不能使用where
  1.需求是对分组之后的数据集进行筛选,where只针对数据表原始数据筛选
  2.where关键字显然只能出现一次,而且根据查询的顺序,是先执行where条件筛选后得到的结果集,在进行的group by分组
  解决办法,使用HAVING关键字:
  HAVING核心:是对分组统计之后的结果集,进行数据的筛选
  SQL语句:



select  GradeId,sex,COUNT(*)  as renshu from student  group by GradeId,Sex  having count(*)>=3 order by GradeId
  where和having的不同:where是对原始数据进行筛选,having是对分组时候的数据进行筛选

  查询语句的执行顺序
  在这里引出查询机制里对查询语句里的关键字的执行顺序
  查询关键字家族成员



select  top/distinct 字段列表 from 表列表 where 筛选条件 group by 分组字段列表 having  对分组之后得到的结果集筛选  order by 排序字段列表
  执行顺序:
  1.from
  2.where
  3.group by
  4.having
  5.根据select 关键之后的要显示的字段,进行结果集显示
  6.order by 对最终结果集进行排序
  7.top/dictinct

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393330-1-1.html 上篇帖子: SQL Server-分页方式、ISNULL与COALESCE性能分析(八) 下篇帖子: SQL Server里在文件组间如何移动数据?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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