继续学习多行函数,本节的重点是要搞清楚SELECT语句中各个部分执行的先后顺序。
1、组函数
AVG 求平均值
COUNT 计数
MAX 求最大值
MIN 求最小值
STDDEV 求标准方差
SUM 求和
VARIANCE 求偏差
小提示一下,组合函数默认会忽略空的列值,在做计算时如果需要的话,可以配合使用NVL等函数。
2、GROUP BY
2.1在GROUP BY和WHERE子句中不能使用别名;在ORADER BY子句中可以使用别名。
2.2所有被SELECT的列,若不包括在组合函数的列参数内,那就必须包含在GROUP BY的参数内,否则就会报错。
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id;
语句内各部分执行顺序解析:
第一步:查出department_id,没问题,很顺利;
第二步:AVG(salary)的优先级排最后,先不查。这里应该是进行GROUP BY的操作。
【 WHERE子句和GROUP BY子句放在一起的时候,先执行WHERE子句,本例子没有就不说了,直接执行GROUP BY操作。顺便提一下,ORADER BY子句一般是放在整个SELECT语句的最后面的,执行顺序肯定也落后于GROUP BY。】
第三步:最后执行AVG(salary)。,对分组后的列再求平均值。
【 想一想一个细节,如果这里没有GROUP BY进行分组,那求出来的平均值也就一个,而现在这里应该是有多个对应于各个部门的平均值。】
3、GROUP BY (多个列参数)
当需要对已经分组的数据再次进行分组的时候,直接在GROUP BY后面跟多个参数即可,再次分组的顺序按照参数的先后位置进行
4、HAVING子句
在数据分组之前是用WHERE子句来对数据进行筛选的,但是在数据被分组之后,若需要对数据进行筛选就得用HAVING子句。
用一张图来回顾一下SELECT语句中各个部分的执行先后顺序:
再次总结一下,执行的先后顺序应该是:
SELECT---> FROM ---> WHERE---> GROUP BY---> 组函数---> HAVING ---> ORDER BY
5、常见的跟分组有关的错误语句
SELECT department_id,COUNT(last_name) FROM employees;
SELECT department_id,job_id,COUNT(last_name) FROM employees
GROUP BY department_id;
6、笛卡尔乘积
主要用于产生大量测试数据,其它时候我们都是要尽量避免笛卡尔乘积的。
7、outer join
left outer join 连接2表并显示左表不匹配的部分
right outer join 连接2表并显示右表不匹配的部分
full outer join 连接2表并显示2表不匹配的部分
oracle的语法中是用(+)来表示的,不过有个地方要注意下,显示的是该符号所在的表对面的表的不匹配部分,说来绕口,自己实践一下马上明白。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26006637/viewspace-706355/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26006637/viewspace-706355/