oracle练习之 子查询

子查询
问题1 : 按工资进行排名,排名从1开始,工资相同则排名相同,(如果两人并列第一则没有第二名 从第三名开始继续排)
select e.* , (select count(*) from emp where sal>e.sal ) +1 pm from emp e order by pm ;

        SQL> select e.* , (select count(*) from emp where sal>e.sal ) +1 pm from emp e order by pm ;

             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO         PM
        ---------- ---------- --------- ---------- -------------- ---------- ---------- ---------- ----------
              7839 KING       PRESIDENT            17-11月-81           5000                    10          1
              7902 FORD       ANALYST         7566 03-12月-81           3000                    20          2
              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20          2
              7566 JONES      MANAGER         7839 02-4月 -81           2975                    20          4
              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30          5
              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10          6
              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30          7
              7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         30          8
              7934 MILLER     CLERK           7782 23-1月 -82           1300                    10          9
              7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30         10
              7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30         10
              7876 ADAMS      CLERK           7788 23-5月 -87           1100                    20         12
              7900 JAMES      CLERK           7698 03-12月-81            950                    30         13
              7369 SMITH      CLERK           7902 17-12月-80            800                    20         14

        已选择14行。

问题2: 求入职时间相同的员工
select * from emp e where (select count(*) from emp where hiredate=e.hiredate ) >=2 ;

        SQL> select * from emp e where (select count(*) from emp where hiredate=e.hiredate ) >=2 ;

             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
        ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
              7900 JAMES      CLERK           7698 03-12月-81            950                    30
              7902 FORD       ANALYST         7566 03-12月-81           3000                    20

问题3 : 查询每个部门工资最高的前两名 (题目解析 : 在一个部门内找员工,要求比该员工工资高的人的人数为0或1 )
select * from emp e where (select count(*) from emp where sal >e.sal and deptno=e.deptno) <2 ;

        SQL> select * from emp e where (select count(*) from emp where sal >e.sal and e.deptno=deptno) <2 ;

             EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
        ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
              7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30
              7698 BLAKE      MANAGER         7839 01-5月 -81           2850                    30
              7782 CLARK      MANAGER         7839 09-6月 -81           2450                    10
              7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
              7839 KING       PRESIDENT            17-11月-81           5000                    10
              7902 FORD       ANALYST         7566 03-12月-81           3000                    20

        已选择6行。

问题4 : 查询工资相同的员工的工资和姓名
select e.sal ,e.ename from emp e where (select count(*) from emp where sal=e.sal and ) >=2 ;

            SQL> select * from emp t1 where (select count(*) from emp where sal= t1.sal ) >=2;

                 EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
            ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
                  7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         30
                  7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         30
                  7788 SCOTT      ANALYST         7566 19-4月 -87           3000                    20
                  7902 FORD       ANALYST         7566 03-12月-81           3000                    20
  1. 显示出和员工号7369部门相同的员工姓名,工资

  2. 列出至少有二个雇员的所有部门

Select deptno From emp group by deptno having count(*)>2;

  1. 列出薪金比”SMITH”多的所有雇员

Select ename From emp where sal>(select sal from emp where ename=’SMITH’);

  1. 列出入职日期早于其直接上级的所有雇员

Select * From emp e,(select empno,hiredate from emp) a where e.mgr=a.empno and e.hiredate

ENAME

ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES

已选择6行。

  1. 显示出工资大于平均工资的员工姓名,工资

Select e.ename,e.sal From emp e,(select avg(sal) a from emp) s where e.sal>s.a;

                    SQL> select e.ename ,e.sal from emp e where sal>(select avg(sal) from emp );

                    ENAME             SAL
                    ---------- ----------
                    JONES            2975
                    BLAKE            2850
                    CLARK            2450
                    SCOTT            3000
                    KING             5000
                    FORD             3000

                    已选择6行。

                    SQL> select e.ename ,e.sal from emp e, (select avg(sal ) a from emp ) s where e.sal > s.a;

                    ENAME             SAL
                    ---------- ----------
                    JONES            2975
                    BLAKE            2850
                    CLARK            2450
                    SCOTT            3000
                    KING             5000
                    FORD             3000

                    已选择6行。
  1. 显示出工资大于本部门平均工资的员工姓名,工资

Select e.ename,e.sal from emp e,(select deptno,avg(sal) av from emp group by deptno) a where e.deptno=a.deptno and sal>av;

  1. 显示员工”KING”所管理的员工姓名

Select e.ename from emp e,(select empno from emp where ename=’KING’) a where e.mgr=a.empno;

  1. 显示每位经理管理员工的最低工资,及最低工资者的姓名

Select e.ename,e.sal From emp e,(select min(sal) mins from emp group by mgr having mgr is not null) a where e.sal=a.mins;

  1. 显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间

Select ename,hiredate From emp where hiredate>(select hiredate from emp where sal=(select max(sal) from emp));

  1. 显示出平均工资最高的的部门平均工资及部门名称

Select d.dname,a.s From dept d,(select * from (select deptno,avg(sal) s from emp group by deptno order by avg(sal) desc) where rownum=1) a where d.deptno=a.deptno;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值