对Oracle数据库的相关练习

  1 作业
  2 Oracle基本操作练习题  
  3 Scotte用户下的两张数据表描述:
  4 员工表(emp):
  5 (
  6   empno NUMBER(4)notnull,  --员工编号,表示唯一
  7   ename VARCHAR2(10),    --员工姓名
  8   job VARCHAR2(9),    --员工工作职位
  9   mgr NUMBER(4),      --员工上级领导编号
 10   hiredate DATE,      --员工入职日期
 11   sal NUMBER(7,2),    --员工薪水
 12   comm NUMBER(7,2),    --员工奖金
 13   deptno NUMBER(2)    --员工部门编号
 14 ) ;
 15 
 16 部门表(dept):
 17 (
 18   deptno NUMBER(2)notnull,  --部门编号
 19   dname VARCHAR2(14),      --部门名称
 20   loc VARCHAR2(13)      --部门地址
 21 );
 22 
 23 
 24 一、表的查询[所有小数都保留1位有效数字]
 25    1.查询出emp表中总工资大于2500的员工姓名,基本工资,奖金,总工资
 26     select ename,sal+nvl(comm,0) as sal from emp where sal>2500
 27          
 28    
 29    2.请查询出emp表中姓名长度超过4位并且姓名中包含m或M字符的员工信息。
 30    select * from emp where ename like '%M%' and length(ename)>4
 31    
 32    3.请查询出emp表中最高级别领导的姓名。
 33    select ename from emp where MGR is null;
 34    
 35    4.请查询出emp表中所有领导的姓名。
 36    select ename from emp where empno in (select mgr from emp group by mgr);
 37    
 38    5.请查询出emp表中同SCOTT一年入职的员工信息
 39    select * from emp where extract(year from hiredate)=(select extract(year from hiredate) from emp where ename='SCOTT')
 40    
 41    
 42    6.请查询出所有12月份入职的员工信息
 43    select * from emp where extract(month from hiredate)=12
 44    
 45    
 46    7.请查询出emp中姓名后2个字符是ES的员工信息
 47    select * from emp where ename like '%ES';
 48    
 49    8.请查询出所有1981入职员工的总工资,平均工资,人数
 50    select substr(hiredate,8,9) from emp;
 51    
 52    select sum(sal+nvl(comm,0)) 总工资,avg(sal+nvl(comm,0)) 平均工资,count(*) 总人数 from emp
 53     where substr(hiredate,8,9)=81;
 54    9.请查询出不同年份入职员工的总工资,平均工资,人数和年份[只显示年]
 55    select sum(sal),avg(sal),count(*),extract(year from hiredate) from emp group by extract(year from hiredate)
 56    10.请查询出各部门总工资,平均工资,部门名称,并在部门内部排序,给出名次
 57    select deptno,sum(sal*12+nvl(comm,0))总工资,round(avg(sal*12+nvl(comm,0)))平均工资,row_number() over(order by (round(avg(sal*12+nvl(comm,0)))) desc)from emp group by deptno;
 58    11.请查询出emp表中所有员工姓名,总工资,部门名称
 59    select ename,sal*12+nvl(comm,0),dname from emp,dept;
 60    
 61    12.请查询出emp中各部门员工的总人数,总工资,平均工资,并根据平均工资倒序
 62    select deptno as 部门名称,
 63           count(*) as 总人数,
 64           sum(sal+nvl(comm,0)) as 总工资,
 65           avg(sal+nvl(comm,0)) as 平均工资       
 66     from emp group by deptno order by avg(sal+nvl(comm,0)) desc;
 67     
 68     select * from emp;
 69    13.请查询出各个部门员工的总人数,平均工资,部门名称
 70    select d.dname 部门名称,count(*) 总人数,avg(e.sal+nvl(comm,0)) 平均工资 from emp e,dept d
 71    where d.deptno=e.deptno
 72    group by d.dname
 73    
 74    14.请查询出各部门的名称,最高工资,最低工资,平均工资,并且平均工资保留1位有效数字,最后按照平均工资倒序
 75    select DNAME as 部门名称,max(SAL) as 最高工资, min(SAL)as 最低工资,round(avg(SAL),1) as 平均工资 from emp e left join dept d
 76    on e.deptno = d.deptno
 77    group by DNAME
 78    order by avg(SAL) desc;
 79    
 80    15.请查询出部门名称为SALES的所有员工信息
 81    select * from dept
 82    select * from emp
 83    select empno,ename,job,mgr,hiredate,round(sal,1),round(comm,1),deptno from emp where deptno=(select deptno from dept where dname='SALES')
 84    16.请查询出没有员工的部门名称
 85    select dname from dept where deptno not in (select deptno from emp group by deptno)
 86    
 87    17.请查询出1981年入职人数超过2人的部门名称,入职人数
 88    select dname 部门名称,count(*) from emp,dept
 89    where emp.deptno=dept.deptno and extract(year from hiredate)=1981
 90    group by dname
 91    having count(*)>2
 92    
 93    
 94    18.请查询出各部门工资最高的2个人信息,部门名称及工资
 95    select 姓名,部门名称,工资 from
 96    (
 97      select 
 98      ename as 姓名,
 99      dname as 部门名称,
100      sal+nvl(comm,0) as 工资,
101      row_number() over(partition by dname order by sal+nvl(comm,0) desc) as 排名
102      from emp e left join dept d
103      on e.deptno=d.deptno
104     )where 排名<=2
105    19.请查询出同一个岗位有2个人以上工资在1000以上的岗位名称和人数
106    select *from emp ;
107    select job,count(*) 人数 from emp where sal>1000
108    group by job
109    having count(*)>2
110    
111    
112    
113    20.请查询与SCOTT在同一个部门的所有员工姓名,部门名称和岗位信息
114    select e.ename as 员工姓名,d.dname as 部门名称,e.job as 岗位信息 from dept d left join emp e on d.deptno=e.deptno
115    where d.dname=(select d.dname from dept d left join emp e on d.deptno=e.deptno where e.ename='SCOTT')
116 
117 
118 二、函数的熟练使用
119    1.查询出当前日期,当前时间
120    SELECT SYSDATE FROM DUAL ;
121    2.将当前日期转换为制定格式,如:2014-11-15 15:30
122    SELECT to_char(sysdate,'yyyy-mm-dd') from dual
123    3.分别取出当前日期的年,月,日
124    select substr(to_char(sysdate,'yyyymmdd'),0,4),substr(to_char(sysdate,'yyyymmdd'),5,2),substr(to_char(sysdate,'yyyymmdd'),7,2) from dual
125   
126  4.请计算出字符串'hello world!'的长度
127    select length('hello world!') from dual;
128    
129  5.请截取出字符串'hello world!'中的'world'字符串
130  select substr('hello world!'7,5) from dual;
131  
132    6.请判断字符串'hello world!'中是否包含l字符
133    select count(*) as 一为包含零为不包含 from dual 
134    where instr('hello world!','l') between 1 and length('hello world!');
135    
136    select count(*) as 一为包含零为不包含 from dual 
137    where 'hello world!' like '%l%';
138    7.请判断字符串'hello world!'中是不是只包含一个l字符
139    select instr('hello world!','l'),instr('hello world!','l',-1) from dual ;
140    
141    8.请去掉' hello world! '左边的空格
142    select ltrim('hello world!') from dual;
143    
144    9.请将字符串'hello World'中字符l替换为L
145    select replace('hello world','l','L')from dual;
146    10.将字符串152.568转换为数字并保留5位有效数字,其中2位是小数
147    select to_char('152.568','99G999D99') from  dual
148    
149 三、
150 1.找出部门10中所有经理、部门20中所有办事员以及既不是经理又不是办事员但其薪金大于或等于2000的所有雇员的详细资料
151 select * from emp where (deptno=10 and job='MANAGER') or (deptno=20 and job='CLERK') or (job<>'MANAGER'and job<>'CLERK'and sal>=2000);
152 2.找出收取佣金的雇员的不同工作
153 select distinct JOB from emp where comm>=0
154 
155 
156 3.显示雇员姓名,根据其服务年限,将最老的雇员排在最前面。
157 select ename 雇员名称,hiredate 入职时间,to_char(hiredate,'yyyy') 服务年限 from emp order by hiredate asc
158 4.显示在一个月为30天的情况下所有雇员的日薪金,忽略余数
159 select ename,sal+nvl(comm,0) 日薪金 from emp;
160 
161 5.以年、月和日显示所有雇员的服务年限
162 select to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd')-to_date(to_char(hiredate,'yyyy-mm-dd'), 'yyyy-mm-dd') 入职天数,trunc(months_between(sysdate,hiredate)) 入职月份,to_char(sysdate,'yyyy')-to_char(hiredate,'yyyy') 入职年份 from emp
163 
164 6.列出薪金高于在部门30工作的所有雇员的姓名和薪金
165 select * from emp
166 where sal>(
167       select max(sal) from emp where deptno=30
168 )
169 
170 7.列出各种类别工作的最低工资
171 select job as 工作类型,min(sal) as 最低工资 from emp group by job ;
172 8.列出薪金水平处于第四位的雇员信息
173 select * from (select emp.*,rank() over (order by sal desc) i from emp )where i = 4
174 9.显示所有雇员的姓名以及满10年服务年限的日期
175 select ename,hiredate,add_months(hiredate,12*10) from emp
176 10.找出奖金高于薪金60%的雇员
177 select * from emp where comm>(sal * 0.6);
178 
179 四、
180 1.查询出emp表中总工资大于2500的员工姓名,基本工资,奖金,总工资。
181   select ename 员工姓名,sal 基本工资,nvl(comm,0) 奖金,sal+nvl(comm,0) 总工资 from emp where (sal+nvl(comm,0))>2500
182   
183   select * from emp
184 2.请查询出各个部门员工的总人数,平均工资,部门名称
185 select dname 部门名称,count(*) 总人数,nvl(avg(sal),0) 平均工资 from dept t left outer join emp e on t.deptno=e.deptno  group by e.deptno,dname
186 
187 3.根据当前时间日期,查询前天是什么时间
188 select to_char(sysdate-2,'yyy-mm-dd hh:mi:ss') from dual ;
189 4.分别取出当前日期的年,月,日
190 select to_char(sysdate,'yyyy') 年,to_char(sysdate,'mm') 月,to_char(sysdate,'dd') 日 from dual;
191 
192 5.请将编号为7499的员工工资调整为2600元
193 select * from emp
194 select empno as 编号,sal as 工资 from emp where empno='7499'
195 update emp set sal='2600' where empno='7499'
196 
197 
198 6.创建一个新表为emp,里面有编号,姓名,待遇,入职时间,并以员工的姓名,待遇,然后用"姓名:xxx,待遇:xxx"格式显示
199 create table emp1
200 as 
201 select empno,ename,hiredate,sal from emp;
202 select '编号:'||empno 编号,'姓名:'||ename 姓名,'入职时间:'||hiredate 入职时间,'待遇:'||sal 待遇 from emp1;       
203 
204 
205 7.根据上一题的emp,获取第二个员工的姓名长度
206 select ename,length(ename) 长度,rn 序号 from(
207    select ename,row_number() over(order by empno)rn from emp1
208    
209 )where rn=2
210 
211 8.根据6题的emp表,查询出所有员工姓名,待遇并显示,但是待遇用#隐藏
212 select ename 姓名,replace(sal,sal,'#') 待遇 from emp1;
213 
214 9.根据6题的emp表,--查询出第一个员工和第二个员工相隔多少天入职
215 
216 
217 10.根据6题的emp表,请根据工资待遇排序,然后查询出排名基数位的员工信息
218 select * from 
219 (select ename as 姓名,sal as 待遇,row_number() over (order by sal desc) as rn from emp)
220 where mod(rn,2)=1;
221 
222 五、
223 1.找出奖金高于薪水60%的员工信息。
224 select * from emp
225 where nvl(comm,0)>sal*0.6;
226 
227 2.找出部门10中的职位为(MANAGER)和部门20中所有职位为(CLERK)的详细资料。   
228 select * from emp e,dept t where e.deptno=t.deptno and 
229 ((e.deptno=10 and job='MANAGER') or (e.deptno=20 and job='CLERK'));
230 
231 3.统计各部门的薪水总和。  
232 select dname,sum(sal) from emp e left outer join dept t on e.deptno=t.deptno group by dname;
233 select deptno,sum(sal) from emp group by deptno;
234 select * from emp;
235 4.找出部门10中的职位为(MANAGER),部门20中所职位为(CLERK)以及职位不是(MANAGER)但其薪水大于或等2000的所有员工的详细资料。   
236 
237 5.列出各种工作的最低工资。
238 
239 6.列出各个部门的职位为(MANAGER)的最低薪水。 
240 
241 7.找出没奖金或奖金低于300的员工。  
242 
243 8.显示所有员工的姓名,首字母大写。 
244 
245 9.显示正好为5个字符的员工的姓名。 
246 
247 10.显示不带有“R”的员工姓名。   
248 
249 六、
250 1、请查询出dept表中每个部门的编号,员工总人数,最高工资,最低工资,总工资和平均工资,并按照部门编号倒叙排序。
251 
252 2、请查询出dept表中每个部门的编号,每个部门的总年薪(包括奖金)以及每个部门的平均年薪。
253 
254 3、请查询出每个部门的编号和各个部门员工的平均工作年限。
255 
256 4、请查询出员工受雇日期早于自身上级领导的所有员工的编号,姓名,上级姓名和部门名称。
257 
258 5、请查询出最低工资大于1500的各种工种以及从事此工资的全部员工人数。
259 
260 6、请查询出部门名称为“SALES”的员工的姓名、工资,并按照雇佣日期的先后进行排序。
261 
262 7、请查询出基本工资高于平均工资的所有员工姓名,员工工作,上级领导姓名,所在部门地址信息。
263 
264 8、查询出每个雇员所在月倒数第二天被雇佣的雇员信息。
265 
266 9、查询出所有已经被雇佣了35年以上的员工信息。
267 
268 10、统计出emp表中共有多少个职位。  
269 
270 七、 
271 1、请查询出emp表中第1-3条员工的信息
272 
273 2、请查询出工资待遇在2000以上的员工姓名,工资
274 
275 3、显示姓名正好为5个长度的所有员工   
276 
277 4、显示带有'R'的员工的详细   
278 
279 5、显示员工姓名的前三个字符  
280 
281 6、显示所有员工的姓名,用‘a’替换所有的'A'   
282 
283 7、显示一个月为30天的情况下,所有员工的日薪,忽略余数  
284 
285 8、请查询出工资待遇大于平均工资的员工信息
286 
287 9、显示所有员工的姓名、工作和薪金,按工作的降序排列,工作相同则按照薪金的升序排列  
288   
289 10、显示一个月为30天的情况下,所有员工的日薪,忽略余数  
290 
291 八、
292 1、请查询出各部门的平均工资
293 
294 2、请查询出各部门的总人数
295 
296 3、请查询出各部门工资最高的员工信息
297 
298 4、请查询出所有员工的姓名和总工资(基本工资+奖金)
299 
300 5、请查询出所有员工的姓名以及至今入职了多少个月,并按倒序排序
301 
302 6、请查询出姓名含有“T”的员工信息
303 
304 7、请查询出姓名以“T”结尾的员工信息
305 
306 8、请查询出工资最高的前三名员工,并按倒序排序
307 
308 9、请查询出工资高于平均工资的所有员工信息
309 
310 10、请按部门编号查询出所有员工信息,并显示偶数位的员工信息
311 
312 九、
313 1、查询出emp表中的员工姓名,基本工资,奖金,总工资并按总工资从高到低排序。
314 
315 2、查询出emp表中的员工比平均工资要高的基本信息
316 
317 3、查询出emp表中1981年进来公司的员工基本信息
318 
319 4、查询出emp表中姓名后1个字符是S的员工信息
320 
321 5、查询出emp表中没有奖金的员工的姓名和基本工资
322 
323 6、查询出emp表中在RESEARCH部门担任CLERK这职务的员工信息
324 
325 7、查询出emp中员工编号7369的员工部门中的所有员工姓名,部门名称和岗位信息
326 
327 8、查询出emp中工资排在第3到第6的员工信息。
328 
329 9、查询出人数最多的部门名称和平均工资。
330 
331 10、请查询出emp表中同SCOTT一年入职的员工信息及所在部门。   
332    
333    
334 十、创建以下数据表,并按要求完成以下题目。
335 --班级表(编号,名称)
336 create table cls(
337   cno number primary key,
338   cname varchar2(20)       
339 ) ;
340 
341 --老师表(编号,姓名,性别,班级编号)
342 create table teacher(
343   tno number primary key,
344   tname varchar2(20),
345   tsex char(2) default '' check(tsex='' or tsex=''),
346   tcno number,
347   foreign key(tcno) references cls(cno)
348 )
349 --学生表(编号,姓名,性别,年龄,入学时间,地址,在读状态,班级编号)
350 create table stu(
351   sno number primary key,  
352   sname varchar2(20),
353   ssex char(2) default '' check(ssex='' or ssex=''),
354   sage number,
355   sintime date,
356   --记录学生状态的列,1的时候为在读,0的时候则已经退学
357   sstatus number default 1 check(sstatus = 1 or sstatus = 0),
358   scno number,
359   foreign key(scno) references cls(cno)
360 )
361 --分数表(编号,成绩,学生编号)
362 create table mark(
363   mno number primary key,
364   mcj number(4,1) check(mcj >= 0),
365   msno number,
366   foreign key(msno) references stu(sno)
367 )
368 
369 --添加初始化数据
370 
371 --插入班级测试数据
372 insert into cls 
373   select 1,'ST01' from dual 
374   union 
375   select 2,'ST02' from dual;
376 
377 --插入老师测试数据
378 insert into teacher values(1,'涂老师','',1);
379 insert into teacher values(2,'刘老师','',1);
380 insert into teacher values(3,'陈老师','',2);
381 insert into teacher values(4,'李老师','',2);
382 insert into teacher values(5,'蔡老师','',1);
383 
384 --插入学生测试数据
385 insert into stu values(1,'小一','',20,to_date('2016-6-13','yyyy-mm-dd'),default,1);
386 insert into stu values(2,'小二','',21,to_date('2016-6-13','yyyy-mm-dd'),default,1);
387 insert into stu values(3,'小三','',20,to_date('2016-6-13','yyyy-mm-dd'),default,1);
388 insert into stu values(4,'小四','',19,to_date('2016-6-15','yyyy-mm-dd'),default,1);
389 insert into stu values(5,'小五','',19,to_date('2016-6-15','yyyy-mm-dd'),default,1);
390 insert into stu values(6,'小六','',21,to_date('2016-6-15','yyyy-mm-dd'),default,1);
391 insert into stu values(7,'小七','',21,to_date('2016-6-20','yyyy-mm-dd'),0,1);
392 insert into stu values(8,'小八','',20,to_date('2016-6-20','yyyy-mm-dd'),default,1);
393 insert into stu values(9,'小九','',23,to_date('2016-6-21','yyyy-mm-dd'),default,1);
394 insert into stu values(10,'小十','',21,to_date('2016-6-21','yyyy-mm-dd'),0,1);
395 
396 insert into stu values(11,'大一','',20,to_date('2016-7-3','yyyy-mm-dd'),default,2);
397 insert into stu values(12,'大二','',21,to_date('2016-7-3','yyyy-mm-dd'),default,2);
398 insert into stu values(13,'大三','',20,to_date('2016-7-3','yyyy-mm-dd'),default,2);
399 insert into stu values(14,'大四','',19,to_date('2016-7-6','yyyy-mm-dd'),default,2);
400 insert into stu values(15,'大五','',19,to_date('2016-7-6','yyyy-mm-dd'),default,2);
401 insert into stu values(16,'大六','',21,to_date('2016-7-9','yyyy-mm-dd'),default,2);
402 insert into stu values(17,'大七','',21,to_date('2016-7-9','yyyy-mm-dd'),default,2);
403 insert into stu values(18,'大八','',20,to_date('2016-7-9','yyyy-mm-dd'),default,2);
404 insert into stu values(19,'大九','',23,to_date('2016-7-13','yyyy-mm-dd'),0,2);
405 insert into stu values(20,'大十','',21,to_date('2016-7-13','yyyy-mm-dd'),default,2);
406 
407 --插入分数测试数据
408 insert into mark values(1,90,1);
409 insert into mark values(2,80,1);
410 insert into mark values(3,92,2);
411 insert into mark values(4,91,3);
412 insert into mark values(5,58,4);
413 insert into mark values(6,64,5);
414 insert into mark values(7,72,11);
415 insert into mark values(8,65,12);
416 insert into mark values(9,58,12);
417 insert into mark values(10,96,13);
418 insert into mark values(11,91,15);
419 insert into mark values(12,53,7);
420 insert into mark values(13,61,7);
421 
422 
423 题目:
424 1.请查询出名字带''的21岁以上在读男生信息
425 
426 2.请查询出‘ST01’班级的所有在读女生的姓名与性别以及'ST02'班级所有在读男生的姓名与性别
427 
428 3.请查询出和“小二”同学入学日期中的“日”相同的所有在读学生信息
429 
430 4.请统计各班在读男生人数以及女生人数并按人数倒序排序
431 
432 5.请查询出所有考试两次的在读学员信息
433 
434 6.请查询名为“小一”所在班级的所有教师信息
435 
436 7.请查询出班级学生平均分最高的班级名称
437 
438 8.请查询出所有班级的在读学生的姓名、分数
439 
440 9.请查询出所有涂老师所在班级的在读学生的姓名、分数
441 
442 10.请统计各班级在读学生人数以及教师人数
443 
444 
445 //由于时间关系没能完全做完这些练习
446    
447    

 

posted @ 2017-12-21 20:16  Don't差不多  阅读(556)  评论(0编辑  收藏  举报