zoukankan      html  css  js  c++  java
  • 对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    
  • 相关阅读:
    javaScript快速入门
    解决编程式路由往同一地址跳转时会报错的情况
    babel 依赖
    路由拆分可以达到一定程度的性能优化
    正则的扩展
    设计模式
    mysql数据库
    php基本语法
    事件循环
    面向对象编程
  • 原文地址:https://www.cnblogs.com/aa1314/p/8082291.html
Copyright © 2011-2022 走看看