SQL Server 基础 之 GROUP BY子句
GROUP BY 子句用于聚合信息
先看个实例,没有使用 GROUP BY 子句
SELECT SalesOrderID,OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43660,43670)
结果: 结果可以得知,有很多重复的列(SalesOrderID)

为什么会出现这种结果了?
查看一下表结构可知,这张表 的主键是个组合主键, 分别有 SalesOrderID 和 SalesOrderDetailID 组成,当我们在 select中只选择SalesOrderID 时,所以会出现上图的结果


再来看使用了 GROUP BY 子句的结果:
SELECT SalesOrderID,OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43660,43670)
GROUP BY SalesOrderID
此时会报错: 显示 OrderQty 列没有包含在 聚合函数 或 GROUP BY 子句中
说明: 当我们在使用 group by 子句的时候, select 中选取的列 要么要包含在 group by 子句中,要么要包含在 聚合函数中
此时我们修改代码:
SELECT SalesOrderID,OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43660,43670)
GROUP BY SalesOrderID,OrderQty
结果: 这个实例包含了 group by 子句,但是没有 聚合函数
再来看看包含聚合函数的实例,通常有四个聚合函数
- SUM()
- MAX()
- MIN()
- COUNT()
在看一下:
SELECT SalesOrderID,SUM(OrderQty) AS TotalOrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43660,43670)
GROUP BY SalesOrderID
结果: 这个才算真正的分组了, 把每个 SalesOrderID 对应的 总OrderQty 显示出来了
先说说 GROUP BY 子句的作用:
它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
通过一个实例说明:
假设数据库中有张表结果如下:

由表中可分析出:
- ManagerID 为 1 的经理 有 3 名员工,其EmployeeID 分别为 2,3,4
- ManagerID 为 4 的经理 有 3 名员工,其EmployeeID 分别为 5,6,7
- ManagerID 为 5 的经理 有 4 名员工,其EmployeeID 分别为 8,9,10,11
- 员工号 EmployeeID 为 1 的员工 对应的 经理 ManagerID 为 NULL, 这点说明这名员工没有与之对应的经理, 可能是公司的总裁之类。
然后使用SQL 进行分析:
SELECT ManagerID, COUNT(*) --选出每个ManagerID,并且该MangerID所对应的数据条数
FROM HumanResources.Employee2
GROUP BY ManagerID --以 ManagerID 分组
结果如下:

说明: ManagerID 为1 有3条数据与之对应
ManagerID 为4 有3条数据与之对应
ManagerID为5 有4条数据与之对应
其中ManagerID 为NULL 的有一条数据与之对应, 假设为 总裁
- 添加HAVING 子句
HAVING 与 Where 语句类似,Where 是在分类之前过滤,而 HAVING 是在分类之后过滤。
如果想对以上返回结果,进行相应条件的搜索,则可以添加HAVING子句,假设这里需要返回 ManagerID 对应数据量 大于 3 的结果,则SQL如下:
SELECT COUNT(*) AS Reposrts
FROM HumanResources.Employee2
GROUP BY ManagerID
HAVING COUNT(*) > 3
结果:

SQL Server 基础 之 GROUP BY子句的更多相关文章
- Sql Server 基础语法
来自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468093.html Sql Server 基础语法 -- 查看数据表 select ...
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- 【SQL Server】SQL Server基础之存储过程
SQL Server基础之存储过程 阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储 ...
- SQL Server 2012 中 Update FROM子句
首先说明一下需求以及环境 创建Table1以及Table2两张表,并插入一下数据 USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.Table1', 'U') ...
- 《SQL Server基础——SQL语句》
SQL Server基础--SQL语句 一.创建和删除数据库: 1.创建数据库(默认化初始值) 格式: CREATE DATABASE 数据库名称 例如: CREATE DATABASE ...
- 数据库开发基础-SQl Server 基础
SQL Server 基础 1.什么是SQL Server SQL:Structured Query Language 结构化查询语言 SQL Server是一个以客户/服务器(c/s)模式访问.使 ...
- Sql Server 基础知识
Sql Server 基础知识: http://blog.csdn.net/t6786780/article/details/4525652 Sql Server 语句大全: http://www.c ...
- SQL Server基础之索引
索引用于快速找出在某个列中有某一特定值的行,不使用索引,数据库必须从第一条记录开始读完整个表,直到找出相关的行.表越大,查询数据所花费的时间越多,如果表中查询的列有一个索引,数据库能快速到达一个位置 ...
- 【SQL server】SQL server基础(二)
一.一些重要的SQL命令 SELECT - 从数据库中提取数据 UPDATE - 更新数据库中的数据 DELETE - 从数据库中删除数据 INSERT INTO - 向数据库中插入新数据 CREAT ...
随机推荐
- hdu 2579 Dating with girls(2)
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2579 Dating with girls(2) Description If you have sol ...
- 如何检测某IP端口是否打开
1.如果你直接到控制面板的管理工具里的服务项里去找telnet的话,那是徒劳无功 的,因为默认根本就没有这一服务.当然,你可以通过如下方式搞定.“控制面 板” 一〉“程序” 一〉“打开或关闭windo ...
- winform 表单正则表达式验证 示例(ValidationRule)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- firebreath 在谷歌和火狐浏览器下的调试 以及打包
在寻找插件开发资料的过程中找到了一个开发浏览器插件的开源项目——firebreath firebreath的安装以及测试我就不再叙述了,可以参考大神的文章 . http://www.blogjava. ...
- Labview实现字符串加密
Labview实现字符串加密 对字符串进行加密,规则是每个字母后移5 位 例如A 变为F,b 变为g,x 变为c,y 变为d- 实现效果 后端实现
- shell操作文件的几条命令:删除最后一列、删除第一行、diff等
删除文件第一行: sed '1d' filename 删除文件最后一列: awk '{print $NF}' filename awk删除重复行的命令:awk '{if (!seen[$0]++) { ...
- VS2013中常用的一些快捷键
1.编辑时需要前后文切换: 需要自己设置为:ctrl+alt +方向键,向前查看,设置为右方向键,向后查看,设置为左方向键 依次选择:工具->选项->环境->键盘-> 2.查看 ...
- windows多线程编程(一)(转)
源出处:http://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022036.html CreateThread:Windows的API函数(SDK函 ...
- python中fork()函数生成子进程分析
python的os module中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程之 间的执行是相互独立的,其执行顺序可 ...
- 命令学习:iftop
iftop显示带宽使用情况 http://riobard.com/2010/04/30/l2tp-over-ipsec-ubuntu/ http://jaseywang.me/2011/12/19/i ...