OCA/OCP Oracle 数据库12c考试指南读书笔记:第9章: Group Functions

本文主要是介绍OCA/OCP Oracle 数据库12c考试指南读书笔记:第9章: Group Functions,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一章讲了单行函数,就是对于结果集中的每一行只返回一个值。而本章介绍的多行函数是针对多行执行操作,称为Group或Aggregate函数。通常用于报表。

描述Group函数

单行函数:
F(x, y, z, . . .) = result
Group函数:
F(g1, g2, g3, . . . , gn) = result1, result2, result2, . . . , resultn

select count(*), department_id, from employees order by department_id group by department_id;

group函数每次只针对一个集合操作;并且绝大多数不支持NULL。

使用Group函数

AVG, SUM, MIN, MAX, COUNT, STDDEV和VARIANCE,都返回数字值。此外,MAX和MIN还可以返回字符或日期。
除COUNT在某些情况下允许操作控制外,其它函数均不允许。

COUNT

COUNT ({ * | [DISTINCT|ALL] expr})
如果指定了列名,则不会计算空值。否则会计算,如count(1),count(*)

SUM

SUM ({ [DISTINCT|ALL] expr}),不计入空值

AVG

AVG ({ [DISTINCT|ALL] expr}),不计入空值

STDDEV 和 VARIANCE

STDDEV表示standard deviation,中文为标准差或均方差。标准差是一组数值自平均值分散开来的程度的一种测量观念。一个较大的标准差,代表大部分的数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值。
STDEDEV先算出平均值,然后用每一个值减去平均值后求平方根,平方根求和后除以N-1。

SQL> select salary from employees where department_id = 90;SALARY
----------240001700017000SQL> select avg(salary), variance(salary), stddev(salary) from employees where department_id = 90;AVG(SALARY) VARIANCE(SALARY) STDDEV(SALARY)
----------- ---------------- --------------19333.3333       16333333.3     4041.45188
MAX和MIN

不考虑控制。可操作字符串,数字和日期。

LISTAGG

返回拼接的串,可以指定分隔符,可以排序。
对所有行操作,但只返回一行。例如:

SQL> select * from countries order by region_id, country_name desc;CO COUNTRY_NAME                              REGION_ID
-- ---------------------------------------- ----------
UK United Kingdom                                    1
CH Switzerland                                       1
NL Netherlands                                       1
IT Italy                                             1
DE Germany                                           1
FR France                                            1
DK Denmark                                           1
BE Belgium                                           1
US United States of America                          2
MX Mexico                                            2
CA Canada                                            2
BR Brazil                                            2
AR Argentina                                         2
SG Singapore                                         3
ML Malaysia                                          3
JP Japan                                             3
IN India                                             3
CN China                                             3
AU Australia                                         3
ZW Zimbabwe                                          4
ZM Zambia                                            4
NG Nigeria                                           4
KW Kuwait                                            4
IL Israel                                            4
EG Egypt                                             425 rows selected.-- 返回一行
SQL> select listagg(country_name, ',') within group (order by region_id, country_name desc) countries from countries;COUNTRIES
--------------------------------------------------------------------------------
United Kingdom,Switzerland,Netherlands,Italy,Germany,France,Denmark,Belgium,Unit
ed States of America,Mexico,Canada,Brazil,Argentina,Singapore,Malaysia,Japan,Ind
ia,China,Australia,Zimbabwe,Zambia,Nigeria,Kuwait,Israel,Egypt-- 返回多行
SQL> select listagg(country_name, ',') within group (order by country_name desc) Countries,count(*) "# per Region"  from countries group by region_id;COUNTRIES                                                                        # per Region
-------------------------------------------------------------------------------- ------------
United Kingdom,Switzerland,Netherlands,Italy,Germany,France,Denmark,Belgium                 8
United States of America,Mexico,Canada,Brazil,Argentina                                     5
Singapore,Malaysia,Japan,India,China,Australia                                              6
Zimbabwe,Zambia,Nigeria,Kuwait,Israel,Egypt                                                 6

Group by 子句

group是共享某一属性的数据子集,属性通常是一列,也可以是多列或表达式。group的数量取决于唯一属性值的数量。
group by位于where之后,order by之前
Any item in the SELECT list that is not a group function must be a grouping attribute of the GROUP BY clause.
Note that only grouping attributes and group functions are permitted in the SELECT clause when using GROUP BY.

