Oracle学习(4)---数据定义语言---分组查询
2016-11-03 00:00
405 查看
摘要: 摘要: Orace数据库学习入门之数据查询
在Oracle数据库中,通过GROUP BY子句将分组的依据加入到查询语句中,
并可使用HAVING子句进一步限制查询结果。主要包括COUNT,AVG,SUM,MAX,
MIN等几个分组函数。
--例1: 分组函数COUNT
结果为:
我们经常习惯地使用SELECT COLUMN FROM TABLE这种方式做数据查询,
如果表记录条数非常庞大的话,比如达到了百万甚至千万级别的数据,这种查
询会花费很长时间输出结果,所以在做SELECT操作之前,可以先使用COUNT计
算一下数据条数,再根据结果做其它操作
--例2: 分组函数AVG、SUM
结果为:
AVG、SUM的计算会自动忽略NULL值
不同,这两个函数可以统计任何数据类型,包括数字、日期和字符。
--例3: 分组函数MAX、MIN
结果为:
分组查询
源码项目地址在Oracle数据库中,通过GROUP BY子句将分组的依据加入到查询语句中,
并可使用HAVING子句进一步限制查询结果。主要包括COUNT,AVG,SUM,MAX,
MIN等几个分组函数。
分组函数的使用
COUNT
COUNT函数用来计算表中的总记录条数。--例1: 分组函数COUNT
SELECT COUNT(*) TOTAL_NUM FROM SCOTT.EMP;
结果为:
我们经常习惯地使用SELECT COLUMN FROM TABLE这种方式做数据查询,
如果表记录条数非常庞大的话,比如达到了百万甚至千万级别的数据,这种查
询会花费很长时间输出结果,所以在做SELECT操作之前,可以先使用COUNT计
算一下数据条数,再根据结果做其它操作
AVG、SUM
这两个函数用来统计列或表达式的平均值和和值。--例2: 分组函数AVG、SUM
SELECT AVG(SAL) AVG_SAL, SUM(SAL) SUM_SAL FROM SCOTT.EMP;
结果为:
AVG、SUM的计算会自动忽略NULL值
MAX、MIN
这两个函数用来取得列的最大值和最小值。和AVG、SUM只能计算数字不同,这两个函数可以统计任何数据类型,包括数字、日期和字符。
--例3: 分组函数MAX、MIN
SELECT MAX(SAL) MAX_SAL, MIN(SAL) MIN_SAL FROM SCOTT.EMP; SELECT MAX(HIREDATE) MAX_HIRE, MIN(HIREDATE) MIN_HIRE FROM SCOTT.EMP;
结果为:
GROUP BY 短语及其子句
> 加入到GROUP BY和HAVING 子句后的SELECT 语句语法格式如下: SELECT <*, column [alias],...> FROM table [WHERE condition(s)] GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column [ASC | DESC]]; 1. ### 单列分组 > 所谓单列分组就是分组的依据是一个列 --例4: 单列分组 --按部门分组,计算每个部门的平均薪水、薪水总和、最高、最低 --薪水以及该部门下的员工人数 SELECT DEPTNO, AVG(SAL) AVG_SAL, SUM(SAL) SUM_SAL FROM SCOTT.EMP GROUP BY DEPTNO; SELECT DEPTNO, MAX(SAL) MAX_SAL, MIN(SAL) MIN_SAL, COUNT(*) COUNT_NUM FROM SCOTT.EMP GROUP BY DEPTNO; 结果为:
2. ### 多列分组 > 所谓多列分组就是分组的依据是多个列 --例5: 多列分组 --计算每个部门每个职位的平均薪水和最高薪水 SELECT DEPTNO, JOB, AVG(SAL) AVG_SAL, MAX(SAL) MAX_SAL FROM SCOTT.EMP GROUP BY DEPTNO,JOB; 结果为: ![多列分组](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/20.png) 3. ### GROUP BY 语句中的 ROLLUP 操作符 > 使用ROLLUP操作符可以先按照预定的字段分组,再计算分组计算后每行的小计, 相当于对于每行数据又执行了一次组函数的操作。 --例6: GROUP BY 语句中的 ROLLUP 操作符 SELECT DEPTNO, JOB, AVG(SAL) AVG_SAL FROM SCOTT.EMP GROUP BY ROLLUP (DEPTNO,JOB); 结果为: ![GROUP BY 语句中的ROLLUP操作符](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/21.png) 4. ### GROUP BY 语句中的 CUBE 操作符 > 和 ROLLUP 操作符类似, CUBE 操作符也是为了计算分组后的小计结果, 除了可以像 ROLLUP 一样横向小计外,还可以生成纵向小计。小计的原则任然 是根据所用的分组函数。 --例7: GROUP BY 语句中的 CUBE 操作符 SELECT DEPTNO, JOB, AVG(SAL) AVG_SAL FROM SCOTT.EMP GROUP BY CUBE (DEPTNO,JOB); 结果为: ![GROUP BY 语句中的 CUBE 操作符](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/23.png) ![GROUP BY 语句中的 CUBE 操作符](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/22.png) 5. ### 使用 HAVING 子句限制分组结果 > HAVING 子句用来对分组后的结果进一步限制,比如按部门分组后,得到每个部门的 最高薪水,只有最高薪水大于4000的记录才能被输出显示 --例8: 使用 HAVING 子句限制分组结果 SELECT DEPTNO, MAX(SAL) MAX_SAL FROM SCOTT.EMP GROUP BY DEPTNO HAVING MAX(SAL) > 4000; 结果为: ![使用 HAVING 子句限制分组结果](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/24.png) 6. ### 使用分组函数的注意事项 * **首先分组函数只能出现在 SELECT 列表、 HAVING 子句和 ORDER BY 子句中, 尤其注意不能出现在 WHERE 子句中。如果要限制分组结果,只能使用 HAVING 子句** * **另外,分组函数是忽略NULL值的**
相关文章推荐
- Oracle学习(1)---数据定义语言---查询
- Oracle基础学习二之统计函数及分组查询
- Oracle学习(3)---数据定义语言---查询结果排序
- Oracle学习(5)---数据定义语言---连接查询
- Oracle 11g 学习四:多表查询、左右连接、SQL1999语法、统计函数及分组查询
- oracle 10g 学习之多表查询、分组函数(6)
- Oracle学习之路(二):oracle多表查询+分组查询+子查询讲解与案例分析+经典练习题
- oracle学习分组查询子查询
- Oracle基础学习二之统计函数及分组查询
- oracle 学习笔记(3)--使用子查询更新数据
- Oracle学习之查询表的基本信息、主键、外键等
- oracle分组查询
- Oracle学习(六)之 表查询
- oracle查询时通过分组去除重复行,其实这样写更简洁些
- Oracle高级查询语句学习
- Oracle学习记录2(多表查询)
- Oracle学习_2 sql基本查询命令
- Oracle 11g 学习五:子查询,数据更新操作,事务处理和数据伪列
- Oracle学习(6):子查询
- 关于oracle树结构查询 展示 分组,查找父节点,查找子节点问题