一个菜鸟的oracle之路--------二(续)
一个菜鸟的oracle之路--------二(续)
案例16 哪些员工的奖金不是400,500,1000,也不为空。
[sql]
select ename,bonus from emp_xxx
where bonus not in(400,1000) or bonus is null;
//用not in 进行比较时,集合中不能包含null値,若包含
//则会出现no rows selected
//显示每个员工的最后两个字符。
[sql]
select substr(ename,2,2)from emp_xxx;
alter session set nls_date_format=
'yyyy_mm_dd hh24:mi:ss';
案例17. case语句
根据员工的职位,计算加薪后的数据。
如果职位是Analist,加薪10%
如果职位是Programmer 加薪5%
如果职位是clerk,加薪2%
其他职位 薪水不变
[sql]
select ename,job,
case job when 'Analyst' then salary*1.1
when 'Programmer' then salary*1.05
when 'clerk' then salary*1.02
else salary
end new_salary from emp_xxx;
select ename,salary,
case salary when <5000 then salary*1.2
else salary
end new_salary
from emp_xxx;
//此处有问题。
[sql]
select ename,salary,
case salary when 10000 then salary*9
else salary
end new_salary
from emp_xxx;
案例18 decode函数
decode()函数是oracle中等价于case when语句的函数。
作用同case相同
decode 函数语法如下。
要求和case语句相同
[sql]
select ename,decode(job, 'Analyst',salary*1.1,
'Programmer',salary*1.05,
'clerk',salary*1.02,
salary) new_salary from emp_xxx;
案例19 函数的嵌套
薪水由低到高排序
[sql]
select ename,salary from emp_xxx order by salary ;
也可以这么写:
select ename,salary from emp_xxx order by salary asc ;
案例20 薪水由高到低排序
[sql]
select ename,nvl(salary,100000) from emp_xxx order by salary desc;
案例21 按照入职时间排序,入职时间越早排在前面
[sql]
select ename,hiredate from emp_xxx order by hiredate;
案例22 按照部门排序,同一个部门按薪水由高到低排序
[sql]
select ename,deptno,salary from emp_xxx order by deptno,salary desc;
案例23 员工表中有多少条记录
[sql]
select count(*) from emp_xxx;
数据字典 user_tables
案例24 当前用户下有多少张表
[sql]
select count(*) from user_tables;
案例25 openlab账户下有多少包含emp的表
[sql]
select count(*) from user_tables where table_name like '%emp%';
案例26 入职时间不是null的数据总数
[sql]
select count(hiredate) from emp_xxx;
sqlplus 命令
查看当前用户账户 show user
组函数 count() arv() sum() max() min()
与单行函数round(),to_date() to_char() coalesce()等不同,单行函数
是每行函数返回一个结果,组函数是多行数据返回一个结果
案例27 计算员工的薪水总和是多少
[sql]
select sum(salary) from emp_xxx;
案例28 计算员工的薪水平均值是多少
[sql]
select avg(salary) from emp_xxx;
//注意,薪水为null的情况下不参与平均薪値的计算
计算员工的人数综合,薪水总和,平均薪水是多少
[sql]
select count(*) num ,sum(salary) sum,avg(salary) avg from emp_xxx;
//薪水平均值=薪水总和/人数总和,avg(salary)=sum(salary)/count(*)
//avg(salary)只按有薪水的员工人数计算平均值,这样得到的数据不够准确
案例29 计算员工的最高薪水和最低薪水
[sql]
select max(salary) 高薪,min(salary) 最低薪 from emp_xxx;
案例30 计算员工最早和最晚入职时间
[sql]
select max(hiredate) max_hiredate,min(hiredate) min_hiredate from emp_xxx;
//此处课件上有错误,max是计算入职时间最晚的,min使计算最早的
分组查询 group by **
案例31 按部门计算每个部门的最高和最低薪水是多少
[sql]
select deptno,max(salary),min(salary) from emp_xxx group by deptno;
案例32 计算每个部门的薪水总和和平均薪水
[sql]