请配合 原文章练习
有的地方不完整,是由于楼主忘记把最新版本的题解拷贝了,因此请见谅。题库我会持续更新!!!后续我也会慢慢更新的
–1. 选出部门30中的所有员工。
select * from emp where deptno = 30
–2. 列出所有办事员(CLERK)的姓名、编号和部门编号。
select e.ename 姓名,e.empno 编号,e.deptno 部门编号 from emp e where e.job = 'CLERK'
–3. 找出佣金高于薪金的员工。
select * from emp where COMM > sal
–4. 找出佣金高于薪金的60%的员工。
select * from emp where COMM > sal*0.6
–5.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料。
select * from emp where (deptno = 10 and job = 'MANAGER') or (deptno = 20 and job = 'CLERK')
–6. 找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK),既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料。
select * from emp where (deptno = 10 and job = 'MANAGER') or (deptno = 20 and job = 'CLERK') or (job not in('MANAGER','CLERK') and sal>= 2000)
–7.找出收取佣金的员工的不同工作。 去重
select job from emp where comm>0
union
select job from emp where comm>0
–8. 找出不收取佣金或收取的佣金低于100的员工。 -- is null 才是对的, = null 是错误的
select * from emp where comm<=100 or comm is null
–9. 查询所有部门名称和员工姓名,包括没有员工的部门名称也显示。 -- 没有员工的部门名称
select * from dept
select * from emp e,dept p where e.deptno = p.deptno
select d.dname 部门名称,e.ename 员工姓名 from dept d,emp e
–10.查询工资高于公司平均工资的所有员工信息。
1. 先找出平均工资
select avg(sal) from emp
2. 再根据信息筛选员工信息
select * from emp where sal>(select avg(sal) from emp)
–11. 查询工资高于部门平均工资的所有员工。
select * from emp;
select avg(sal),deptno from emp group by deptno
select sal > (select sal from emp where empno=10) or
select * from emp e where e.sal>(select avg(sal) from emp k group by deptno having e.deptno=k.deptno)
–12.查询emp表的第1~3行。
select * from emp where rownum<=3
–13.查询emp表的第4-6行。1
SELECT *
FROM (SELECT rownum row_top, tt.*
FROM (SELECT e.* FROM emp e ORDER BY sal DESC) tt)
WHERE row_top BETWEEN 4 AND 6;
–13.查询emp表的第4-6行.2
SELECT *
FROM (SELECT rownum row_top, tt.*
FROM (SELECT e.* FROM emp e ORDER BY sal DESC) tt)
WHERE row_top <=6
AND row_top >= 4;
–14. 把员工姓名和工作类型连接在一起,中间用“-”分割显示(concat函数)。(用concat函数报错)
select ename || '-' || job from mep
–15. 截取员工姓名的前3个字符和第4个字符以后的内容显示。
select substr(ename,0,3) from emp
–16. 查询员工编号,姓名和所在部门的名称。
select e.empno 员工编号,e.ename 员工姓名,d.dname 部门 from emp e,dept d where e.deptno = d.deptno
–17. 查询部门的名称以及该部门的人数,要求没有员工的部门也要显示。
select dname,count(empno) 人数 from emp right join dept on emp.deptno = dept.deptno group by dept.dname;
–18. 查询员工姓名及其直接上级的姓名。
select e.ename 员工姓名,e
–19. 查询工资高于平均工资的员工姓名。
select e.ename from emp e where sal>(select avg(sal) from emp)
–20. 查询工资高于本部门平均工资的员工。
select e.ename from emp e where sal>(select
–21. 查询每个部门中拥有最高工资的员工的信息。
select * from emp e where sal = (select max(sal) from emp where e.deptno = deptno);
–22. 统计“JONES”所带领的团队的工资总额。
select SUM(sal) from emp where ename = 'JONES' or mgr = (select empno from emp where ename = 'JONES');
–23.列出10号部门中有而20号部门中没有的工作。
select job from emp where deptno = 10 and job not in(select job from emp where deptno =20)
–第二部分
–1. 查询津贴为空的所有员工。
select * from emp where comm is null
–2. 查询姓名以字母“S”开头的员工。
select * from emp where ename like 'S%'
–3.查询所有的经理(MANAGER)和办事员(CLERK)的员工信息。
select * from emp where job in ('MANAGER','CLERK')
–4.按参加工作时间从早到晚显示员工信息。
select * from emp order by hiredate asc
–6.给员工涨工资5%。
select sal*1.05 from emp
update emp set sal = sal * 1.05;
–8.查询系统时间。 -- 从 dual 虚拟表进行查询工作
select sysdate from dual
–9.查询在20(30)年前参加工作的员工。
select * from emp;
select ((months_between(TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd'),'yyyy-mm-dd'),hiredate))/12)
As 相差年份 from emp;
–10.查询在当月倒数第三天参加工作的员工。
select * from emp where (to_number(to_char(last_day(hiredate),'dd'))-to_number(to_char(hiredate, 'dd' )))=2
–11.查询每个员工的工作天数。
select ename 员工姓名,to_char(last_day(hiredate),'dd') 工作天数 from emp;
–12.显示系统时间是xxxx年xx月xx日,是一年中的第几天,是星期几。
–13.按每月30天计算员工的日薪金,要求计算结果四舍五入到小数点后2位。
select e.*,ROUND(e.sal*1.00 / 30,2) 日薪 from emp e; -- round(计算、保留小数点位数)
–14.计算每个员工已经工作了多少个月,要求忽略小数部分。
–15.按年和月的格式显示员工参加工作的时间。
–16.查询在1987年2月到1987年5月之间(包括2月和5月)参加工作的员工。
–17.按指定格式显示员工的工资(工资格式为9,990.99)。
–20.统计部门最低工资大于900的部门和最低工资。
select deptno,(select MIN(b.sal) from emp b where a.deptno = B.deptno) from dept a group by deptno having (select MIN(b.sal) from emp b where a.deptno = B.deptno) > 900;
–21.统计每个部门工资在1400元以上的所有员工的工资总额。
select deptno,SUM(sal) from emp where sal > 1400 group by deptno;
–22.统计不同工作的个数。 ---- 未做出来
select count(distinct job) from emp;
–23.找出各月倒数第3天受雇的所有员工。 -- day 无法实现
–24.找出早于12(30)年前受雇的员工。
–25.以首字母大写的方式显示所有员工的姓名。 -- INITCAP
select INITCAP(ename) from emp
–26.显示正好为5个字符的员工的姓名。
select ename from emp where ename like '_____'
–27.显示不带有“R”的员工的姓名。
select ename from emp where ename != '%R%'
–28.显示所有员工姓名的前三个字符。
select substr(ename,0,3) from emp
–29.显示所有员工的姓名,用“a”替换所有“A”。
select REPLACE(ename,'A','a') from emp;
–30.显示满10(30)年服务年限的员工的姓名和受雇日期。
–31.显示员工的详细资料,按名称排序。
select * from emp order by ename
–32.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面。
select ename 姓名,hiredate 受雇日期 from emp order by hiredate asc
–33.显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序。
select ename 姓名,job 工作,sal 薪水 from emp order by job desc,sal asc
–35.显示在一个月为30天的情况所有员工的日薪金,忽略余数。
select ename 员工,sal/30 薪水 from emp
–36.找出在(任何年份的)2月受聘的所有员工。
–37.对于每个员工显示其加入公司的天数。
–38.显示姓名字段的任何位置包含“A”的所有员工的姓名。
select ename from emp where ename like '%A%'
–39.以年月日的方式显示所有员工的服务年限(大概)。
–40.列出至少有一个员工的所有部门信息。
select * from dept where deptno in (select deptno from emp);
–41.列出薪金比“SMITH”多的所有员工。
select ename from emp where sal>(select sal from emp where ename='SMITH')
–42.列出所有员工的姓名及其直接上级的姓名。
elect a.ename 员工,(select ename from emp where a.mgr = empno) 上级 from emp a order by ename;
–43.列出受雇日期早于其直接上级的所有员工。
–44.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
–45.列出所有“CLERK”(办事员)的姓名及其部门名称。
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno and e.job = 'CLERK'
–46.列出最低薪金大于1500的各种工作。 -- 交集
select job from emp where sal >=1500
union
select job from emp where sal >=1500
–47.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select ename from emp where deptno = (select d.deptno from dept d where d.dname = 'SALES');
–48.列出与“SCOTT”从事相同工作的所有员工。
select ename from emp where job=(select job from emp where ename='SCOTT')
–49.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。(不确定题意。)
–50.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
–51.列出在每个部门工作的员工数量、平均工资和平均服务期限。
–52.列出所有员工的姓名、部门名称和工资。
select e.ename 员工姓名,d.dname 部门名称,e.sal 员工工资 from emp e,dept d where e.deptno = d.deptno
–53.列出所有部门的详细信息和部门人数。
select dept.*,(select COUNT(empno) from emp where dept.deptno = emp.deptno) 部门人数 from dept -- empno 代表人员编号
–54.列出各种工作的最低工资。
select job,min(sal) from emp group by job -- 两列都是用了 job 因此要使用 group
–55.列出各个部门的MANAGER(经理)的最低薪金。
–56.列出所有员工的年工资,按年薪从低到高排序。
select e.empno 员工编号,e.ename 员工姓名,e.sal*12 年薪 from emp e order by sal desc
–57.列出工资最高的员工信息。
select max(sal) from emp
select * from emp where sal=(select max(sal) from emp )
---------------------