createtable empployee_demo(
empno number(4) notnull primary key, --员工编号,主键
ename varchar2(10) notnullunique, --员工名,唯一键
job varchar2(9), --职位、工作
mgr number(4), --经理编号
hiredate datedefaultsysdate, --入职日期,默认约束
sal number(7,2) check(sal>=500and sal<=10000), --工资
comm number(7,2), --资金
deptno number(2) --部门编号
)
--department
DEPTNO NUMBER(2) --部门编号
DNAME VARCHAR2(14) Y --部门名字
LOC VARCHAR2(13) Y --部门位置--salgrade
grade
losal
hisal
--39. 查询部门名称为SALES和ACCOUNTING的员工信息select * from employee
where deptno in
(select deptno from department
where dname ='SALES'or dname ='ACCOUNTING')
--40. 查询不是经理的员工的信息(使用in 或 not in来做)select * from employee
where job notin ('MANAGER');
--41. 查询工资比10号部门员工中任意一个低的员工信息select * from employee
where sal < any(select sal from employee where deptno=10);
--42. 查询工资比10号部门都要低的员工信息select * from employee
where sal < all(select sal from employee where deptno=10);
select * from employee
where sal < (selectmin(sal) from employee where deptno=10);
--43. 查询出部门名称,部门员工数,部门平均工资,部门最低工资雇员的姓名,及工资等级select d.dname 部门名,emp.cou 部门员工数,emp.avgsal 平均工资,e.ename 最低工资员工名,s.grade 工资等级
from department d,
employee e,
salgrade s,
(select deptno,avg(sal) avgsal,count(empno) cou,min(sal) minsal from employee
groupby deptno) emp
where d.deptno = emp.deptno and e.sal = emp.minsal and e.sal between s.losal and s.hisal
--44.找出与入职时间最早的员工在同一个部门的员工信息以及所在部门名称select * from employee e
leftjoin department d on e.deptno = d.deptno
where e.deptno = ( select deptno from employee
where hiredate = (selectmin(hiredate) from employee))
--45. 列出最低薪金大于1500的各种工作及此从事此工作的全部雇员人数selectcount(empno),job
from employee
where job in (select job from employee
groupby job
havingmin(sal)>1500
)
groupby job
--46. 求出在'SALES'部门工作的员工姓名,假设不知道销售部的部门编号select ename from employee
where deptno =(select deptno from department
where dname='SALES')
--47. 列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,和工资等级select e.*,s.grade,boss.ename 上级领导
from employee e,department d,salgrade s,employee boss
where e.deptno = d.deptno and e.sal between losal and hisal and e.mgr = boss.empno
and e.sal > (selectavg(sal) from employee)
--48. 列出与员工SCOTT从事相同工作的所有员工及部门名称select ename,e.job,dname from employee e,department d,(select deptno,job from employee where ename ='SCOTT') e1
where e.deptno = d.deptno and e.job = e1.job and e.deptno=e1.deptno and ename <>'SCOTT'--49. 查询和SMITH部门相同, 岗位相同的人select * from employee
where deptno = (select deptno from employee where ename='SMITH')
and job = (select job from employee where ename = 'SMITH')
--50. 和ALLEN同部门,工资高于MARTIN的雇员有哪些select * from employee
where deptno = (select deptno from employee where ename='ALLEN') and
sal> (select sal from employee where ename = 'MARTIN')
--51. 比blake工资高的雇员有哪些? select * from employee
where sal> (select sal from employee where ename = 'BLAKE')
--52. 高于30部门最高工资的雇员有哪些?select * from employee
where sal > (selectmax(sal) from employee where deptno=30)
--53. 查询scott.emp表中所有的经理的信息(此操作子查询会返回多行记录)select * from employee
where empno in (selectdistinct mgr from employee where mgr isnotnull);
--54. 工资高于本部门平均工资的人(拿上游工资的人)有哪些?select deptno,ename,sal
from employee e
where sal>(selectavg(sal) from employee where deptno=e.deptno);
--55. 工作和部门与SMITH相同,工资高于JAMES的雇员有哪些?select * from employee
where deptno = (select deptno from employee where ename='SMITH')
and job = (select job from employee where ename = 'SMITH') and sal > (select sal from employee where ename='JAMES')
select job,deptno,sal
from employee
where (job,deptno)=(select job,deptno from employee where ename='SMITH')
and sal>(select sal from employee where ename='JAMES');
--56.列出每个部门工作的员工数量,平均工资和平均服务年限select deptno 部门,count(empno) 员工数量,avg(sal) 平均工资,avg(extract(yearfromsysdate)-extract(yearfrom hiredate)) 平均服务年限 from employee
groupby deptno
orderby deptno
--57. 列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金select ename,sal from employee
where sal in (select sal from employee where deptno = 30) and deptno!=30;
--58.列出薪金大于部门30中员工的薪金的所有员工的姓名和薪金select ename,sal from employee
where sal > all(select sal from employee where deptno = 30) and deptno!=30;
/*
59. 分页查询,每页显示5条记录,按工资升序排序
使用employee表,利用子查询和 rownum伪列编写一个分页查询语句,每页显示5条记录,
如第1页:第1~5条记录,第2页:第6~10条记录,.......
<a href="....?pageNo=1">第一页</a>
<a href="....?pageNo=?">上一页</a>
<a href="....?pageNo=?">下一页</a>
<a href="....?pageNo=max_value">最后一页</a>
rownum伪列是为查询结果集的行分配行号,是先有了结果后才分配的行号
如果通过主键排序rownum的行号是有序的,但如果使其字段排序则行号无序
*/select * from(
select t.*,rownum rn from (select * from employee orderby sal ) t --每条数据都有了个伪列whererownum<=10--到10行结束
) where rn>=5--5行开始--60. 有如下表结构,删除表中重复的数据,重复数据只保留一行:表:emp_dup(id number, name varchar2(10));-- 自行插入一些重复数据deletefrom emp_dup a
where a.rowid>(
selectmin(b.rowid) from emp_dup b where a.id = b.id and a.name = b.name
);
commit;