Oracle.练习题
2018-07-31
---练习3
---创建sporter表
create table sporter(
sporterid number(10) constraint sport_id primary key,
sname varchar2(20) not null,
sex varchar2(10),
department varchar2(10) not null
);
select * from sporter;
---向sporter表中插入数据
insert into sporter values(1001,'李盼','女','计算机系');
insert into sporter values(1002,'王玥','女','数学系');
insert into sporter values(1003,'丁赛','男','计算机系');
insert into sporter values(1004,'汪丽','女','物理系');
insert into sporter values(1005,'李娜','女','心理系');
insert into sporter values(1006,'王骋','女','化学系'); ---创建item表
create table item(
itemid varchar2(10) constraint item_id primary key,
itemname varchar2(20) not null,
loc varchar2(20)
); select * from item ---向item表中插入数据
insert into item values('x001','男子五千米','一操场');
insert into item values('x002','男子标枪','一操场');
insert into item values('x003','男子跳远','二操场');
insert into item values('x004','女子跳高','二操场');
insert into item values('x005','女子三千米','三操场'); ---创建grade积分表
create table grade(
sprterid number(10),
itemid varchar2(10),
mark number(10) constraint grade_mark check(mark in(6,4,2,0))
);
---修改列名
alter table grade rename column sprterid to sporterid; select * from grade ;
---向grade积分表中插入数据
insert into grade values(1001,'x001',6);
insert into grade values(1002,'x001',4);
insert into grade values(1003,'x001',2);
insert into grade values(1004,'x001',0);
insert into grade values(1001,'x003',4);
insert into grade values(1002,'x003',6);
insert into grade values( 1004,'x003',2);
insert into grade values(1004,'x004',6);
insert into grade values(1006,'x004',4);
--要求
--1.求出总积分最高的系名及总积分
select department ,sum(mark)
from sporter natural join grade
group by department
having sum(mark)=(select max(sum(mark))
from sporter natural join grade
group by department );
---???
--2.查询在一操场进行比赛的项目名称及其冠军的姓名
select itemid,max(mark)
from sporter natural join grade
group by itemid
having itemid in(select itemid
from item
where loc='一操场') --3.找出参加了王玥所参加过的项目的其他同学的姓名
select distinct sname
from sporter natural join grade
where itemid in (select itemid
from grade
where sporterid =(select sporterid
from sporter
where sname='王玥'))
and sporterid!=(select sporterid
from sporter
where sname='王玥') --4.经查,王玥因为使用了违禁药品,其成绩都记为0分,
--请在数据库中做出相应修改
update grade set mark =0 where sporterid=(select sporterid from sporter where sname='王玥') ; --5.经组委会协商,需要删除女子跳高比赛项目 delete from item where itemname='女子跳高'
---练习3
---创建sporter表
create table sporter(
sporterid number(10) constraint sport_id primary key,
sname varchar2(20) not null,
sex varchar2(10),
department varchar2(10) not null
);
select * from sporter;
---向sporter表中插入数据
insert into sporter values(1001,'李盼','女','计算机系');
insert into sporter values(1002,'王玥','女','数学系');
insert into sporter values(1003,'丁赛','男','计算机系');
insert into sporter values(1004,'汪丽','女','物理系');
insert into sporter values(1005,'李娜','女','心理系');
insert into sporter values(1006,'王骋','女','化学系'); ---创建item表
create table item(
itemid varchar2(10) constraint item_id primary key,
itemname varchar2(20) not null,
loc varchar2(20)
); select * from item ---向item表中插入数据
insert into item values('x001','男子五千米','一操场');
insert into item values('x002','男子标枪','一操场');
insert into item values('x003','男子跳远','二操场');
insert into item values('x004','女子跳高','二操场');
insert into item values('x005','女子三千米','三操场'); ---创建grade积分表
create table grade(
sprterid number(10),
itemid varchar2(10),
mark number(10) constraint grade_mark check(mark in(6,4,2,0))
);
---修改列名
alter table grade rename column sprterid to sporterid; select * from grade ;
---向grade积分表中插入数据
insert into grade values(1001,'x001',6);
insert into grade values(1002,'x001',4);
insert into grade values(1003,'x001',2);
insert into grade values(1004,'x001',0);
insert into grade values(1001,'x003',4);
insert into grade values(1002,'x003',6);
insert into grade values( 1004,'x003',2);
insert into grade values(1004,'x004',6);
insert into grade values(1006,'x004',4);
--要求
--1.求出总积分最高的系名及总积分
select department ,sum(mark)
from sporter natural join grade
group by department
having sum(mark)=(select max(sum(mark))
from sporter natural join grade
group by department );
---???
--2.查询在一操场进行比赛的项目名称及其冠军的姓名
select itemid,max(mark)
from sporter natural join grade
group by itemid
having itemid in(select itemid
from item
where loc='一操场')
---***
select itemname,sname
from sporter s,item i, grade g
where s.sporterid =g.sporterid and i.itemid=g. itemid
and loc='一操场' and mark=6 --3.找出参加了王玥所参加过的项目的其他同学的姓名
select distinct sname
from sporter natural join grade
where itemid in (select itemid
from grade
where sporterid =(select sporterid
from sporter
where sname='王玥'))
and sporterid!=(select sporterid
from sporter
where sname='王玥') --4.经查,王玥因为使用了违禁药品,其成绩都记为0分,
--请在数据库中做出相应修改
update grade set mark =0 where sporterid=(select sporterid from sporter where sname='王玥') ; --5.经组委会协商,需要删除女子跳高比赛项目 delete from item where itemname='女子跳高'
老师
练习作业
-------------------第五章----------------
---练习1
1.写一个查询,显示所有员工姓名,部门编号,部门名称。
select e.ename,e.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno 2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
select e.ename,d.loc,e.comm
from emp e,dept d
where e.deptno = d.deptno and upper(d.loc)='CHICAGO' and e.comm>0; 3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
select e.ename,d.loc
from emp e,dept d
where e.deptno = d.deptno and e.ename like '%A%'; ---练习2
1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
select e.empno,e.ename,e.sal,s.grade,d.loc
from emp e,dept d ,salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal
order by e.sal ; ---练习3
1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
select e.ename,e.empno,e.mgr,m.ename
from emp e,dept d,emp m
where e.deptno = d.deptno and e.mgr = m.empno
and upper(d.loc) in ('NEW YORK','CHICAGO') 2.第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。
select e.ename,e.empno,e.mgr,m.ename
---左连接 table1 left join table2 on ...
from dept d,emp e left join emp m on e.mgr = m.empno
where e.deptno = d.deptno
and upper(d.loc) in ('NEW YORK','CHICAGO')
order by e.empno 3.查询所有员工编号,姓名,部门名称,包括没有部门的员工也要显示出来。
select e.empno,e.ename,d.dname
from emp e left join dept d on e.deptno= d.deptno ---练习4
使用SQL-99写法,完成如下练习
1.创建一个员工表和部门表的交叉连接。
select *
from emp cross join dept; 2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
select e.ename,d.dname,e.hiredate
from emp e natural join dept d
---自然连接 自动匹配两个表中的相同字段
where e.hiredate>'1-5月-1980' 3.使用USING子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点
--JOIN...USING(公共列名)
--using后不要忘记加()
select ename,dname,loc
from emp join dept using (deptno)
where upper(loc)='CHICAGO' ---
4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级
--语法:table1 join table2 on 连接条件; select e.ename,d.dname,d.loc,s.grade
from emp e ,dept d ,salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal
and upper(d.loc)='CHICAGO' 5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.ename,m.ename
from emp e left join emp m on e.mgr = m.empno 6.使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.ename,m.ename
from emp m right join emp e on e.mgr = m.empno -------------------第六章----------------
---练习1
1.查询部门20的员工,每个月的工资总和及平均工资。
select sum(sal),avg(sal)
from emp
group by deptno
having deptno =20 2.查询工作在CHICAGO的员工人数,最高工资及最低工资。
select count(empno) 员工人数, max(sal),min(sal)
from emp natural join dept
group by loc
having upper(loc)= 'CHICAGO'; 3.查询员工表中一共有几种岗位类型
select job
from emp
group by job ; ---练习2
1.查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
select deptno,dname,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp e natural join dept d
group by deptno,dname 2.查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,
最高工资,最低工资,工资总和,平均工资。
select deptno,dname,job,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp e natural join dept d
group by deptno,dname,job 3.查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。
select count(e.empno),e.mgr
from emp e left join emp m on e.mgr = m.empno
group by e.mgr ---练习3
1.查询部门人数大于2的部门编号,部门名称,部门人数。
select deptno,dname,count(empno)
from emp natural join dept
group by deptno,dname
having count(empno)>2 2.查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,
部门平均工资,并按照部门人数升序排序。
select deptno,dname,count(empno)
from emp natural join dept
group by deptno,dname
having count(empno)>2 and avg(sal)>2000
order by count(empno) -------------------第七章----------------
---练习1
1.查询入职日期最早的员工姓名,入职日期
SELECT rownum,t.ename,t.hiredate
FROM (SELECT ROWNUM r,emp.* FROM emp) t
where hiredate is not null and t.r=1
order by hiredate 2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称
select ename,sal,dname
from emp natural join dept
where sal>(select sal
from emp
where upper(ename)='SMITH')
and upper(loc) ='CHICAGO'; 3.查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期
select ename,hiredate
from emp
where hiredate >all(select hiredate
from emp
where deptno=20); 4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
select deptno, dname,count(empno)部门人数
from emp natural join dept
group by deptno,dname
having count(empno)>(select count(empno)/count(distinct deptno)
from emp) ---练习2
1.查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
select ename,hiredate
from emp
where hiredate>any(select hiredate
from emp
where deptno=10)
and deptno!=10; 2.查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
select ename,hiredate
from emp
where hiredate>all(select hiredate
from emp
where deptno=10)
and deptno!=10;
---比子查询的返回结果的最大值要大 3.查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
select ename,job
from emp
where job in (select job
from emp
where deptno=10)
and deptno!=10; ---练习3
1.查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名,职位,
不包括10部门员工
select ename,job
from emp
where (job,mgr) in (select job,mgr
from emp
where deptno=10)
and deptno!=10; 2.查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名,职位,
不包括10部门员工
select ename,job
from emp
where job in (select job from emp where deptno=10)
or mgr in (select mgr from emp where deptno=10)
and deptno!=10; ---练习4
1.查询比自己职位平均工资高的员工姓名、职位,部门名称,职位平均工资
--相同job,平均工资
--表 j 用job 和其它表建立连接
select job,avg(sal) a
from emp
group by job
-----------------
select e.ename,e.job,d.dname,j.a
from emp e,dept d,(select job,avg(sal) a
from emp
group by job ) j --三个表连接
where e.deptno = d.deptno and e.job = j.job
and e.sal>j.a ; 2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT和BLAKE本人。
select ename,job
from emp
where (job,mgr) in (select job,mgr
from emp
where upper(ename) in('SCOTT','BLAKE'))
and upper(ename) not in('SCOTT','BLAKE'); 3.查询不是经理的员工姓名。
select ename
from emp
where empno not in(select distinct mgr
from emp
where mgr is not null); ---练习5
1.查询入职日期最早的前5名员工姓名,入职日期。
SELECT rownum,t.ename,t.hiredate
FROM (SELECT ROWNUM r,emp.* FROM emp) t
where t.hiredate is not null and t.r<=5
order by t.hiredate 2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
SELECT rownum,t.ename,t.hiredate
FROM (SELECT ROWNUM r,emp.* FROM emp) t
where t.hiredate is not null and t.r<=2
and t.deptno=(select deptno
from dept
where upper(loc)='CHICAGO')
order by t.hiredate ---练习6
1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,
要求显示员工姓名、入职日期、部门名称。
select rownum ,t.ename,t.hiredate,t.dname
from (select rownum r, empno,ename,job,mgr,hiredate,sal,comm,deptno,deptno,dname,loc
from emp natural join dept) t
WHERE t.r>(1-1)*5 and t.r<=1*5
or t.r>(2-1)*5 and t.r<=2*5
or t.r>(3-1)*5 and t.r<=3*5 ---练习7
1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,
要求显示员工姓名、入职日期、部门名称、工资。
select rownum ,t.ename,t.hiredate,t.dname,t.sal
from (select rownum r, empno,ename,job,mgr,hiredate,sal,comm,deptno,deptno,dname,loc
from emp natural join dept) t
WHERE t.r>(1-1)*5 and t.r<=1*5
or t.r>(2-1)*5 and t.r<=2*5
or t.r>(3-1)*5 and t.r<=3*5
order by t.sal desc ---课后作业
1.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
select empno,ename,sal
from emp
where sal>(select sal
from emp
where empno=7782)
and job = (select job
from emp
where empno=7369);
---
2.查询工资最高的员工姓名和工资。
select rownum,t.ename,t.sal
from (select rownum r,emp.*
from emp
order by sal desc) t
where t.r=1 3.查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
select deptno,dname,min(sal)
from emp natural join dept
group by deptno,dname
having min(sal)>(select min(sal)
from emp
group by deptno
having deptno=10) 4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
select empno,ename,sal
from emp
where (deptno,sal) in (select deptno ,min(sal)
from emp
group by deptno) 5.显示经理是KING的员工姓名,工资。
select ename,sal
from emp
where mgr=(select empno
from emp
where upper(ename)='KING') 6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
select ename,sal,hiredate
from emp
where hiredate>(select hiredate
from emp
where upper(ename)='SMITH') 7.使用子查询的方式查询哪些职员在NEW YORK工作。
select *
from emp
where deptno=(select deptno
from dept
where upper(loc)='NEW YORK') 8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,
查询结果中排除SMITH。
select ename,hiredate
from emp
where deptno in (select deptno
from emp
where upper(ename)='SMITH') 9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。
select empno,ename
from emp
where sal>( select avg(sal)
from emp) 10.写一个查询显示其上级领导是King的员工姓名、工资。
select ename,sal
from emp
where mgr=(select empno
from emp
where upper(ename)='KING') 11.显示所有工作在RESEARCH部门的员工姓名,职位。
select ename,job
from emp
where deptno =(select deptno
from dept
where upper(dname)='RESEARCH') 12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门20的平均工资。
select deptno,avg(sal)
from emp natural join dept
group by deptno
having avg(sal)>(select avg(sal)
from emp natural join dept
group by deptno
having deptno=20)
---
13.查询大于自己部门平均工资的员工姓名,工资,
所在部门平均工资,高于部门平均工资的额度。
select e.ename,e.sal,a,sal-a
from emp e,(select deptno ,avg(sal) a
from emp
group by deptno) t
where e.deptno= t.deptno
and sal>a 14. 列出至少有一个雇员的所有部门
select deptno
from emp
group by deptno
having count(empno)>0 15. 列出薪金比"SMITH"多的所有雇员
select *
from emp
where sal>(select sal
from emp
where upper(ename)='SMITH') --16. 列出入职日期早于其直接上级的所有雇员
select *
from emp e join emp m on e.mgr=m.empno
where e.hiredate < m.hiredate 17. 找员工姓名和直接上级的名字
select e.ename,m.ename
from emp e join emp m on e.mgr=m.empno 18. 显示部门名称和人数
select dname,count(empno)
from emp natural join dept
group by dname 19. 显示每个部门的最高工资的员工
select *
from emp
where (deptno,sal) in (select deptno,max(sal)
from emp
group by deptno) 20. 显示出和员工号7369部门相同的员工姓名,工资
select ename,sal
from emp
where deptno=(select deptno
from emp
where empno=7369); 21. 显示出和姓名中包含"W"的员工相同部门的员工姓名
select ename
from emp
where deptno=(select deptno
from emp
where upper(ename) like '%W%'); 22. 显示出工资大于平均工资的员工姓名,工资
select ename,sal
from emp
where sal>(select avg(sal)
from emp); 23. 显示出工资大于本部门平均工资的员工姓名,工资
select ename,sal
from emp
where sal > (select avg(sal)
from emp
group by deptno) 24. 显示每位经理管理员工的最低工资,及最低工资者的姓名
select m,ename
from emp e,(select mgr,min(sal) m
from emp
group by mgr) t
where e.mgr = t.mgr
and sal = m 25. 显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间
select ename,hiredate
from emp
where hiredate>(select hiredate
from emp
where sal=(
select max(sal)
from emp)) 26. 显示出平均工资最高的的部门平均工资及部门名称
select dname,avg(sal)
from emp natural join dept
group by deptno,dname
having avg(sal)=(select max(avg(sal))
from emp
group by deptno)
自己
课后练习
-------------------第五章----------------
---练习1
1.写一个查询,显示所有员工姓名,部门编号,部门名称。
select e.ename,e.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno 2.写一个查询,显示所有工作在CHICAGO并且奖金不为空的员工姓名,工作地点,奖金
select e.ename,d.loc,e.comm
from emp e,dept d
where e.deptno = d.deptno and upper(d.loc)='CHICAGO' and e.comm>0; 3.写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点。
select e.ename,d.loc
from emp e,dept d
where e.deptno = d.deptno and e.ename like '%A%'; ---练习2
1.查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序。
select e.empno,e.ename,e.sal,s.grade,d.loc
from emp e,dept d ,salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal
order by e.sal ; ---练习3
1.查询所有工作在NEW YORK和CHICAGO的员工姓名,员工编号,以及他们的经理姓名,经理编号。
select e.ename,e.empno,e.mgr,m.ename
from emp e,dept d,emp m
where e.deptno = d.deptno and e.mgr = m.empno
and upper(d.loc) in ('NEW YORK','CHICAGO') 2.第上一题的基础上,添加没有经理的员工King,并按照员工编号排序。
select e.ename,e.empno,e.mgr,m.ename
---左连接 table1 left join table2 on ...
from dept d,emp e left join emp m on e.mgr = m.empno
where e.deptno = d.deptno
and upper(d.loc) in ('NEW YORK','CHICAGO')
order by e.empno 3.查询所有员工编号,姓名,部门名称,包括没有部门的员工也要显示出来。
select e.empno,e.ename,d.dname
from emp e left join dept d on e.deptno= d.deptno ---练习4
使用SQL-99写法,完成如下练习
1.创建一个员工表和部门表的交叉连接。
select *
from emp cross join dept; 2.使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
select e.ename,d.dname,e.hiredate
from emp e natural join dept d
---自然连接 自动匹配两个表中的相同字段
where e.hiredate>'1-5月-1980' 3.使用USING子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点
--JOIN...USING(公共列名)
--using后不要忘记加()
select ename,dname,loc
from emp join dept using (deptno)
where upper(loc)='CHICAGO' ---
4.使用ON子句,显示工作在CHICAGO的员工姓名,部门名称,工作地点,薪资等级
--语法:table1 join table2 on 连接条件; select e.ename,d.dname,d.loc,s.grade
from emp e ,dept d ,salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal
and upper(d.loc)='CHICAGO' 5.使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.ename,m.ename
from emp e left join emp m on e.mgr = m.empno 6.使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.ename,m.ename
from emp m right join emp e on e.mgr = m.empno -------------------第六章----------------
---练习1
1.查询部门20的员工,每个月的工资总和及平均工资。
select sum(sal),avg(sal)
from emp
group by deptno
having deptno =20 2.查询工作在CHICAGO的员工人数,最高工资及最低工资。
select count(empno) 员工人数, max(sal),min(sal)
from emp natural join dept
group by loc
having upper(loc)= 'CHICAGO'; 3.查询员工表中一共有几种岗位类型
select job
from emp
group by job ; ---练习2
1.查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资。
select deptno,dname,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp e natural join dept d
group by deptno,dname 2.查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,
最高工资,最低工资,工资总和,平均工资。
select deptno,dname,job,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp e natural join dept d
group by deptno,dname,job 3.查询每个经理所管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息。
select count(e.empno),e.mgr
from emp e left join emp m on e.mgr = m.empno
group by e.mgr ---练习3
1.查询部门人数大于2的部门编号,部门名称,部门人数。
select deptno,dname,count(empno)
from emp natural join dept
group by deptno,dname
having count(empno)>2 2.查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,
部门平均工资,并按照部门人数升序排序。
select deptno,dname,count(empno)
from emp natural join dept
group by deptno,dname
having count(empno)>2 and avg(sal)>2000
order by count(empno) -------------------第七章----------------
---练习1
1.查询入职日期最早的员工姓名,入职日期
SELECT rownum,t.ename,t.hiredate
FROM (SELECT ROWNUM r,emp.* FROM emp) t
where hiredate is not null and t.r=1
order by hiredate 2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称
select ename,sal,dname
from emp natural join dept
where sal>(select sal
from emp
where upper(ename)='SMITH')
and upper(loc) ='CHICAGO'; 3.查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期
select ename,hiredate
from emp
where hiredate >all(select hiredate
from emp
where deptno=20); 4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
select deptno, dname,count(empno)部门人数
from emp natural join dept
group by deptno,dname
having count(empno)>(select count(empno)/count(distinct deptno)
from emp) ---练习2
1.查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
select ename,hiredate
from emp
where hiredate>any(select hiredate
from emp
where deptno=10)
and deptno!=10; 2.查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
select ename,hiredate
from emp
where hiredate>all(select hiredate
from emp
where deptno=10)
and deptno!=10;
---比子查询的返回结果的最大值要大 3.查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
select ename,job
from emp
where job in (select job
from emp
where deptno=10)
and deptno!=10; ---练习3
1.查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名,职位,
不包括10部门员工
select ename,job
from emp
where (job,mgr) in (select job,mgr
from emp
where deptno=10)
and deptno!=10; 2.查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名,职位,
不包括10部门员工
select ename,job
from emp
where job in (select job from emp where deptno=10)
or mgr in (select mgr from emp where deptno=10)
and deptno!=10; ---练习4
1.查询比自己职位平均工资高的员工姓名、职位,部门名称,职位平均工资
--相同job,平均工资
--表 j 用job 和其它表建立连接
select job,avg(sal) a
from emp
group by job
-----------------
select e.ename,e.job,d.dname,j.a
from emp e,dept d,(select job,avg(sal) a
from emp
group by job ) j --三个表连接
where e.deptno = d.deptno and e.job = j.job
and e.sal>j.a ; 2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT和BLAKE本人。
select ename,job
from emp
where (job,mgr) in (select job,mgr
from emp
where upper(ename) in('SCOTT','BLAKE'))
and upper(ename) not in('SCOTT','BLAKE'); 3.查询不是经理的员工姓名。
select ename
from emp
where empno not in(select distinct mgr
from emp
where mgr is not null); ---练习5
1.查询入职日期最早的前5名员工姓名,入职日期。
SELECT rownum,t.ename,t.hiredate
FROM (SELECT ROWNUM r,emp.* FROM emp) t
where t.hiredate is not null and t.r<=5
order by t.hiredate 2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
SELECT rownum,t.ename,t.hiredate
FROM (SELECT ROWNUM r,emp.* FROM emp) t
where t.hiredate is not null and t.r<=2
and t.deptno=(select deptno
from dept
where upper(loc)='CHICAGO')
order by t.hiredate ---练习6
1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,
要求显示员工姓名、入职日期、部门名称。
select rownum ,t.ename,t.hiredate,t.dname
from (select rownum r, empno,ename,job,mgr,hiredate,sal,comm,deptno,deptno,dname,loc
from emp natural join dept) t
WHERE t.r>(1-1)*5 and t.r<=1*5
or t.r>(2-1)*5 and t.r<=2*5
or t.r>(3-1)*5 and t.r<=3*5 ---练习7
1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,
要求显示员工姓名、入职日期、部门名称、工资。
select rownum ,t.ename,t.hiredate,t.dname,t.sal
from (select rownum r, empno,ename,job,mgr,hiredate,sal,comm,deptno,deptno,dname,loc
from emp natural join dept) t
WHERE t.r>(1-1)*5 and t.r<=1*5
or t.r>(2-1)*5 and t.r<=2*5
or t.r>(3-1)*5 and t.r<=3*5
order by t.sal desc ---课后作业
1.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
select empno,ename,sal
from emp
where sal>(select sal
from emp
where empno=7782)
and job = (select job
from emp
where empno=7369);
---
2.查询工资最高的员工姓名和工资。
select rownum,t.ename,t.sal
from (select rownum r,emp.*
from emp
order by sal desc) t
where t.r=1 3.查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
select deptno,dname,min(sal)
from emp natural join dept
group by deptno,dname
having min(sal)>(select min(sal)
from emp
group by deptno
having deptno=10) 4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。
select empno,ename,sal
from emp
where (deptno,sal) in (select deptno ,min(sal)
from emp
group by deptno) 5.显示经理是KING的员工姓名,工资。
select ename,sal
from emp
where mgr=(select empno
from emp
where upper(ename)='KING') 6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
select ename,sal,hiredate
from emp
where hiredate>(select hiredate
from emp
where upper(ename)='SMITH') 7.使用子查询的方式查询哪些职员在NEW YORK工作。
select *
from emp
where deptno=(select deptno
from dept
where upper(loc)='NEW YORK') 8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,
查询结果中排除SMITH。
select ename,hiredate
from emp
where deptno in (select deptno
from emp
where upper(ename)='SMITH') 9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。
select empno,ename
from emp
where sal>( select avg(sal)
from emp) 10.写一个查询显示其上级领导是King的员工姓名、工资。
select ename,sal
from emp
where mgr=(select empno
from emp
where upper(ename)='KING') 11.显示所有工作在RESEARCH部门的员工姓名,职位。
select ename,job
from emp
where deptno =(select deptno
from dept
where upper(dname)='RESEARCH') 12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门20的平均工资。
select deptno,avg(sal)
from emp natural join dept
group by deptno
having avg(sal)>(select avg(sal)
from emp natural join dept
group by deptno
having deptno=20)
---
13.查询大于自己部门平均工资的员工姓名,工资,
所在部门平均工资,高于部门平均工资的额度。
select e.ename,e.sal,a,sal-a
from emp e,(select deptno ,avg(sal) a
from emp
group by deptno) t
where e.deptno= t.deptno
and sal>a 14. 列出至少有一个雇员的所有部门
select deptno
from emp
group by deptno
having count(empno)>0 15. 列出薪金比"SMITH"多的所有雇员
select *
from emp
where sal>(select sal
from emp
where upper(ename)='SMITH') --16. 列出入职日期早于其直接上级的所有雇员
select *
from emp e join emp m on e.mgr=m.empno
where e.hiredate < m.hiredate 17. 找员工姓名和直接上级的名字
select e.ename,m.ename
from emp e join emp m on e.mgr=m.empno 18. 显示部门名称和人数
select dname,count(empno)
from emp natural join dept
group by dname 19. 显示每个部门的最高工资的员工
select *
from emp
where (deptno,sal) in (select deptno,max(sal)
from emp
group by deptno) 20. 显示出和员工号7369部门相同的员工姓名,工资
select ename,sal
from emp
where deptno=(select deptno
from emp
where empno=7369); 21. 显示出和姓名中包含"W"的员工相同部门的员工姓名
select ename
from emp
where deptno=(select deptno
from emp
where upper(ename) like '%W%'); 22. 显示出工资大于平均工资的员工姓名,工资
select ename,sal
from emp
where sal>(select avg(sal)
from emp); 23. 显示出工资大于本部门平均工资的员工姓名,工资
select ename,sal
from emp
where sal > (select avg(sal)
from emp
group by deptno) 24. 显示每位经理管理员工的最低工资,及最低工资者的姓名
select m,ename
from emp e,(select mgr,min(sal) m
from emp
group by mgr) t
where e.mgr = t.mgr
and sal = m 25. 显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间
select ename,hiredate
from emp
where hiredate>(select hiredate
from emp
where sal=(
select max(sal)
from emp)) 26. 显示出平均工资最高的的部门平均工资及部门名称
select dname,avg(sal)
from emp natural join dept
group by deptno,dname
having avg(sal)=(select max(avg(sal))
from emp
group by deptno)
Oracle.练习题的更多相关文章
- 【Java EE 学习 28 下】【Oracle面试题2道】【Oracle练习题3道】
		
