sql server——分组查询

sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息。而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算。


 使用Group BY 进行分组查询

--查询男女生的人数

 在没有学习分组查询之前,我们可以安装常规的思路解决查询需求:

 select count(*) from person where sex='男'

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

 那么现在又要个需要时,查询每个班级的总人数

如果按照常规解决查询,那么我们应该思考的是:

1.每个班级,我们并不知道在表里有哪些班级,那么我们where 后的条件如何写?

2.如果该表里有1000个班组,那么我难道要写一千条where查询语句?

面对这样的问题 sql server为我们准备了Group by 关键字实现分组查询

 在使用介绍Group by关键字之前,我们先来看看系统实现分组查询的原理和逻辑:

 

映射成SQL语句:

select sex ,count(*)  as 人数  from Person group by sex

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

 上面的案例是通过Count()函数进行统计,当然分组汇总还可以使用其他的聚合函数进行汇总。

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

 


 

多列分组查询

 

--实例需求,查询每一个班组,男女生的人数

分析:显然需求是两组,每一个班需要划分组,男女也需要分组

实现图解:

SQL语句:

select  TeamID,sex,COUNT(*)  from student group by TeamID,Sex order by TeamID

经验:搞清楚需要分几组,搞清楚分组的顺序,一轮一轮的分,系统是等分组之后才会进行汇总信息


 

使用HAVING子句

 

演示示例:--查询每一个班级男女生的人数,同时只需要显示人数数量超过1人的记录

分析:此查询显然是对上一个示例的多列分组进行筛选。

 试在这学的知识范围内来解决此查询需求。。。。

解决办法,使用HAVING关键字:

HAVING核心:是对分组统计之后的结果集,进行数据的筛选

SQL语句:

select  TeamId,sex,COUNT(*)  as renshu from Person group by TeamId,Sex  having count(*)>=1 order by TeamId

 

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

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
SQL Server中的分组语句是使用GROUP BY子句来实现的。GROUP BY子句通常与聚合函数一起使用,用于根据一个或多个列对结果集进行分组,并对每个组进行计算。例如,下面是一个示例的SQL语句: SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id; 这个语句将根据vend_id字段对Products表进行分组,并使用COUNT(*)函数计算每个组中的记录数。结果将返回每个vend_id及其对应的记录数。\[1\] 需要注意的是,GROUP BY子句必须在WHERE子句之后使用,而HAVING子句可以在GROUP BY子句之后使用,用于过滤分组后的结果。\[2\]\[3\] #### 引用[.reference_title] - *1* [SQL SERVER 入门进阶教程——数据分组(GROUP BY和HAVING)](https://blog.csdn.net/zefllj/article/details/97523550)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SQL Server分组数据](https://blog.csdn.net/L_ZWge/article/details/124483887)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SQL Server数据分组](https://blog.csdn.net/weixin_50160957/article/details/124465572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值