您的位置:首页 > 数据库 > Oracle

oracle练习之 子查询

2017-03-31 16:56 260 查看
子查询

问题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


显示出和员工号7369部门相同的员工姓名,工资

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

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

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

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

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

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行。

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

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行。


显示出工资大于本部门平均工资的员工姓名,工资

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;

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

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

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

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;

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

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

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

Select d.dname,a.s From dept d,(select * from (select deptno,avg(sal) s from emp group by deptno order by avg(sal) des
ab3b
c) where rownum=1) a where d.deptno=a.deptno;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息