zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    JAVA设计模式之单例模式
    JAVA设计模式之建造模式
    JAVA设计模式之原型模式
    JAVA设计模式之适配器模式
    JAVA设计模式之合成模式
    JAVA设计模式之享元模式
    JAVA设计模式之门面模式
    JAVA设计模式之桥梁模式
    JAVA设计模式之不变模式
    JAVA设计模式之模版方法模式
  • 原文地址:https://www.cnblogs.com/sq-software/p/5112637.html
Copyright © 2011-2022 走看看