分组与分组函数_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2074 | 回复: 0   主题: 分组与分组函数        下一篇 
wayne
注册用户
等级:中校
经验:1690
发帖:221
精华:0
注册:2011-7-21
状态:离线
发送短消息息给wayne 加好友    发送短消息息给wayne 发消息
发表于: IP:您无权察看 2015-7-22 11:12:47 | [全部帖] [楼主帖] 楼主

一、分组:

分组函数可以对行集进行操作,并且为每组给出一个结果。

使用group by column1column2,..columm1,column2进行分组,即column1,column2组合相同的值为一个组

二、常用分组函数: */

AVG([DISTINCT ALL]n)-- 求平均值,忽略空值
COUNT({* [DISTINCT ALL]expr})-- 统计个数,其中expr用来判定非空值(使用*计算所有选定行,包括重复行和带有空值的行)
MAX([DISTINCT ALL]expr)-- 求最大值,忽略空值
MIN([DISTINCT ALL]expr)-- 求最小值,忽略空值
SUM([DISTINCT ALL]n)-- 求和,忽略空值
/*

三、分组函数语法:*/
SELECT [column,] group_function(column),...
FROMtable
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
/*

四、分组函数使用准则:

    DISTINCT 使函数只考虑非重复值,ALL则考虑包括重复值在内的所有值。默认为ALL

  带有expr参数的函数的数据类型可以为CHAR,VARCHAR2,NUMBER,DATE.

所有分组函数都忽略空值。可以使用NVL,NVL2,COALESCE函数代替空值

使用GROUP BY 时,Oralce服务器隐式地按照升序对结果集进行排序。可以使用ORDER BY 更改排序结果。

可以使用NVL 函数强制分组函数包含空值,如:*/
selectavg(nvl(comm,0))from emp;
/*    

五、GROUP BY 子句的语法:

使用GROUP BY 子句可以将表中的行分成更小的组,然后使用分组函数返回每一组的汇总信息*/
SELECTcolumn, group_function(column)
FROMtable
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
GROUPBY--group_by_expression 
即为对哪些列进行分组
/* 

六、GROUP BY 使用准则:

    SELECT 中出现的列,如果未出现在分组函数中,则GROUP BY子句必须包含这些列

    WHERE 子句可以某些行在分组之前排除在外

不能在GROUP BY 中使用列别名

默认情况下GROUP BY列表中的列按升序排列

    GROUP BY 的列可以不出现在分组中

七、分组过滤:

使用having子句

    having使用的情况:

行已经被分组

使用了组函数

满足having子句中条件的分组将被显示

八、演示:*/
--
为数字数据使用AVGSUM方法
SQL>selectmin(sal)as min_sal,max(sal)as max_sal,
2 avg(sal)as avg_sal,sum(sal)as sum_sal
3 from scott.emp;
MIN_SAL MAX_SAL AVG_SAL SUM_SAL
---------- ---------- ---------- ----------
800 5000 2073.21429 29025
--对于数字,字符和日期数据类型,你能使用MINMAX方法
SQL>selectmin(hiredate)as min_hiredate,max(hiredate)as max_hiredate from scott.emp;
MIN_HIRED MAX_HIRED
--------- ---------
17-DEC-80 23-MAY-87
--使用count(*),count(expr),count(distinct expr)
--注意coung(*)包含空值、重复值,count(expr)过滤空值,count(distinct expr)即过滤空值,也过滤重复值
SQL>selectcount(*),count(mgr),count(distinct mgr)from emp;
COUNT(*)COUNT(MGR)COUNT(DISTINCTMGR)
---------- ---------- ------------------
14 13 6
--使用NVL 函数强制分组函数包含空值
SQL>selectavg(comm),avg(nvl(comm,0))from emp;
AVG(COMM)AVG(NVL(COMM,0))
---------- ----------------
550 157.142857
--使用group by 子句来分组
SQL>select job ,avg(sal)from emp groupby job;
JOB AVG(SAL)
--------- ----------
CLERK 1037.5
SALESMAN 1400
PRESIDENT 5000
MANAGER 2758.33333
ANALYST 3000
--GROUP BY 的列可以不出现在分组中
SQL>selectavg(sal)from emp groupby job orderbyavg(sal)desc;
AVG(SAL)
----------
5000
3000
2758.33333
1400
1037.5
--错误的用法,SELECT 中的有些列没有在GROUP BY子句中出现
SQL>select job,avg(sal)from emp;
select job,avg(sal)from emp
*
ERROR at line 1:
ORA-00937:not a single-groupgroupfunction
--使用having子句过滤分组结果
--查询平均工资高于的部门号,及其平均工资。
select deptno,avg(sal)from emp groupby deptno
havingavg(sal)>2000;
--查出平均工资在以上的工种(job)
select job,avg(sal)from emp groupby job havingavg(sal)>2000;
--求人数在人以上的部门
select deptno,count(*)from emp groupby deptno havingcount(*)>5;
--使用分组函数的嵌套
SQL>selectmax(avg(sal))from emp groupby deptno;
MAX(AVG(SAL))
-------------
2916.66667


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论