关于sql 中 group by 和 having
今天看到园里一篇文章(http://www.cnblogs.com/sheldon-lou/p/4881230.html)中面试中有关sql 查询方面的问题,
想想自己从上大学就学习数据库,到后来自己也胡乱的写过一些小SQL,发现每次遇到问题,直接百度,然后Ctrl+C,Ctrl+V,
却也从来没有认真的去想过这个GRUOP BY和HAVING到底是怎么用,或是他们都有些什么用。说来惭愧的很。
创建表(自己瞎写的两个表):
CREATE TABLE Department (
depID varchar(50) NOT NULL ,
depName varchar (50) NOT NULL
) CREATE TABLE Employee (
empID varchar (50) NOT NULL ,
empName varchar (50) NOT NULL ,
depID varchar (50) NOT NULL ,
empSex varchar (50) NULL ,
empAge int NULL
)
插入数据:
insert into Department(depID,depName) values('','技术部')
insert into Department(depID,depName) values('','流通部')
insert into Department(depID,depName) values('','采编部')
insert into Employee(empID,empName,depID,empSex,empAge) values('e0001','张三','','男',35)
insert into Employee(empID,empName,depID,empSex,empAge) values('e0002','李四','','男',30)
insert into Employee(empID,empName,depID,empSex,empAge) values('e0003','王五','','男',28)
insert into Employee(empID,empName,depID,empSex,empAge) values('e0004','清风','','女',32)
insert into Employee(empID,empName,depID,empSex,empAge) values('e0005','秋月','','女',30)
insert into Employee(empID,empName,depID,empSex,empAge) values('e0001','夏荷','','女',25)
多年的学校生活让我懒得不能再懒了,以下不少内容也是来自于网络,如有累同,勿怪。
1. GROUP BY :group by将数据行分组,然后用聚组函数返回每一个组的汇总信息。
比如对于人员管理来说:我想查查各个部门多少人?
select a.depName,count(*) from Department a,Employee b
where a.depID=b.depID
group by a.depName
结果
003 采编部 2
001 技术部 2
002 流通部 2
这个是 依据(GROUP BY)部门名称(depName)来分组。
当然,如果这样的话是行不通的:
select a.depName,count(*) from Department a,Employee b
where a.depID=b.depID
group by a.depID 出现这样的错误:列 'a.depName' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中 所以:
在使用group by 时,有一个规则需要遵守,即出现在select列表中的字段,如果没有在组函数中,那么必须出现在group by 子句中。(select中的字段不可以单独出现,必须出现在group语句中或者在组函数中。)
还要注意一点:
当同时含有 where 子句、group by 子句 、having 子句及聚集函数时,执行顺序如下: 1.执行 where 子句查找符合条件的数据;
2.使用 group by 子句对数据进行分组;
3.对 group by 子句形成的组运行聚集函数计算每一组的值;
4.最后用 having 子句去掉不符合条件的组。
2. HAVING:
有人说"限制返回的结果集",但我更喜欢这个解释:"在分组之后过滤数据"
还是例子说话:
select a.depName,count(*) from Department a,Employee b
where a.depID=b.depID
group by a.depName
having a.depName like'采%'
结果也只有一条: 003 采编部 2
当然,如果我想查岁数大于30的如果呢?
select a.depName,count(*) from Department a,Employee b
where a.depID=b.depID
group by a.depName
having b.empAge>30
这个显然是行不通的:
1.分完组后,里面是没有empAge这个字段的,故也不可能按此字段过滤数据。
2.前面提到了,先查数据,再分组,最后过滤。
其实我最想说的是下面这段话(不是我说的):
where: 在分组前进行过滤数据;
group by: 在分组前查询后,先排序再分组;
having: 在分组后进行过滤数据。
关于sql 中 group by 和 having的更多相关文章
- MYSQL:SQL中Group By的使用
SQL中Group By的使用 1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By ...
- 转载:SQL中Group By 的常见使用方法
SQL中Group By 的常见使用方法 转载源:http://www.cnblogs.com/wang-meng/p/5373057.html 前言今天逛java吧看到了一个面试题, 于是有了今天 ...
- sql中group by用来干嘛的
sql中group by用来干嘛的 一.总结 一句话总结: 1.group by用来分类汇总的,by后面接要分的类 2.group by既然是分类汇总,那就要和聚合函数结合使用,因为要汇总啊 3.ha ...
- sql中group by 和having 用法解析
--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的 ...
- sql中group by
某图书馆收藏有书籍具有不同的出版年份,管理员需要做一下统计工作: (1)每一年书籍的数目,如: 2000年有10本书, 2001年有5本书... (2)每一种书籍的数目,如: 西游记有10本, 三国演 ...
- SQL中group by后面的having中不能使用别名
如下图中,SQL中需要对group by的结果使用having进行过滤,不能使用select中定义的别名,需要使用查询字段的原始名.否则会报错,列明未定义. 下图未错误演示: 修改后,正确的SQL语句 ...
- SQL中Group By的使用
1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...
- SQL中Group By 的使用
1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...
- [数据库]SQL中Group By 的常见使用方法.
前言今天逛java吧看到了一个面试题, 于是有了今天这个文章, 回顾下Group By的用法.题目如下:Select name from table group by name having coun ...
- 【转】SQL中Group By的使用
1.概述 2.原始表 3.简单Group By 4.Group By 和 Order By 5.Group By中Select指定的字段限制 6.Group By All 7.Group By与聚合函 ...
随机推荐
- MD5随机散列加密算法
项目中需要在登录验证用户名.密码的时候对密码进行加密处理,由于是比较商业化的软件,所以安全方面还是必须要考虑的.而使用MD5随机散列加密算法使得密码加密后不可逆,很大程度上提升了安全性.废话不多说,看 ...
- objective-C学习笔记(三)数据成员:属性与实例变量
类型成员 Type Member 结构体 struct 的成员很简单,只有变量. 类的成员就很多了: 数据成员 data member 描述对象(本讲重点) · 实例变量 instance vari ...
- If We Were a Child Again
Description The Problem The first project for the poor student was to make a calculator that can jus ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- COB封装的优势
随着固态照明技术的不断进步,COB(chip-on-board)封装技术得到越来越多的重视,由于COB光源有热阻低,光通量密度高,眩光少,发光均匀等特性,在室内外照明灯具中得到了广泛的应用,如筒灯,球 ...
- 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了
系统关闭窗体的事件顺序为: OnCloseQuery ----> OnClose ----> OnDestroy 下面的代码说明问题: unit Unit3; interface uses ...
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
- What is a good EPUB reader on Linux
Last updated on August 20, 2014 Authored by Adrien Brochard 12 Comments If the habit on reading book ...
- linux技术框架
编程语言 一般使用c或者c++ linux使用 鸟哥私房菜 工具使用 代码编辑source insight,代码编译gcc,代码调试gdb,代码编译组织makefile,命令执行shell,文本编辑n ...
- HDU 1847 Good Luck in CET-4 Everybody!
题解:巴什博弈,2^k+1=3N或2^k2=3N,所以3N为P-position,3N+r为N-position. #include <cstdio> int main(){ int n; ...