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 ...
随机推荐
- vim的简单使用
vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...
- 力扣(LeetCode)728. 自除数
自除数 是指可以被它包含的每一位数除尽的数. 例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0. 还有,自除数不允许包含 0 . 给定上边 ...
- 查看GPU占用率以及指定GPU加速程序
GPU占用率查看: 方法一:任务管理器 如图,GPU0和GPU1的占用率如下显示. 方法二:GPU-Z软件 下面两个GPU,上面是GPU0,下面是GPU1 sensors会话框里的GPU ...
- 初探nginx负载均衡配置
只简单说一下upstream的配置,如何进行负载均衡后续还需要多了解 1.另准备一个配置文件命名为nginx_test.conf 为了不污染原有的nginx.conf,提前复制一份配置文件做试验,然后 ...
- 本地广播的简单示例 --Android开发
1.局部通知管理器LocalBroadcastManager,用于同一个应用中不同组件之间发送广播.由于是在同应用中发送广播,所以使用它安全性.效率也会提高. 2.本例实现简单的发送本地广播的案例 点 ...
- android -------- Eclipse下的NDK配置环境
NDK 全称是Native Development Kit,是一个让开发人员在Android应用中嵌入使用本地代码编写的组件的工具集 原生开发工具包 (NDK) 是一组可让您在 Android 应用中 ...
- 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范
一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...
- P4557 [JSOI2018]战争
首先可以题目描述的两个点集是两个凸包,分别设为A和B. 考虑一个向量w不合法的条件. 即存在b+w=a,其中a属于A,b属于B. 也就是a-b=w. 即对b取反后和a的闵可夫斯基和. 求出闵可夫斯基和 ...
- mysql find_in_set()函数的使用
mysql 中 find_in_set() 函数语法: FIND_IN_SET(str,strList) str 要查询的字符串 strList 字段名,参数以“,”分隔,如(1,2,6,8) 查询字 ...
- java设计模式之生产者/消费者模式
什么是生产者/消费者模式? 某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理数据的模块,就称为消费者 ...