11 SQL中的GroupBy (Group by in sql server)

GroupBy 语句用来对选择的结果进行分组,GroupBy通常和聚合函数一起使用。比如有下面的一张表:

如果我们要将其按照City分组,并且计算出每个City的工资总和的话,可以使用下面的语句:

SELECT [City],SUM([Salary]) AS TotalSalary
  FROM [Sample].[dbo].[tblEmployee]
GROUP BY [City]

下面是执行结果:

这里有一点要注意的是:如果我们不写Group By 语句,那么上面的代码会报错。原因很简单既然我们想用SUM函数来求和,那么我们应该指定如何对其分组。

Msg 8120, Level 16, State 1, Line 2
Column ‘Sample.dbo.tblEmployee.City‘ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

下面,我们更进一步。上面的代码演示了根据City对结果进行分组,并求出每一组City的工资总和。现在我们还想在这个基础上再根据性别(Gender)进行分组,也就是说,显示出同一个City中不同性别的人的工资总和。下面的代码可以实现该功能:

SELECT [City],[Gender],SUM([Salary]) AS TotalSalary
  FROM [Sample].[dbo].[tblEmployee]
GROUP BY [City],[Gender]
ORDER BY [City]

下面是查询结果:

在文章的最开始讲到,Group By 语句通常和聚合函数一起使用。前面的例子演示了Group By和SUM函数一起使用,其实我们还可以在查询语句中加入更多的聚合函数。如,我们在第一个例子的基础上还想计算出每个City的员工总数,那么可以使用下面的查询语句:

SELECT [City],[Gender],SUM([Salary]) AS TotalSalary,COUNT(*) AS TotalEmployee
  FROM [Sample].[dbo].[tblEmployee]
GROUP BY [City],[Gender]
ORDER BY [City]

下面是查询结果:

好的,通过上面的几个小例子我们已经了解到了,Group By语句可以和不同的聚合函数配合使用。有朋友可能会问,如果我想对结果进行筛选该怎么实现呢?比如,我们只想要性别为男性(Male)的员工的统计结果,该如何实现?聪明的你一定想到了使用where语句。完全正确!通过where语句可以对查询结果进行筛选,请看下面的示例代码:

SELECT [City],SUM([Salary]) AS TotalSalary,COUNT(*) AS TotalEmployee
  FROM [Sample].[dbo].[tblEmployee]
WHERE [Gender] = ‘Male‘
GROUP BY [City]
ORDER BY [City]

下面是查询结果:

可以看到,通过where语句我们实现了想要的功能:只选出性别为男性的员工,并且根据City进行分组然后计算出总的工资数和总的员工数。

其实,除了用where语句我们还可以用Having子句对查询结果进行筛选,请看下面的代码:

SELECT [City],[Gender],SUM([Salary]) AS TotalSalary,COUNT(*) AS TotalEmployee
  FROM [Sample].[dbo].[tblEmployee]
GROUP BY [City],[Gender]
HAVING [Gender] = ‘Male‘
ORDER BY [City]

下面是运行结果:

同样,我们得到了想要的结果。

那么使用Where子句和Having子句有什么区别呢?总结如下(这也是面试中经常被问到的问题):

  1. Where语句可以被应用在Select、Insert、Update语句中,然而Having子句只能用在Select语句中
  2. Where语句在聚合函数生效之前就对结果集进行了过滤,然而,Having子句是聚合函数生效过后再将结果集进行过滤
  3. 聚合函数不能出现在where子句中,但是聚合函数可以出现在Having子句中
时间: 2024-10-18 14:54:34

11 SQL中的GroupBy (Group by in sql server)的相关文章

sql中having与group by的用法

-------------自己测试--------------- select sname,sum(smon) from student group by sname having sum(smon)>7 ---------------自己测试----------------- 下面是正文 当同时含有where子句.group by 子句 .having子句及聚集函数时,执行顺序如下: 执行where子句查找符合条件的数据: 使用group by 子句对数据进行分组: 对group by 子句形

SQL中order by;group up;like;关联查询join on的用法

排序order by的用法: 1.order by 字段名1 asc/desc, 字段名2 asc/desc,... 先按照字段名1的升序/降续给表进行排列 然后 按照字段名2的升序/降续给表进行排列. 其中排在前面的字段名优先进行排列,排在后面的在前面的基础上在进行排列. 2. order by 字段序号 asc/desc, 字段序号 asc/desc,... 按照字段的序号进行排列,字段的序号就是表中每个字段从左到右依次排列的顺序,从1开始.字段序号对应相应的字段名. 3. asc(升序)/

SQL中=null查询不出结果而is null可以查询结果说明

我们在sql中要查询某列值为null的所有结果集时,查询条件应该这样写select * from 表 where 字段 is null而使用select * from 表 where 字段 = null是查不到正确的结果的.那这是为什么呢?要清楚为什么,就需要了解sql中的三值逻辑了.在SQL中逻辑表达式的可能值包括TRUE.FALSE和UNKNOWN,它们被称之为三值逻辑. 我们知道,在其它的语言中,逻辑表达式只有两种,要么是true,要么就是false.而sql中却存在第三个逻辑表达式UnK

SQL 中OPENQUERY的使用

原文:SQL 中OPENQUERY的使用 OpenQuery 是SQL Server用来与其他Server交互的一种技术,通过OpenQuery,SQL Server 可以直接访问其他数据库资源. 而其他数据库在OpenQuery 表达式中是以Linked Server 存在的. 使用sp_linkedservers 可以找到当前数据库的所有linked server. 例如在sql server 2008数据库中通过链接服务器想访问sql server 2000 的数据库就必须使用OpenQu

ABAP 7.50 新特性 – Open SQL中的宿主表达式和其它表达式

在长期的停滞后,Open SQL的发展终于从沉睡中醒来.从ABAP 7.40开始,SAP推进了某些关键的改变,以尽可能地包含SQL92中的特性,并提供与ABAP CDS中的DDL里面的SELECT一样的功能给Open SQL.为了实现这些目标,ABAP运行时环境中引入了一个新的SQL parser作为Open SQL的新基础.结果就是,Open SQL现在可以在ABAP中扮演一些和以往不同的角色了. 虽然在7.40之前,Open SQL更多地被视为ABAP语言本身的一部分,但在同时,SQL关键字

SQL中Group By的使用

SQL中Group By的使用 1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简单Group By 示例1 select 类别, sum(数量) as 数量之和 from A group by 类别 返回结果如下表,实际上就是分类汇总. 4.Group By 和 Order By 示例2 select 类别, sum(数量) AS 数量之和 fr

sql中group by使用(转发)

1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函数 8.Having与Where的区别 9.Compute 和 Compute By 1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简单Group

MYSQL:SQL中Group By的使用

1.概述 "Group By"从字面意义上理解就是根据"By"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个"小区域",然后针对若干个"小区域"进行数据处理. 2.原始表 3.简单Group By 示例1 select 类别, sum(数量) as 数量之和 from A group by 类别 返回结果如下表,实际上就是分类汇总. 4.Group By 和 Order By 示例2

SQL中Group By 的使用

1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简单Group By 示例1 select 类别, sum(数量) as 数量之和 from A group by 类别 返回结果如下表,实际上就是分类汇总. 4.Group By 和 Order By 示例2 select 类别, sum(数量) AS 数量之和 from A group by 类别