OCP 复习笔记之PL/SQL (5)

最近打算把9i 的OCP教程看一遍,作一些简单的笔记,作为备忘。

PL/SQL看似简单,但实际使用起来还是有很多技巧和误区的。以下记录的是复习过程中想到的、和容易出现错误的地方。

这些东西在教程大部分是没有记载的。

第五章 聚合函数


5.1 AVG(求平均值)

Ø 格式:AVG([DISTINCT|ALL]n)

默认是ALL,如果需要返回不重复的列表需要指明DISTINCT。如果加上DISTINCT关键字,则先过滤重复的nnull值,然后再求平均值。

Ø AVG函数内的参数只能是数字型的

Ø AVG函数会忽略空值;如果需要把当前值为空值的记录也计算进去,则用NVL之类的函数来辅助。如:

SQL> select * from t1;

ID NAME

---------- ------------------------------

2 2

2

SQL> select avg(id) from t1;

AVG(ID)

----------

2

SQL> select avg(nvl(id,0)) from t1;

AVG(NVL(ID,0))

--------------

1

5.2 COUNT(求记录个数)

Ø 格式:COUNT({*|[DISTINCT|ALL]expr})

默认的是ALL,如果需要过滤重复值则加上DISTINCT

Ø 如果参数是“*”或者常数、常量,则返回的是符合条件的记录总数,包括记录中有空值的记录;如果参数是列名,则返回的是符合条件、且该列对应的值不为空的记录数。

Ø 可用于任意数据类型,忽略空值

5.3 MAX(求表达式最大值)

Ø 格式:MAX([DISTINCT|ALL]expr)

Ø 可以用于任意数据类型;忽略空值

5.4 MIN

Ø 格式:MIN([DISTINCT|ALL]expr)

Ø 可用于任意数据类型,忽略空值

5.5 STDDEV

Ø 格式:STDDEV([DISTINCT|ALL]x)

Ø 只能用于数值类型,忽略空值

5.6 SUM

Ø 格式:SUM([DISTINCT|ALL]n)

Ø 只能用于数值类型的求和,忽略空值

5.7 VARIANCE

Ø 格式:VARIANCE([DISTINCT|ALL]x)

Ø 只能用于数值类型,忽略空值

5.8 GROUP BY

Ø Select子句中的列必须出现在group by子句中,但select子句中的包含列名的表达式在group by中可以只包含该列名,也可以是与select子句中一样的表达式;出现在group by子句中的列或表达式不一定需要出现在select子句中。

Ø select子句中中的常量不需要出现在group by子句中

Ø Group by子句不能用列的别名

Ø 默认情况下,返回结果是以group by子句中的列升序排列的。(10g是无序的)

Ø 聚合函数可以嵌套,最外层的聚合函数是以里层的聚合函数得到的结果作为数据源。也就是说即使是有group bysql,返回的记录数也是一行。

SQL> select max(avg(id)) from t1 group by id;

MAX(AVG(ID))

------------

5

5.9 HAVING子句

Ø 如果根据聚合函数进行数据过滤的话,只能用having子句,不能把聚合函数写在where子句中;having子句可以带非聚合函数的限制条件,但用来限定范围的列必须包含在group by子句中(不一定需要出现在select子句中)。

Ø sql中,执行顺序是:where -> group by -> having

Ø 一般情况下,可以写在where子句中的限定条件就写在where子句中,写在having子句中性能会较差。原因是条件写在where子句中,先得到过滤后的记录再group by,参与group by的记录就少,写在having子句中,是先group by再过滤(和分页优化原理类似)

Ø Having子句中不能用聚合函数的字段别名

Ø Having子句可以写在group by子句前,但为了看起来更舒服,不提倡写在group by前。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63772/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/231499/viewspace-63772/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值