Oracle数据库练习题(2)
一、表展示
二、练习题及答案
11.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
(1)select t.empno, t.empname, d.dnamefrom (select a.empno,a.ename as empname,a.hiredate as emphiredate,a.deptno,b.ename as leadername,b.hiredate as leaderhiredatefrom empgj aleft join empgj b on a.mgr = b.empno) t,deptgj dwhere emphiredate < leaderhiredateand t.deptno = d.deptno;
(2)select a.empno, a.ename, d.dnamefrom empgj aleft join empgj b on a.mgr = b.empnoleft join deptgj d on a.deptno = d.deptnowhere a.hiredate < b.hiredate;
12.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
select d.dname,e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptnofrom deptgj dleft join empgj e on d.deptno = e.deptno;
select d.dname,e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptnofrom empgj eleft join deptgj d on d.deptno = e.deptno;
select d.dname,e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptnofrom empgj e, deptgj dwhere d.deptno = e.deptno;
可以看到只有第一种写法把没有员工的部门也输出出来了,后面两种并没有
ps:(1)注意left join,join与rhght join的区别:
left join是组合两表符合条件内容部分以及左表的全部内容(在取出如“取出所有部门并列出没有员工的部门”时很有用);
join等于inner join,组合两表符合条件内容;
right join一般都转化为left join使用。
(2)表连接(join)在on后跟分组条件;
分组(group by)在having后跟分组条件;
select查询在where后跟查询条件。
13.列出薪金比"SMITH"多的所有员工信息
select empno, ename, job, mgr, hiredate, sal, comm, deptnofrom empgjwhere sal > (select sal from empgj where ename = 'smith')
14.列出至少有一个员工的所有部门
select distinct d.dnamefrom empgj einner join deptgj d on e.deptno = d.deptno
15.列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数
select e.ename, d.dname, t.numofpeoplefrom empgj eleft join deptgj d on e.deptno = d.deptnoinner join (select deptno, count(1) as numofpeoplefrom empgjgroup by deptno) t on e.deptno = t.deptnowhere e.job = 'clerk'
第一步查出各个部门的人数:
select deptno, count(1) as numofpeople from empgj group by deptno
第二步查出所有“clerk”的姓名及其部门名称:
select e.ename,d.dnamefrom empgj eleft join deptgj d on e.deptno = d.deptnowhere e.job='clerk'
第三步联系二者关联字段deptno组成新的查询语句
ps:从子表取count(1)的时候无法直接按“t.count(1)”的写法来取,需要为其取别名
16.列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数
select job, count(1) from empgj group by job having min(sal) > 1500
常见的几个聚合函数
① 求个数:count
② 求总和:sum
③ 求最大值:max
④ 求最小值:min
⑤ 求平均值:avg
聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用
本条语句的count就是对group by后跟的job进行统计
17.列出在部门"SALES"(销售部)工作的员工的姓名,假定不知道销售部的部门编号
select e.ename, e.deptno, d.dnamefrom empgj eleft join deptgj d on e.deptno = d.deptnowhere d.dname = 'sales';
18.列出与"SCOTT"从事相同工作的所有员工及部门名称
(1)select e.ename, d.dname, e.jobfrom empgj eleft join deptgj d on e.deptno = d.deptnowhere e.job = (select job from empgj where ename = 'scott');
(2)select e.ename, d.dname, e.jobfrom empgj e, deptgj dwhere e.job = (select job from empgj where ename = 'scott')and e.deptno = d.deptno;
19.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金
select e.ename, e.sal, e.deptnofrom empgj ejoin (select sal from empgj where deptno = '30') t on e.sal = t.sal;
20.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称
(1)select e.ename, e.sal, d.dnamefrom empgj eleft join deptgj d on e.deptno = d.deptnowhere e.sal > ALL (select sal from empgj where deptno = 20);
(2)select e.ename, e.sal, d.dnamefrom empgj eleft join deptgj d on e.deptno = d.deptnowhere e.sal > (select max(sal) from empgj where deptno = 20);
上面两条语句效果是对等的
any与all都用于子查询
any 代表任意一个
all 代表所有
any表示有任何一个满足就返回true,all表示全部都满足才返回true
21.列出在每个部门工作的员工数量,平均工资和平均服务期限
select deptno,count(1),avg(sal),avg(months_between(sysdate,hiredate)/12) yearfrom empgjgroup by deptno;
select deptno,count(1),avg(sal),avg(months_between(to_date('2000-1-1','yyyy/mm/dd'),hiredate)/12) yearfrom empgjgroup by deptno;
MONTHS_BETWEEN (date1, date2)用于计算date1和date2之间有几个月
如果date1在日历中比date2晚,那么MONTHS_BETWEEN()就返回一个正数
如果date1在日历中比date2早,那么MONTHS_BETWEEN()就返回一个负数
如果date1和date2日期一样,那么MONTHS_BETWEEN()就返回一个0
那么求日期差,月份差,年差就都出来了:
日期差:select to_date('05/30/2018','mm/dd/yyyy')-to_date('05/01/2018','mm/dd/yyyy') from dual;
月份差用MONTHS_BETWEEN (date1, date2)函数,年份差再除以12
详细用法参考:点击打开链接
22.列出所有部门的详细信息和人数
select d.deptno, d.dname, nvl(t.numofpeople, 0)from deptgj dleft join (select deptno, count(1) as numofpeoplefrom empgjgroup by deptno) t on d.deptno = t.deptno;
nvl(arg,n)函数:如果arg这个参数是null的话,那么就用n这个数代替arg
23.列出各种工作的最低工资及从事此工作的雇员姓名
select e.ename,t.job,t.minsal from empgj e join
(select job,min(sal)as minsal from empgj group by job) t
on e.job = t.job and e.sal = t.minsal;
24.列出各个部门的MANAGER(经理)的最低薪金
(1)select t2.minsal, d.dnamefrom (select min(sal) as minsal, t.deptnofrom (select sal, deptno from empgj where job = 'manager') tgroup by t.deptno) t2join deptgj d on t2.deptno = d.deptno;
(2)select d.dname, t.minsalfrom (select deptno, min(sal) as minsalfrom empgjwhere job = 'manager'group by deptno) tjoin deptgj d on t.deptno = d.deptno;
最外层是把deptno转变成dname显示的查询,核心内容还是查询各个部门的经理的最低薪金,这里用了两种方法
方法(1):
步骤一:查询不同部门经理的薪金,得出字段为经理和部门号的表t:
select sal, deptno from empgj where job = 'manager'
步骤二:对表t操作,查询表t中按部门号分组后每组的最低薪金,这里就得出了各个部门的经理的最低薪金:
select min(sal) as minsal, t.deptnofrom tgroup by t.deptno
方法(2):
对empgj单表操作,直接查询各个部门的经理的最低薪金:
select deptno, min(sal) as minsalfrom empgjwhere job = 'manager'group by deptno
刚开始看到这条语句我被惊艳到了,竟然有如此简洁的语句来查询一个比较复杂的内容;但是empgj表数据比较少,每个部门只有一个经理,可能展示出来的数据不准确,所以有必要多做几条数据;考虑到MySQL中也有group by的用法,而且MySQL的图形界面工具更易操作,我就用MySQL检查了这两条语句,发现并没有问题!
25.列出所有员工的年工资,按年薪从低到高排序
select empno, ename, (sal + nvl(comm, 0)) * 12 yearsalfrom empgjorder by yearsal asc;
select empno, ename, (sal + nvl(comm, 0)) * 12 yearsalfrom empgjorder by yearsal;
asc:按升序排列,也是默认排序可省略不写
desc:按降序排列
26.求出部门名称中,带'S'字符的部门员工的工资合计、部门人数
select t.dname, sum(sal), count(1)from (select e.empno, e.sal, d.dnamefrom empgj ejoin deptgj d on e.deptno = d.deptnowhere d.dname like '%s%') tgroup by t.dname;
Oracle中like的用法可参考:点击打开链接
27.列出所有办事员(CLERK)的姓名,编号和部门编号
select ename, empno, deptno from empgj where job = 'clerk';
28.找出佣金高于薪金的员工
select empno, ename, comm, sal from empgj where comm > sal;
29.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料
select empno, ename, job, mgr, hiredate, sal, comm, deptnofrom empgjwhere (deptno = 10 and job = 'manager')or (deptno = 20 and job = 'clerk')
这里有个and和or的优先级问题,and的优先级是高于or的,所以其实不要括号效果是一样的,但是我一直觉得跟写程序一样,代码是机器运行的,但更是写给人用的,所以代码的可读性与可维护性在我心中的地位是非常高的;写SQL语句同理,所以加括号方便阅读,更不需要我们去关心符号的优先级,我选择使用括号!
30.找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK),既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料
select empno, ename, job, mgr, hiredate, sal, comm, deptnofrom empgjwhere (deptno = 10 and job = 'manager')or (deptno = 20 and job = 'clerk')or (job != 'manager' and job != 'clerk' and sal >= 2000);
Oracle数据库练习题(1)
Oracle数据库练习题(3)
Oracle数据库练习题(2)相关推荐
- Oracle数据库练习题(1)
一.建表 create table empgj(empno number(4,0) primary key,ename varchar2(10), job varchar2(9),mgr number ...
- 史上最难oracle数据库练习题(附答案)
oracle数据库练习题,所有练习数据都来自于安装oracle数据库后,自带的那几张表,EMP,DEPT等. 部分题目答案已给出,若有异议可以私聊一起探讨. 第一题: 统计薪资大于 薪资最高的员工所 ...
- ORACLE数据库练习题整理(2)
阅读目录 1. 2. 3. 4. 5. 6. 7. 8.MySql 9. 1. Oracle数据库的服务: OracleServiceOrcl/OracleServicesid:数据库实例服务,是数据 ...
- Oracle数据库练习题及答案大全(包含数据库脚本)
目录 删表语句 建表语句 插入数据 练习题及答案 整理不易,请仔细阅读,希望对你有帮助 可自行复制粘贴,仅供参考,如有问题请及时私信或评论,我会一一回复 删表语句 drop TABLE STUDENT ...
- Oracle数据库练习题
题目:设计以下表,完成相关问题SQL编写. 学生表 student (sno,sname,sage,ssex) 课程表 course (cno,cname,tno) 成绩表 sc (sno,cno,g ...
- oracle数据库经典练习题及答案
最近下载了一套oracle数据库习题(无答案),本人自己在oracle上练习得到的答案,如果不对的地方,请不要见怪.保存到博客方便自己以后查阅. 相关表: /*学生表*/ create table s ...
- oracle数据库课后习题答案,oracle数据库经典练习题及答案
最近下载了一套oracle数据库习题(无答案),本人自己在oracle上练习得到的答案,如果不对的地方,请不要见怪.保存到博客方便自己以后查阅. 相关表: /*学生表*/ create table s ...
- oracle数据库的练习题,《Oracle数据库应用》练习题及答案
<<Oracle数据库应用>练习题及答案>由会员分享,可在线阅读,更多相关<<Oracle数据库应用>练习题及答案(10页珍藏版)>请在人人文库网上搜索 ...
- oracle数据库应用与开发习题,《Oracle数据库应用》练习题及答案.docx
<Oracle数据库应用> 选择题在Windows操作系统中,Oracle的____服务监听并接受来自客户端应用程序的连接请求.A.OracleHOME_NAMETNSListenerB. ...
最新文章
- HDU 1847 Good Luck in CET-4 Everybody!(组合博弈)
- SQL SERVER 2000 安装问题
- 修改so_新手向总结:IDA动态调试So的一些坑
- ajax php 不影响进程,ajax已并发请求php,但php-fpm却没有如预期fork出多个进程来处理?...
- php 获取某一年最后一天_vivo年货节最后一天!多款机型大促,错过让你后悔再等一年!...
- b样条和三次样条_样条曲线
- linux边看系统信息,Linux查看系统信息大全[备忘]
- Linux7没有网卡,centos7安装后缺少网卡如何解决?
- photoshop菜鸟实用入门(2)----常用的一些快捷操作
- Git配置信息相关命令
- shell脚本编写笔记
- 西门子plc语句表是c语言吗,三菱、西门子PLC常用语句表,速来收!
- php测试宽带速度慢,别被运营商骗了! 手把手教你学会测自家网速
- excel自动求和_Excel里面SUM函数增加行后数据自动加进去的方法
- UI设计师福利之手把手打造SVG动画应用的微场景
- mailgun php版本,如何使用mailgun php API仅向bcc发送邮件?
- 投影坐标系、大地坐标系(地理坐标系)
- 考研最卷的专业,我们替你查到了!
- dbForge Studio for MySQL_完美破解版
- 非常详细的讲解让你深刻理解神经网络NN(neural network)
热门文章
- 肝了一晚上搞出来一个微信订阅号鉴黄机器人
- 图书管理系统-数据库设计
- 通过hover显示子元素
- git入职第一天快速使用指南
- 【Java代码】MP3、flac歌曲批量生成同名的“xxx.lrc”歌词文件导入索尼黑砖二代
- 2023春季露营投影怎么选?轻薄投影极米Z6X Pro值得推荐
- python仿360界面_python实现360的字符显示界面
- 第六天 色彩调整 2019-05-17
- 自发光效果(控制自发光的颜色、强度,呼吸光可选)
- 中国.net域名网站的“前世今生”,那些年的光辉