by的sql group by用法!

oracle 中GROUP BY的用法 - 网名还没想好 - 博客园
posts - 207, comments - 21, trackbacks - 0, articles - 2
转自:http://blog.csdn.net/basenet855x/article/details/6694150
select item.itemnum,item.in1,item.in4,inventory.location from item,inventory
where item.itemnum=inventory.itemnum
and inventory.location='DYB'
and item.in1='D/MTD/MRM'
GROUP BY ITEM.ITEMNUM
提示错误是NOT A GROUP BY EXPRESSION
GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想
你用了GROUP BY 按 ITEM.ITEMNUM 这个字段分组,那其他字段内容不同,变成一对多又改如何显示呢,比如下面所示
select A,B from table group by A
你说这样查出来是什么结果,
右边3条如何变成一条,所以需要用到聚合函数,比如
select A,count(B) 数量 from table group by A
这样的结果就是
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
讨论:mysql和oracle对group by的解析是不一样的!
mysql:SELECT s.SName, sc.COUNT(CID) cFROM SC sc JOIN S s ON sc.SID = s. SIDGROUP BY s.SIDHAVING c = ( SELECT COUNT(*) FROM C )oracle:SELECT s.SID, s.SName, sc.COUNT(CID) cFROM&& SC sc JOIN S s ON sc.SID = s.SIDGROUP BY s.SID, s.SNameHAVING c = ( SELECT COUNT(*) FROM C )
大家可以看到区别了,mysql对group by子句的限制有所放宽,除了集合函数之外的被查询字段也可以不参与分组。相反oracle则是严格要求,所以感觉mysql似乎更灵活一些。欢迎大家批评指正5775人阅读
group by 用法解析
group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。
某个员工信息表结构和数据如下:
& id& name& dept& salary& edlevel& hiredate&
&&&&& 1 张三 开发部 9-10-11
&&&&& 2 李四 开发部 9-10-01
&&&&& 3 王五 设计部 0-10-02
&&&&& 4 王六 设计部 0-10-03
&&&&& 5 马七 设计部 0-10-06
&&&&& 6 赵八 销售部 0-10-05
&&&&& 7 钱九 销售部 0-10-07
&&&&& 8 孙十 销售部 0-10-06&
例如,我想列出每个部门最高薪水的结果,sql语句如下:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
查询结果如下:
&&&&& DEPT& MAXIMUM&
&&&&& 开发部 2500
&&&&& 设计部 2600
&&&&& 销售部 3500
解释一下这个结果:
1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY DEPT中包含的列DEPT。
2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”,根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。
注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
例如,查询每个部门的总的薪水数
SELECT DEPT, sum( SALARY ) AS total
FROM STAFF
GROUP BY DEPT
查询结果如下:
DEPT& total&
开发部 4500
设计部 7000
销售部 9600
将 WHERE 子句与 GROUP BY 子句一起使用
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。
例如,查询公司2010年入职的各个部门每个级别里的最高薪水
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE & ''
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
查询结果如下:
& DEPT& EDLEVEL& MAXIMUM&
&&&&& 设计部 4 2300
&&&&& 设计部 5 2600
&&&&& 销售部 5 3000
&&&&& 销售部 7 3500
注意:在SELECT语句中指定的每个列名也在GROUP BY子句中提到。未在这两个地方提到的列名将产生错误。
GROUP BY子句对DEPT和EDLEVEL的每个唯一组合各返回一行。
在GROUP BY子句之后使用HAVING子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY子句后面包含一个HAVING子句。HAVING子句可包含一个或多个用AND和OR连接的谓词。每个谓词将组特性(如AVG(SALARY))与下列之一进行比较:
例如:寻找雇员数超过2个的部门的最高和最低薪水:
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT( * ) &2
ORDER BY DEPT
查询结果如下:
& DEPT& MAXIMUM& MINIMUM&
&&&&& 设计部
&&&&& 销售部
例如:寻找雇员平均工资大于3000的部门的最高和最低薪水:
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING AVG( SALARY ) &3000
ORDER BY DEPT
查询结果如下:
& DEPT& MAXIMUM& MINIMUM&
&&&&& 销售部
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:140210次
积分:3204
积分:3204
排名:第4095名
原创:162篇
评论:87条
(4)(3)(2)(1)(7)(5)(1)(2)(7)(1)(3)(2)(4)(1)(7)(13)(17)(14)(4)(7)(4)(9)(2)(3)(3)(3)(15)(8)(3)(3)(2)(4)(3)&&&&&&&&&&&
--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是&根据(by)一定的规则进行分组(Group)&。--它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。--注意:group by 是先排序后分组;--举例子说明:如果要用到group by 一般用到的就是&每这个字& 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术select DepartmentID as '部门名称',COUNT(*) as '个数' from BasicDepartment group by DepartmentID
--这个就是使用了group by +字段进行了分组,其中我们就可以理解为我们按照了部门的名称ID--DepartmentID将数据集进行了分组;然后再进行各个组的统计数据分别有多少;--如果不用count(*) 而用类似下面的语法select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID
--将会出现错误--消息 8120,级别 16,状态 1,第 1 行--选择列表中的列 'BasicDepartment.DepartmentName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。--这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,--作为分组的依据;要么就要被包含在聚合函数中。--出现的错误详解:咱们看看group by 的执行的过程,先执行select 的操作返回一个程序集,--然后去执行分组的操作,这时候他将根据group by 后面的字段--进行分组,并且将相同的字段并称一列数据,如果group by 后面没有这个字段的话就要分成好多的数据。--但是分组就只能将相同的数据分成两列数据,而一列中又只能放入一个字段,所以那些没有进行分组的--数据系统不知道将数据放入哪里,所以就出现此错误--目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,--所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的--数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate functions)了
--group by all语法解析:--如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。--没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。select DepartmentID,DepartmentName as '部门名称',COUNT(*) as '个数' from BasicDepartment group by all& DepartmentID,DepartmentName
--group by 和having 解释:前提必须了解sql语言中一种特殊的函数:聚合函数,--例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 --WHERE关键字在使用集合函数时不能使用,所以在集合函数中加上了HAVING来起到测试查询结果是否符合条件的作用。&create TABLE Table1&&& (&&&&&&& ID int identity(1,1) primary key NOT NULL,&& &&&&&&& classid int, &&&&&&& sex varchar(10),&&&&&&& age int, &&& ) &&& --添加测试数据&&& Insert into Table1 values(1,'男',20)&&& Insert into Table1 values(2,'女',22)&&& Insert into Table1 values(3,'男',23)&&& Insert into Table1 values(4,'男',22)&&& Insert into Table1 values(1,'男',24)&&& Insert into Table1 values(2,'女',19)&&& Insert into Table1 values(4,'男',26)&&& Insert into Table1 values(1,'男',24)&&& Insert into Table1 values(1,'男',20)&&& Insert into Table1 values(2,'女',22)&&& Insert into Table1 values(3,'男',23)&&& Insert into Table1 values(4,'男',22)&&& Insert into Table1 values(1,'男',24)&&& Insert into Table1 values(2,'女',19
--举例子说明:查询table表查询每一个班级中年龄大于20,性别为男的人数select COUNT(*)as '&20岁人数',classid& from Table1 where sex='男' group by classid,age having age&20 --需要注意说明:当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:--执行where子句查找符合条件的数据;--使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。--having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.--having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。--having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
阅读(...) 评论()connect by的简单用法
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
connect by的简单用法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 sql group by用法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信