zoukankan      html  css  js  c++  java
  • oracle表复杂查询

    在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家介绍较为复杂的select语句

    数据分组  max  min  avg  sum  count

    ?       如何显示所有员工中最高工资和最低工资

    select max(sal),min(sal) from emp;

    ?       显示所有员工的平均工资和工资总和

    select avg(sal),sum(sal) from emp;

    ☞avg(comm)不会把comm为null的行进行统计,因此我们要注意,如果希望为null的也考虑,则我们可以这样做:

    select sum(comm)/count(*) form emp;

    ?       计算共有多少员工

    select count(*) from emp;

    细节:count(*),也可以对一个字段进行统计,比如:count(sal);

          count(comm)不考虑为null进行统计。

    扩展要求:

    ?       请显示工资最高的员工的名字,工作岗位

    select ename,job from emp where sal=(select max(sal) from emp);

    ?       请显示工资高于平均工资的员工信息

    select * from emp where sal>(select  avg(sal)  from emp);

    select 语句执行的顺序

    (1)我们写SQL语句是从左到右

    (2)SQL执行在默认情况下是从右向左执行。

    (3)无论select有多少,oracle有执行顺序。

    group byhaving字句

    group by 用于对查询的结果分组统计   having字句用于限制(过滤)分组显示结果

    ?       如何显示每个部门的平局工资和最高工资

    select avg(sal),max(sal),deptno from emp group by deptno;

    ?       显示每个部门的每种岗位的平均工资和最低工资

    select avg(sal),min(sal),deptno,job from emp group by deptno,job order by deptno;

    ?       显示平均工资低于2000的部门号和它的平均工资

    select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;

    having不能使用别名

    SQL> select deptno,avg(sal) myavg from emp group by deptno having myavg<2000;

    select deptno,avg(sal) myavg from emp group by deptno having myavg<2000

    ORA-00904: "MYAVG": 标识符无效

    对数据分组的总结

    1、分组函数(avg...)只能出现在选择列表、having、order by字句中

    select avg(sal),deptno from emp group by deptno having avg(sal)>100 order by avg(sal) desc;

    2、如果在select语句中同时包含有group  by,having,order  by,那么它们的顺序是group by,having,order by。

    3、在选择列中如果有列、表达式、分组函数,那么这些列和表达式必须有一个出现在group by字句中,否则就会出错

    如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;

    这里deptno就一定要出现在group by中。

    SQL> select avg(sal),deptno,job from emp group by job having avg(sal)>100 order by avg(sal);

    select avg(sal),deptno,job from emp group by job having avg(sal)>100 order by avg(sal)

    ORA-00979: 不是 GROUP BY 表达式

    SQL> select avg(sal),deptno,job from emp group by job,deptno having avg(sal)>100 order by avg(sal);

      AVG(SAL) DEPTNO JOB

    ---------- ------ ---------

           950     30 CLERK

           950     20 CLERK

          1300     10 CLERK

          1400     30 SALESMAN

          2450     10 MANAGER

          2850     30 MANAGER

          2975     20 MANAGER

          3000     20 ANALYST

          5000     10 PRESIDENT

    9 rows selected

  • 相关阅读:
    导入旧版本Android项目时的“Unable to resolve target ‘android
    eclipse打开文件目录
    ireport常见问题
    【技术贴】解决127.0.0.1和http://localhost均被拦截跳转到另一个网页
    【技术贴】SqlServer2008 R2 安装失败提示出现以下错误 服务 MSSQLSERVERO
    【技术贴】解决xp下Microsoft.SqlServer.Management.PSProvider.dll
    websphere性能设置和日常维护
    【技术贴】解决支付宝充值信用卡还款跳转到网上银行报错Error 404
    jQuery制作Facebook Timeline时间轴
    借助rownum中求Oracle表中前三名(三甲:状元榜眼探花)的方法(总计三种方法,以讲述rownum的使用为主)
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11113683.html
Copyright © 2011-2022 走看看