SQL> select  department_id, max(salary), count(*) from employees group by department_id order by department_id;DEPARTMENT_ID MAX(SALARY)   COUNT(*)
------------- ----------- ----------10        4400          120       13000          230       11000          640        6500          150        8200         4560        9000          570       10000          180       14000         3490       24000          3100       12008          6110       12008          27000          112 rows selected.

Group By语句的一些限制:

-- job_id在 带group函数的select列表中,但没有对应的group by语句。
SQL> select  job_id, department_id, max(salary), count(*) from employees group by department_id order by department_id,job_id;
select  job_id, department_id, max(salary), count(*) from employees group by department_id order by department_id,job_id*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
-- 加上order by job_id就正确了
SQL> select  job_id, department_id, max(salary), count(*) from employees group by department_id, job_id order by department_id;JOB_ID     DEPARTMENT_ID MAX(SALARY)   COUNT(*)
---------- ------------- ----------- ----------
AD_ASST               10        4400          1
MK_MAN                20       13000          1
MK_REP                20        6000          1
PU_CLERK              30        3100          5
PU_MAN                30       11000          1
HR_REP                40        6500          1
SH_CLERK              50        4200         20
ST_CLERK              50        3600         20
ST_MAN                50        8200          5
IT_PROG               60        9000          5
PR_REP                70       10000          1
SA_MAN                80       14000          5
SA_REP                80       11500         29
AD_PRES               90       24000          1
AD_VP                 90       17000          2
FI_ACCOUNT           100        9000          5
FI_MGR               100       12008          1
AC_ACCOUNT           110        8300          1
AC_MGR               110       12008          1
SA_REP                          7000          120 rows selected.
-- 下面的错误是因为没有group by
SQL> select  job_id, department_id, max(salary), count(*) from employees job_id order by department_id;
select  job_id, department_id, max(salary), count(*) from employees job_id order by department_id*
ERROR at line 1:
ORA-00937: not a single-group group function
-- 以下错误需通过having解决,where条件中不允许Group函数
SQL> select * from employees where count(*) > 5;
select * from employees where count(*) > 5*
ERROR at line 1:
ORA-00934: group function is not allowed here

Group函数可以嵌套,但最多两层。

Having子句

Having子句在Group Level限制输出。只有group by出现时,才能出现Having子句。

SQL> select department_id from job_history where department_id in (50, 60, 80, 110);DEPARTMENT_ID
-------------50506080801101107 rows selected.SQL> select department_id, count(*) from job_history where department_id in (50, 60, 80, 110) group by department_id;DEPARTMENT_ID   COUNT(*)
------------- ----------50          260          180          2110          2
SQL> select department_id, count(*) from job_history where department_id in (50, 60, 80, 110) group by department_id having count(*) > 1;DEPARTMENT_ID   COUNT(*)
------------- ----------50          280          2110          2

另一个示例:

SQL> select job_id, avg(salary), count(*) from employees group by job_id;JOB_ID     AVG(SALARY)   COUNT(*)
---------- ----------- ----------
SH_CLERK          3215         20
HR_REP            6500          1
AD_VP            17000          2
FI_ACCOUNT        7920          5
PU_CLERK          2780          5
AC_MGR           12008          1
PU_MAN           11000          1
ST_CLERK          2785         20
AD_ASST           4400          1
AC_ACCOUNT        8300          1
IT_PROG           5760          5
SA_MAN           12200          5
FI_MGR           12008          1
ST_MAN            7280          5
MK_MAN           13000          1
AD_PRES          24000          1
MK_REP            6000          1
PR_REP           10000          1
SA_REP            8350         3019 rows selected.SQL> select job_id, avg(salary), count(*) from employees group by job_id having avg(salary) > 10000;JOB_ID     AVG(SALARY)   COUNT(*)
---------- ----------- ----------
AD_VP            17000          2
AC_MGR           12008          1
PU_MAN           11000          1
SA_MAN           12200          5
FI_MGR           12008          1
MK_MAN           13000          1
AD_PRES          24000          17 rows selected.SQL> select job_id, avg(salary), count(*) from employees group by job_id having avg(salary) > 10000 and count(*) > 1;JOB_ID     AVG(SALARY)   COUNT(*)
---------- ----------- ----------
AD_VP            17000          2
SA_MAN           12200          5

这篇关于OCA/OCP Oracle 数据库12c考试指南读书笔记:第9章: Group Functions的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677612

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库