本课重点:
1、了解可用的组函数
2、说明每个组函数的使用方法
3、使用GROUP BY
4、通过HAVING来限制返回组[@more@]
课程四 组函数
本课重点:
1、了解可用的组函数
2、说明每个组函数的使用方法
3、使用GROUP BY
4、通过HAVING来限制返回组
注意:以下实例中标点均为英文半角
一、概念:
组函数是指按每组返回结果的函数。
组函数可以出现在SELECT和HAVING 字段中。
GROUP BY把SELECT 的结果集分成几个小组。
HAVING 来限制返回组,对RESULT SET而言。
二、组函数:(#号的函数不做重点)
1、AVG
2、COUNT
3、MAX
4、MIN
5、STDDEV #
6、SUM
7、VARIANCE #
语法:
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
实例1:一个混合实例,说明所有问题:
SQL> SELECT AVG(salary), MAX(salary), MIN(salary),
2 SUM(salary)
3 FROM s_emp
4 WHERE UPPER(title) LIKE ’SALES%’;
AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY)
----------- ----------- ----------- -----------
1476 1525 1400 7380
说明:很多函数,我们在讲函数的已经向大家介绍过,但在此为何叫分组函数呢,主要是因为它们可以与GROUP
BY来形成对不同组的计算,相当于在很多值中进行挑选。
* MIN MAX函数可以接任何数据类型。
如果是MIN(last_name), MAX(last_name),返回的是什么呢?
千万记住,不是指LAST_NAME的长度,而是指在FIRST字母的前后顺序,第一个相同,然后比较第二个,如:xdopt
> cssingkdkdk > adopt > acccc
实例2:
SQL> SELECT COUNT(commission_pct)
2 FROM s_emp
3 WHERE dept_id = 31;
返回所有非空行个数
三、GROUP BY的应用:
先看一个简单实例:
SQL> SELECT credit_rating, COUNT(*) ”# Cust”
2 FROM s_customer
3 GROUP BY credit_rating;
注意这里别名的应用,复习一下从前的课程,加了引号后,就可以用特殊字符,但也仅有三个:#$_,什么对象的
名字都如此。当然空格也是可以的。
复杂实例:
SQL> SELECT title, SUM(salary) PAYROLL
2 FROM s_emp
3 WHERE title NOT LIKE ’VP%’
4 GROUP BY title
5 ORDER BY SUM(salary);
这里要注意一下几个CLAUSE的先后次序。
WHERE在这里主要是做参与分组的记录的限制。
**另外,如果要选取出来一个不加组函数的列,如上面的TITLE,就要把这个列GROUP BY !否则要出错的!信息为
:ERROR at line 1:
ORA-00937: not a single-group group function
理论很简单,如果不GROUP BY TITLE,显示哪一个呢?这个在试题中经常出现。
结论:不加分组函数修饰的列必定要出现在GROUP BY 里。
错误实例:
SQL> SELECT dept_id, AVG(salary)
2 FROM s_emp
3 WHERE AVG(salary) > 2000
4 GROUP BY dept_id;
WHERE AVG(salary) > 2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here
应在GROUP BY 后面加上HAVING AVG(salary) > 2000;
因为是用来限制组的返回。
多级分组实例:
SQL> SELECT dept_id, title, COUNT(*)
2 FROM s_emp
3 GROUP BY dept_id, title;
就是先按照DEPT_ID分组,当DEPT_ID相同的时候,再按TITLE分组,而COUNT(*)以合成的组计数。
顺序对结果有决定性的影响。
总结:本课我们主要学习了分组函数的使用及如何进行分组查询,我们可以想像一下,SQL SERVER中有COMPUTE
BY,来进行分组总数的计算,但在ORACLE中是没有的。大家可以建立一个有多个列,多个重复值的表,然后进行各种
分组的演示,用得多了,自然明了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/34329/viewspace-916779/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/34329/viewspace-916779/