【Oracle】Oracle练习

1.将职位是分析员的,工资+1000;职位是经理的,工资+800;职位是其它的,工资+400

使用case表达式

select ename "姓名",job "职位",sal "涨前工资",
       case job
         when 'analyst' then sal + 1000
         when 'manager' then sal + 800
       else
         sal + 400
       end "涨后工资"
from emp;

使用decode函数实现

select ename "姓名",job "职位",sal "涨前工资",
       decode(job,'analyst',sal +1000,
       'manager',sal + 800,sal+400) "涨后工资"
from emp;

【Oracle】Oracle练习_第1张图片

易错总结: 注意双引号和单引号的使用场景

单引号出现的地方如下:

1)字符串,例如:'hello'
2)日期型,例如:'17-12月-80'
3)to_char/to_date(日期,'YYYY-MM-DD HH24:MI:SS')

双引号出现的地方如下:
1)列别名,例如:select ename "姓 名" from emp
2)to_char/to_date(日期,'YYYY"年"MM"月"DD"日" HH24:MI:SS')‘’号中的英文字符大小写不敏感


2.统计不重复的部门

select count(distinct deptno) from emp;

3.除10号部门外,查询部门平均工资大于2000元的部门

select deptno,avg(sal) 
       from emp where deptno <> 10
       group by deptno;

select deptno,avg(sal)
       from emp group by deptno
       having deptno <> 10;


那么问题来了,having和where的区别是什么?

where和having的区别:
where:
1)行过滤器
2)针对原始的记录
3)跟在from后面
4)where可省
5)先执行
having:
1)组过滤器
2)针对分组后的记录
3)跟在group by后面
4)having可省
5)后执行


group by的使用场景又是什么?

1)在select子句中出现的非多行函数的所有列,【必须】出现在group by子句中
2)在group by子句中出现的所有列,【可出现可不现】在select子句中


3.使用外连接,按部门10,20,30,40号,统计各部门员工人数,要求显示部门号,部门名,人数

-- 左外连接
select d.deptno "部门号", count(e.empno) "人数"
       from dept d,emp e
       where d.deptno = e.deptno(+)
       group by d.deptno,d.dname;

【Oracle】Oracle练习_第2张图片

-- 右外连接
select d.deptno "部门号",count(e.empno) "人数"
   from dept d,emp e
   where d.deptno(+) = e.deptno
   group by d.deptno,d.dname;

【Oracle】Oracle练习_第3张图片


关于连接查询,可以参考http://blog.csdn.net/evan_qb/article/details/75208518


4.关于Oracle分页,显示emp表中5-9条记录

select yy.*
from (select rownum ids,emp.* from emp where rownum<=9) yy
where ids>=5;

5.有【1000亿】条会员记录,如何用最高效的方式将薪水字段清零,其它字段内容不变?

第一:从emp表中删除sal字段
      alter table emp drop column sal;      

第二:向emp表中添加sal字段,且内容默认0
      alter table emp add sal number(6) default 0;


6.笔试题3:有一个员工表empinfo结构如下
      create table empinfo(
fempno varchar2(10) primary key,
fempname varchar2(20) not null, 
        fage number(2) not null, 
        fsalary number(10,2) not null
      );
      假如该表有大约1000万条记录,写一句最高效的SQL语句,计算以下4种人中每种员工的数量 
      第1种人:fsalary>9999 and fage>35
      第2种人:fsalary>9999 and fage<35
      第3种人:fsalary<9999 and fage>35
      第4种人:fsalary<9999 and fage<35
     
提示:只用一条SQL搞定

select 
   sum(case when e.fsalary>9999 and e.fage>35 then 1 else 0 end) "第1种人",
   sum(case when e.fsalary>9999 and e.fage<35 then 1 else 0 end) "第2种人",
   sum(case when e.fsalary<9999 and e.fage>35 then 1 else 0 end) "第3种人",
   sum(case when e.fsalary<9999 and e.fage<35 then 1 else 0 end) "第4种人"
from empinfo e;

7.复制表格

-- 复制scott.emp表中的结构
create table emp as select * from scott.emp;








你可能感兴趣的:(------,Oracle,③数据库)