一.已知程序和数据 create table test1 (id int primary key, name ), money int); ,); ,); ,); ,); 要求根据下图写出相应的sql ...
 - oracle练习题
		
题干:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher). 建表后数据如下: SQL> select * from ...
 - oracle练习题后15个
		
31,32题更正: SQL> --31. 查询所有教师和同学的name.sex和birthday. SQL> select sname, ssex, sbirthday from stud ...
 - Oracle练习题20~33
		
20.查询score中选学多门课程的同学中分数为非最高分成绩的记录. 21. 查询成绩高于学号为“109”.课程号为“3-105”的成绩的所有记录. 22.查询和学号为108的同学同年出生的所有学生的 ...
 - Oracle练习题(1~19)
		
1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在 ...
 - oracle练习题  实验一
		
实验一 练习1.请查询表DEPT中所有部门的情况. select * from dept; 练习2.查询表DEPT中的部门号.部门名称两个字段的所有信息. select deptno,dname fr ...
 - SQL操作数据——SQL组成,查询基础语法,where,Oracle常用函数等
		
SQL组成 DML数据操作语言 DCL数据控制语言 DQL数据查询语言 DDL数据定义语言 查询基础语法 记录筛选 where 子句 记录筛选 where 子句 实例练习 实例练习 Select语句中 ...
 - 另一套Oracle SQL练习题,更新参考答案
		
