oracle 10g学习之分组函数

一、

(1)分组查询语句的顺序

  select ...

  from ...

  where ...

     group by ...

  having ...

  order by ...

注意:
    where-->group by分组-->执行组函数-->having筛选->order by
    
    如果select/having语句后面出现了组函数 那么select/having后面没有被组函数修饰的列,就必须出现在group by 后面。
    组函数出现的位置 : select后面 having后面 order by后面
    SELECT列表中未出现在组函数中的所有列都必须包含在GROUP BY子句中。oracle规定where子句不可以使用分组函数,这时必须使用having子句方可完成功能。

    where筛选行
    having筛选分组
    
    不能在GROUP BY子句中使用列别名。

(2)avg:求平均值    
  count:计算记录总数            
  Max:求最大值
  Min:求最小值    
  sum:求和
  STDDEV:标准差
  VARIANCE:方差

例:查询所有员工的平均工资

  select avg(salary)

  from s_emp;

例:查询每个部门的平均工资

  select avg(salary)

  from s_emp

  group by dept_id;

例:查询部门名称及其部门的平均工资

  select dept_id,name,avg(salary)

  from s_emp,s_dept

  where s_emp.dept_id = s_dept.id

  group by dept_id,name

  order by dept_id;

例:查询平均工资大于1400的部门id,并显示出部门的名字

  select dept_id,name,avg(salary)

  from s_emp, s_dept

  where s_emp.dept_id = s_dept.id

  group by dept_id,name

  having avg(salary)>1400

例:查询title中不包含vp字符串的每个职位的平均薪水 ,并对平均薪水进行降序排列,并且每个职位的总薪水大于5000

  select title,avg(salary),sum(salary)

  from s_emp

  where lower(title) not like '%vp%'

  group bu title

  having sum(salary)>5000

  order by avg(salary) desc;

例:查询员工表中最大工资数,并显示出这个人的名字

  法一:

  select last_name,salary

  from s_emp

  where salary = (

    select max(salary)

    from s_emp

  );

  法二:

  select s1.last_name,max(s2.salary)

  from s_emp s1,s_emp s2

  group by s1.last_name

  having s1.salary=max(s2.salary);

二、子查询

子查询:一条sql语句嵌套一个或多个sql语句

例:查询工资比41号部门平均工资高的员工信息

  select last_name,salary

  from s_emp

  where salary>(

  select avg(salary)

  from s_emp

  where dept_id = 41;)

例:查询工资比Ngao所在部门平均工资高的员工信息

  select last_name.salary

  from s_emp

  where salary>(

    select avg(salary)

    from s_emp

    where dept_id =(

      select dept_id

      from s_emp

      where last_name='Ngao')

    );

例:查看部门平均工资大于32号部门平均工资的部门id

  select dept_id,avg(salary)

  from s_emp

  group by dept_id

  having avg(salary)>(

    select avg(salary)

    from s_emp

    where dept_id=32

  )

三、运行时可变参

执行sql语句的时候再传入参数

参数名字随便起,但要以&开头

        set verify on  开启校验
        set verify off  关闭校验

例:  select id,last_name,salary,dept_id
        from s_emp
        where dept_id=&dept_id;

开启校验后,会显示:

    输入 dept_id 的值:  10
           原值    3: where dept_id = &dept_id
           新值    3: where dept_id = 10

关闭校验后,则只显示:

    输入 dept_id 的值:  10

注意:输入可变参数是字符串的时候

  select id,last_name,salary

  from s_emp

  where last_name='&last_name';      输入Ngao

  select id,last_name,salary

  from s_emp

  where last_name=&last_name;        输入'Ngao'

同时设置多个可变参数:

  select &col1,&col2,salary

  from s_emp

  where &condition;

accept:定义一个变量,让用户输入值

  accept sal prompt 'sal:'

在sql语句中使用这个变量

  select id,last_name,salary

  from s_emp

  where salary>&sal;

清除变量

  undefine sal;

原文地址:https://www.cnblogs.com/sq-software/p/5112637.html