sql server——分组查询(方法和思想)

思想

先排序在汇总

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关键字之前,我们先来看看系统实现分组查询的原理和逻辑:

映射成SQL语句:

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

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

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

使用GROUP BY 语句注意事项一:

图中使用查询语句,包含一个字段和一个聚合函数为什么会报错呢?

原因,我们把两个字段分开来查询:

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

    与聚合函数一起出现在select后面进行查询的列,只有两种可能性:被聚合 、被分组



多列分组查询

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

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

实现图解:

SQL语句:

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

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



使用HAVING子句

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

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

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

一、那么就按照我们学的where来进行筛选

结果如图:

这个错误告诉了我们:where里面不能出现聚合函数作为条件,失败!

二、既然不能使用聚合函数,那就给聚合函数取一个别名,让它当做一个列

结果如图:

错误原因:原因是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

时间: 2024-11-06 15:18:17

sql server——分组查询(方法和思想)的相关文章

优化SQL Server数据库查询方法

SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优

sql server 分组查询结合日期模糊查询

分组查询: https://www.cnblogs.com/netserver/p/4518995.html 日期格式化格式: http://blog.csdn.net/qq_16769857/article/details/52289627 日期和字符串之间的转换: https://www.cnblogs.com/windphoenix/archive/2013/04/26/3044784.html 日期的模糊查询: https://zhidao.baidu.com/question/5071

SQL Server分组查询某最大值的整条数据(包含linq写法)

想实现如下效果,就是分组后时间最大的那一条数据: 1.SQL SELECT * FROM ( SELECT * , ROW_NUMBER() OVER ( PARTITION BY RIP_GUID ORDER BY RU_CreatedTime DESC ) rn FROM RIP_FlowInfo ) t WHERE t.rn <= 1; 2.LINQ var groupQuery = from t in query group t by t.RIP_Guid into g select n

sql Server分组查询

CREATE TABLE test ( id int primary key not null identity, names varchar(20) ); declare @i int; set @i=1; while(@i<1000) begin insert into test values('t'+cast(@i as varchar(8))); select @i=@i+1; end --方法1 select top 10 * from test where id not in ( -

转载 50种方法优化SQL Server数据库查询

原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷

SQL Server中查询用户的对象权限和角色的方法

--SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_helpuser 'public' -- 查询哪些用户拥有指定的系统role exec sp_helpsrvrolemember 'sysadmin' -- 可查询嵌套role WITH tree_roles as ( SELECT role_principal_id, member_principa

SQL Server数据库查询速度慢的原因和解决方法

问 SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没

SQL Server 分组后取Top N

SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿.冥思苦想,遍查网络,不曾想这竟然是SQL界的一个经典话题.今日将我得来的若干方法列出,抛砖引玉,以期与众位探讨. 正文之前,对示例表结构加以说明. 表SectionTransactionLog,用来记录各部门各项活动的日志表 SectionId,部门Id SectionTransactionTyp

Sql Server参数化查询之where in和like实现详解

来自:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html#wherein 文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where in 参数化 使用临时表实现where in 参数化 like参数化查询 xml和DataTable传参  身为一名小小的程序猿,在日常开发中不可以