oracle sql学习二

来源:互联网 发布:hr人力资源软件免费 编辑:程序博客网 时间:2024/05/02 04:48

分组函数:


了解组函数。
描述组函数的用途。
使用GROUP BY子句对数据分组。
使用HAVING子句过滤分组结果集。

组函数的类型:AVG(平局数) COUNT(数量) sum(总和) max(最大值) min(最小值)

select avg(salary),sum(salary)/count(salary) from employees;

得出的结论是avg(salary)=sum(salary)/count(salary)

COUNT(expr)返回expr不为空的记录总数
avg(expr) 得出的也是expr不为空的平均值。
COUNT(DISTINCTexpr)返回expr非空且不重复的记录总数

分组:

可以使用GROUP BY子句将表中的数据分成若干组

明确:WHERE一定放在FROM后面,所以group by 一定在where后面。


SELECT列表中所有未包含在组函数中的列都应该包含

GROUP BY子句中


SELECT   department_id, AVG(salary)

FROM     employees

GROUP BY department_id ;

包含在 GROUP BY子句中的列不必包含在SELECT列表中

SELECT   AVG(salary)

FROM     employees

GROUP BY department_id ;


使用多个列分组:


SELECT   department_iddept_id,job_id, SUM(salary)

FROM     employees

GROUP BY department_id,job_id ;

不能在 WHERE子句中使用组函数。
可以在 HAVING子句中使用组函数。

SELECT   department_id,AVG(salary)

FROM     employees

WHERE    AVG(salary) > 8000

GROUP BY department_id;

上述是错误的


SELECT   department_id, MAX(salary)

FROM     employees

GROUP BY department_id

HAVING   MAX(salary)>10000 ;

上述是正确的

having的位置比较灵活,可以在group by之前也可以在group by之后。

子查询:

子查询需要注意any(任一) 和all(任意)的区别:

返回其它部门中比job_id‘IT_PROG’部门任一工资低的员工的员

              工号、姓名、job_id以及salary

SELECT employee_id,last_name,job_id, salary

FROM   employees

WHERE  salary < ANY

                    (SELECT salary

                     FROM   employees

                     WHERE job_id = 'IT_PROG')

AND    job_id <> 'IT_PROG';

比该部门的任一一个员工的工资低就行,其实另一层意思就是比该部门最大的工资低就行。


返回其它部门中比job_id‘IT_PROG’部门所有工资都低的员工

            的员工号、姓名、job_id以及salary

SELECT employee_id,last_name,job_id, salary

FROM   employees

WHERE  salary < ALL

                    (SELECT salary

                     FROM   employees

                     WHERE job_id = 'IT_PROG')

AND    job_id <> 'IT_PROG';

比该部门的任意一个员工的工资都低,其实另一层意思就是比该部门最小的工资低都低。




0 0