日期:2014-05-16  浏览次数:20447 次

oracle学习笔记(三)
组函数

avg(..),求平均值    sum(..),求和 这两个函数的参数只能是number型的。

例:求所有人的提成的平均值
   select avg(nvl(commission_pct,0)) from s_emp;
    求有多少人有提成
   select count(commission_pct) from s_emp;
    求员工都分布在多少个不同的部门
   select count(distinct(dept_id)) from s_emp;

以下所提到的函数可以使用任意类型做参数。
count(..),用来统计记录数,可以使用排重命令。count(...)默认使用的是all。
max(..),min(..)求最大值和最小值,

注意:组函数可以处理一组数据,返回一个值。
      所有的组函数会忽略空值。

count(*),统计表中记录数,不忽略空值。

group 组
group by 分组子句,按指定的分组规则分组 ,这个group by 子句可以跟在 select 语句后或是 having后面。
group by子句也会出发排序操作,会按分组字段排序。

select [组函数或分组的字段名] ,... from 表名 group by [字段名1],[字段名2],.....;

例:找出各个部门的平均工资
    select dept_id,avg(salary)
    from s_emp;
    group by dept_id;

   在没有group by时,select后不能把普通字段和组函数同时使用

   求各个部门不同职位有多少人
   select dept_id,title,count(*)
   from s_emp
   group by dept_id,title;

   求平均工资大于2000的部门
   select dept_id,avg(salary)
   from s_emp
   group by dept_id
   having avg(salary)>2000;

   求除了42部门以外的各个部门的平均工资
   select dept_id,avg(salary)
   from s_emp
   where dept_id<>42
   group by dept_id;

  求各个部门的平均工资
  select max(d.name),max(r.name),avg(salary)
  from s_emp e,s_dept d,s_region r
  where e.dept_id=d.id and d.region_id=r.id
  group by dept_id;
 
注意:只要写了group by子句,select后就只能用group by后的字段或者是组函数。
      where子句只能够过滤记录,放单行函数。

having子句可以过滤组函数结果或是分组的信息,且写在group by子句后。

注意:要先过滤掉不需要的记录,然后再进行分组操作,提高效率。


四、子查询

子查询,就是可以嵌在任何的sql语句中的select语句,子查询也会触发排序

在select语句中嵌套子查询时,会先执行子查询。一般的会将子查询放在运算符的右边。

注意:在使用子查询时,要注意这个运算符是单行的(也就是只能是单值),还是多行运算符(范围,多值,in)。
配合使用子查询返回的结果必须符合运算符的用法。

例:
   求谁的工资是最低的
   select first_name,salary
   from s_emp
   where salary =(select min(salary)
                  from s_emp
                 );

  求谁和Smith是做一样工作的
  select first_name,title
  from s_emp
  where title in (select title
  from s_emp
                  where last_name='Smith')
 
  求哪些人是普通员工
   select first_name from s_emp
   where id not in (select manager_id from s_emp
                    where manager_id is not null)

  求哪些人是经理
  select first_name from s_emp
  where id in (select manager_id from s_emp)

from后面也可以用子查询

例:找出哪个人的平均工资比本部门的平均工资高
  select e.first_name,e.salary,a.avgsal
  from s_emp e,(select dept_id,avg(salary) avgsal from s_emp group by dept_id) a
  where e.dept_id=a.dept_id and e.salary>a.avgsal;

重点掌握的三种形式:

1、哪个部门没有员工
    select e.deptno,d.deptno
    from emp e,dept d
    where e.deptno(+)=d.deptno and e.deptno is null;

2、求各部门的平均工资
  select max(d.name),max(r.name),avg(salary)
  from s_emp e,s_dept d,s_region r
  where e.dept_id=d.id and d.region_id=r.id
&