题干: create table student( sno ) primary key, sname ), sage ), ssex ) ); create table teacher( tno ) ...
 - 一套oracle的练习题
		
create table student( sno varchar2(10) primary key, sname varchar2(20), sage number(2), ssex varchar ...
 
随机推荐
- mysql 5.7.18 winx64安装配置方法
			
在mysql-5.7.18-winx64文件夹下新建my.ini文件 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置 ...
 - webpack初识
			
1.什么是Webpack WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等) ...
 - ECharts图表的小工具
			
本文介绍一个echarts工具类EChart.js,用来制作统计图表,基于echarts3. 一.工具类特性如下: 包含柱状图.折线图和饼图,可以实现这三类统计图之间的切换: 支持标题和副标题: 支持 ...
 - Codeforces 920G - List Of Integers
			
920G - List Of Integers 思路:容斥+二分 代码: #include<bits/stdc++.h> using namespace std; #define ll l ...
 - 最小高度的树 Minimum Height Trees
			
2018-09-24 12:01:38 问题描述: 问题求解: 毫无疑问的一条非常好的题目,采用的解法是逆向的BFS,也就是从叶子节点开始遍历,逐步向中心靠拢,最终留下的叶子节点就是答案. publi ...
 - python相对目录的基本用法(一)
			
一般在代码中涉及到操作文件时,最好使用文件的相对目录,这样在你的程序迁移到别人的电脑时,可以保证不会出现文件读取异常的错误(另外,自动化测试时用例的读取也要用相对目录) 例子1 假如工程文件的目录结构 ...
 - legend2---开发日志5(如何解决插件的延迟问题,比如vue)
			
legend2---开发日志5(如何解决插件的延迟问题,比如vue) 一.总结 一句话总结:元素可以先设置为隐藏,这样就不会让用户看到延迟的问题,然后等加载完再显示, 元素先设置为隐藏 加载完再显示 ...
 - (25)线程---local数据隔离
			
线程之间本身是数据共享的,当多个线程同时修改一份数据的时候,数据就可能不 准确,特别是线程量特别大的时候,为了保证数据准确性: (1) 通过线程锁Lock (2)通过local数据隔离 from th ...
 - 赵炯博士《Linux内核完全注释》
			
赵炯:男,1963年10月5日出生,江苏苏州人,汉族. 同济大学机械工程学院机械电子教研室副教授,从事教学和科研工作. 现在主要为硕士和博士研究生开设<计算机通信技术>.<计算机控制 ...
 - Can't find kernel text map area from kcore
			
kernel : 4.9.51kexec-tools : 2.0.4 1.~ # ./kexec -p /boot/vmlinuz --initrd=/boot/initrd --command-li ...