初学Oracle_多条selcet语句

1、SQL> select ename,deptno,sal from emp where sal=(select max(sal) from emp group by deptno);
select ename,deptno,sal from emp where sal=(select max(sal) from emp group by deptno)
查询每个薪水最多的人的姓名,因为(select max(sal) from emp group by deptno)返回多个值,而sal只能接受一值所以不正确
第 1 行出现错误:
ORA-01427: 单行子查询返回多个值
SQL> select ename,deptno,sal from emp where sal in (select max(sal) from emp group by deptno);
使用关键字in可以,但是上面的语法是取出in里面的三个值之一,逻辑依然不正确但语法正确
ENAME          DEPTNO        SAL
---------- ---------- ----------
BLAKE              30       2850
SCOTT              20       3000
KING               10       5000
FORD               20       3000
select ename,sal from emp join(select max(sal) max_sal,depton from emp group by
deptno) t on(emp.sal=t.max_sal and emp.depton=t.depton);
正确写法如上!运用了join on表连接和子查询

2、SQL> select ename,dname,grade from emp e,dept d,salgrade s
  2  where e.deptno=d.deptno and e.sal between s.losal and s.hisal and //连接条件
  3  job <>'CLERK';//过滤条件
所以造成阅读不方便,因此1999年有了新的语法规则

ENAME      DNAME               GRADE
---------- -------------- ----------
KING       ACCOUNTING              5
FORD       RESEARCH                4
SCOTT      RESEARCH                4
JONES      RESEARCH                4
BLAKE      SALES                   4
CLARK      ACCOUNTING              4
ALLEN      SALES                   3
TURNER     SALES                   3
MARTIN     SALES                   2
WARD       SALES                   2
SQL>select ename,dname from emp,dept;//92年语法
SQL>select ename,dname from emp corss join dept;//99年语法
SQL>select ename,dname from emp,dept where emp.deptno=dept.depton;//92年语法
SQL>select ename,dname from emp join dept on (emp.deptno=dept.depton)//99年语法
SQL>select ename,dname from emp join dept using(depton) ;//不推荐
SQL>select ename,dname,grade from
emp e join dept d on(e.depton =d.depton)
join salgrade s on (e.sal between s.losal and s.hisal)
where ename not like '_A%';
SQL> select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr=e2.empno);
SQL> select e1.ename,e2.ename from emp e1 left join emp e2 on (e1.mgr=e2.empno);左外连接
SQL> select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr=e2.empno);//全外连接
SQL> select deptno,avg_sal from
  2  (select avg(sal) avg_sal,deptno from emp group by deptno)
  3  where avg_sal=
  4  (select max(avg_sal) from (select avg(sal) avg_sal,deptno from emp group by deptno));
  A.求部门平均薪水的等级。


       select deptno,avg_sal,grade from 
       (select deptno,avg(sal) avg_sal from emp group by deptno)t
       join salgrade s on(t.avg_sal between s.losal and s.hisal)
       
       B.求部门平均的薪水等级
       select deptno,avg(grade) from 
       (select deptno,ename, grade from emp join salgrade s on(emp.sal between s.losal and
       s.hisal)) t
       group by deptno


       C.那些人是经理
       select ename from emp where empno in(select mgr from emp);
       select ename from emp where empno in(select distinct mgr from emp);
       
       D.不准用组函数,求薪水的最高值(面试题)
       
       select distinct sal from emp where sal not in(
       select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal));
       
       E.平均薪水最高的部门编号
       
       select deptno,avg_sal from
       (select avg(sal)avg_sal,deptno from emp group by deptno)
       where avg_sal=
       (select max(avg_sal)from 
       (select avg(sal) avg_sal,deptno from emp group by deptno)
       )
      
       F.平均薪水最高的部门名称
       select dname from dept where deptno=
      ( 
        select deptno from
        (select avg(sal)avg_sal,deptno from emp group by deptno)
        where avg_sal=
        (select max(avg_sal)from 
        (select avg(sal) avg_sal,deptno from emp group by deptno)
        )
       )
      
      G.求平均薪水的等级最低的部门的部门名称
        
        组函数嵌套
        如:平均薪水最高的部门编号,可以E.更简单的方法如下:
        select deptno,avg_sal from 
        (select avg(sal) avg_sal,deptno from emp group by deptno)
        where avg_sal =
        (select max(avg(sal)) from emp group by deptno)
        
        组函数最多嵌套两层
        
        分析:
        首先求
        1.平均薪水: select avg(sal) from group by deptno;


        2.平均薪水等级:  把平均薪水当做一张表,需要和另外一张表连接salgrade
        select  deptno,grade avg_sal from 
          ( select deptno,avg(sal) avg_sal from emp group by deptno) t
        join salgrade s on(t.avg_sal between s.losal and s.hisal)
        
        上面结果又可当成一张表。
        
        DEPTNO    GRADE    AVG_SAL
      --------  -------  ----------
        30           3   1566.66667
        20           4   2175
        10           4   2916.66667


        3.求上表平均等级最低值
        
        select min(grade) from
        (
          select deptno,grade,avg_sal from
           (select deptno,avg(sal) avg_sal from emp group by deptno)t
          join salgrade s on(t.avg_sal between s.losal and s.hisa)
         )


        4.把最低值对应的2结果的那张表的对应那张表的deptno, 然后把2对应的表和另外一张表做连接。
          
          select dname ,deptno,grade,avg_sal from
            (
       select deptno,grade,avg_sal from
              (select deptno,avg(sal) avg_sal from emp group by deptno)t
             join salgrade s on(t.avg_sal between s.losal and s.hisal)
             ) t1
            join dept on (t1.deptno = dept.deptno)
            where t1.grade =
            ( 
              select deptno,grade,avg_sal from
               (select deptno,avg(sal) avg_sal from emp group by deptno) t
                join salgrade s on(t.avg_sal between s.losal and s.hisal)
               )
            )
         结果如下:
         
        DNAME    DEPTNO     GRADE    AVG_SAL
      --------  -------  --------   --------
        SALES        30        3    1566.6667 
     
         
       H: 视图(视图就是一张表,一个字查询)
        
       G中语句有重复,可以用视图来简化。
       conn sys/bjsxt as sysdba;
       grant create table,create view to scott;
       conn scott/tiger
       创建视图:
       create view v$_dept_avg-sal_info as
       select deptno,grade,avg_sal from
        ( select deptno,avg(sal) avg_sal from emp group by deptno)t
       join salgrade s on 9t.avg_sal between s.losal and s.hisal)
      
       然后 
       select * from v$_dept_avg-sal_info
       
       结果如下:
       DEPTNO      GRADE    AVG_SAL
      --------  -------  ----------
        30           3   1566.66667
        20           4   2175
        10           4   2916.66667


       然后G中查询可以简化成:
       select  dname,t1.deptno,grade,avg_sal from
       v$_dept_avg-sal_info t1
       join dept on(t1.deptno =dept.deptno)
       where t1.grade=
       (
select min(grade) from v$_dept_avg-sal_info t1
       ) 
     





3

SQL> select deptno,avg_sal from
  2  (select avg(sal) avg_sal,deptno from emp group by deptno)
  3  where avg_sal=
  4  (select max(avg_sal) from (select avg(sal) avg_sal,deptno from emp group by deptno));

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值