oracle 学习 简单查询、条件查询、单行函数、课后练习答案

oracle 学习笔记


–简单查询


select * from emp;
select empno,ename,job,deptno from emp;
–1.员工转正后,月薪上调20%,请查询出所有员
–工转正后的月薪。
select ename,sal*1.2
from emp;
/*2.员工试用期6个月,转正后月薪上调20%,请查
询出所有员工工作第一年的年薪所得(不考虑奖
分 金部分,年薪的试用期6个月的月薪+转正后6个月
的月薪)*/
select
ename “员工”,sal “月薪”,sal*(1+1.2)*6 “年薪”
from emp;
/*
1.员工试用期6个月,转正后月薪上调20%,请查
询出所有员工工作第一年的所有收入(需考虑奖
金部分),要求显示列标题为员工姓名,工资收
入,奖金收入,总收入。
*/
select
ename “员工”,
sal “月薪”,
comm “奖金”,
– 任何包含空值的算术表达式运算后的结果都为空值NULL。
sal*(1+1.2)*6+nvl(comm,0) “总收入”
from emp;
–消除重复行 distinct
select distinct deptno from emp;
/*
1.员工试用期6个月,转正后月薪上调20%,请查
询出所有员工工作第一年的所有收入(需考虑奖
金部分),要求显示格式为:XXX的第一年总收入
为XXX。
*/
select
ename||’第一年总收入为’||(sal*(1+1.2)*6+nvl(comm,0))
as “年收入”
from emp;
–查询员工表中一共有哪几种岗位类型。
select distinct job from emp;


—–条件查询
—–使用where子句,比较不同类型数据 : 数值型、字符型、日期型


–比较数值型数据
1.查询部门编号为10的所有员工信息
select * from emp where deptno=10;

2.查询所有不在部门10的员工信息
select * from emp where deptno<>10;

–比较字符型数据 1. 比较值必须用”单引号括起来; 2. 区分大小写
1.查询职位为’CLERK’的所有员工的信息
select * from emp where job = ‘CLERK’;

–比较日期型 1. 单引号引起来 2. DD-MON-RR 日-月份-年份
1.查询所以在1981年之后入职的员工信息(1981-12-31)
select * from emp where hiredate > ‘31-12月-81’;


—— 特殊比较运算符 : between…and… in like is null


–使用BETWEEN .. AND.. 运算符来判断要比较的值是否在某个范围内。
1.查询薪水在1100到2000之间的所有员工信息
select * from emp where sal between 1100 and 2000; – 包括边界值
select * from emp where sal >= 1100 and sal <= 2000; –同上

2.查询入职日期在1981年之后,1987年之前入职的员工信息
select * from emp where hiredate between ‘31-12月-81’ and ‘1-1月-87’;
select * from emp where hiredate >= ‘31-12月-81’ and hiredate <= ‘1-1月-87’; – 同上

–IN运算符 : 判断要比较的值是否和集合列表中的任何一个值相等。
1. 查询部门编号为10 或者 20 的所有员工信息
select * from emp where deptno in(10,20);
select * from emp where deptno =10 or deptno=20;–同上

–IS NULL运算符 判断是否为空值(注意:不是空格” 不是0)
1.查询所有没有奖金的员工信息
select * from emp where comm is null; – 正确
select * from emp where comm = null;–错误 null值不能与任意值做计算,均会返回null

–LIKE运算符 %代表任意个数的字符 _代表任意一个字符

1.查询所有名字以’S’字母开头的员工信息
select * from emp where ename like ‘S%’; –匹配所有S字母开头的名字

2.查询所有名字以’S’字母结尾的员工信息
select * from emp where ename like ‘%S’; –匹配所有S字母结尾的名字

3.查询所有名字包含’S’字母的员工信息
select * from emp where ename like ‘%S%’;–匹配包含S字母的名字

4.查询所有名字中第二个字母为’A’的员工信息
select * from emp where ename like ‘_A%’;–匹配的第二个字母为A的名字

5.查询所有职位中以’SALE_’开头的员工信息
select * from emp where job like ‘SALE@_%’ escape ‘@’;–使用’@’符号与’escape’做特殊符号的查询


– 逻辑运算符: and or not
–运算符优先级: not > and > or


–逻辑与(and):所有判断条件必须都满足
1.查询薪水大于1100,并且职位为CLERK的员工姓名、编号、薪水、职位信息
select ename,empno,sal,job from emp where sal>1100 and job=’CLERK’;

–逻辑或(or):只要任意条件满足,就算匹配
1.查询薪水大于1100,或职位为CLERK的员工姓名、编号、薪水、职位信息
select ename,empno,sal,job from emp where sal > 1100 or job=’CLERK’;

–逻辑非(not):取相反的结果,NOT运算符还可以和BETWEEN…AND、LIKE、IS NULL一起使用

–not in
1.查询部门编号不在 10 或者 20 的所有员工信息
select * from emp where deptno not in(10,20);

–not between ..and..
2.查询薪水不在1100到2000范围以内的员工信息
select * from emp where sal not between 1100 and 2000;

–not like
3.查询职位信息中不包含’SALES’的员工信息
select * from emp where job not like ‘%SALES%’;

–is not null
4.查询奖金信息不为空的员工信息
select * from emp where comm is not null;

课后练习
–1.查询职位为SALESMAN的员工编号、职位、入职日期。
select
empno,job,hiredate
from emp
where job=’SALESMAN’;
–2.查询1985年12月31日之前入职的员工姓名及入职日期。
select
ename,hiredate
from emp
where hiredate<’31-12月-85’;

–3.查询部门编号不在10部门的员工姓名、部门编号。
select
ename,deptno
from emp
where deptno not in(10);
–1.查询入职日期在82年至85年的员工姓名,入职日期。
select
ename,hiredate
from emp
where hiredate between ‘01-1月-82’ and ‘31-12月-85’;–DD-MON-RR
–2.查询月薪在3000到5000的员工姓名,月薪。
select
ename,sal
from emp
where sal between 3000 and 5000;
–3.查询部门编号为10或者20的员工姓名,部门编号。
select ename,deptno from emp where deptno in (10,20);
–4.查询经理编号为7902, 7566, 7788的员工姓名,经理编号。
select ename,mgr from emp where mgr in (7902,7566,7788);
–查询员工姓名以W开头的员工姓名。
select * from emp where ename like ‘W%’;
–2.查询员工姓名倒数第2个字符为T的员工姓名。
select * from emp where ename like ‘%T_’;
–您可以使用ESCAPE标识符实现对 % 和 _ 的查找。
–例:查询 JOB 以“MAN_”开头的雇员信息
select * from emp where job like ‘MAN@_%’ escape ‘@’;
–3.查询奖金为空的员工姓名,奖金
select * from emp where comm is null;
–1.查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的
–员工姓名、职位、工资
select * from emp where (sal>1500 and job=’MANAGER’) or job=’SALESMAN’;
–2.查询工资超过2000并且职位是 MANAGER或SALESMAN的员工姓名
–、职位、工资。
select * from emp where sal>1500 and (job=’MANAGER’ or job=’SALESMAN’);
—3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名
–、部门、工资。
select * from emp where deptno in (10,20) and (sal between 3000 and 5000);
–4.查询入职日期在81年,且职位不是SALES开头的员工姓名、 并
–入职日期、职位。
select * from emp where hiredate between ‘01-1月-81’ and ‘31-12月-81’ and job not like ‘SALES%’;
–5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名
–包含A的员工姓名、职位、部门编号
select * from emp where job in (‘SALESMAN’,’MANAGER’) and deptno in (10,20) and ename like ‘%A%’;


—–order by


–按列名排序
select * from emp;–默认根据第一列升序排序

–按列名排序:日期类型
select * from emp order by hiredate; – 默认升序排序,asc可省略
select * from emp order by hiredate asc; –同上
select * from emp order by hiredate desc;–降序排序

–按列名排序:数值类型
select * from emp order by sal asc;
select * from emp order by sal desc;–降序排序

–按列名排序:字符类型
select * from emp order by ename asc;
select * from emp order by ename desc;–降序排序

–按列别名排序
select empno,ename,hiredate,sal,(sal*12) totalSal from emp order by totalSal;

–多列参与排序,每列之间”,”逗号隔开
1.查询员工信息,并且根据部门、薪水升序排序
select * from emp order by deptno,sal asc;–deptno与sal均升序排序
select * from emp order by deptno asc ,sal desc;–deptno升序,sal降序

–按结果集列序号排序
select * from emp;
select * from emp order by 2;–根据结果集第二列排序
select * from emp order by 3,2;–根据结果集第三列、第二列进行排序
select * from emp order by 9;–指定的序号,必须是select子句中列表个数范围,比如:当前仅有8列数据,取值范围1-8之间

练习:
1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
select * from emp where deptno in (10,20) order by sal asc;

2.查询工资在2000-3000之间,部门不在10号的
员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
select * from emp where sal between 2000 and 3000 and deptno<>10 order by deptno,sal asc;

3.查询入职日期在82年至83年之间,职位以
SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序排序。
select * from emp where hiredate between ‘01-1月-81’ and ‘31-12月-83’
and (job like ‘SALES%’ or job like ‘MAN%’)
order by hiredate desc;

1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的
员工姓名、入职时间、职位。
select * from emp where hiredate>’09-7月-82’ and job<>’SALESMAN’;

2.查询员工姓名的第三个字母是a的员工姓名。
select ename from emp where ename like ‘__A%’;

3.查询除了10、20号部门以外的员工姓名、部门编号。
select * from emp where deptno not in (10,20);

4.查询部门号为30号员工的信息,先按工资降序排序,再按姓
名升序排序。
select * from emp where deptno=30 order by sal desc,ename asc;

5.查询没有上级的员工(经理号为空)的员工姓名。
select * from emp where mgr is null;

6.查询工资大于等于4500并且部门为10或者20的员工的姓名\工
资、部门编号。
select * from emp where sal>=4500 and deptno in (10,20);


–单行函数特征
– 单行函数对单行操作
– 每行返回一个结果
– 有可能返回值与原参数数据类型不一致
– 单行函数可以写在SELECT、WHERE、ORDER BY子句中
– 有些函数没有参数,有些函数包括一个或多个参数
– 函数可以嵌套


字符函数(11种): lower upper initcap length concat instr substr lpad rpad trim replace
数值函数: round trunc mod
日期函数: sysdate months_between add_months extract(month from sysdate) round(sysdate[,fmt]) trunc(sysdate[,fmt])
类型转换: to_char to_date to_number
通用函数: nvl nvl2 nullif case decode


–字符函数
–大小写转换函数
–LOWER(列名|表达式):将大写或大小写混合的字符转换成小写
–UPPER(列名|表达式) :将小写或大小写混合的字符转换成大写
–INITCAP(列名表达式) :将每个单词的第一个字母转换成大写,
–其余的字母都转换成小写


–lower() 将所有字母转小写
select lower(‘SQL Course’) from dual; –sql course dual伪表,仅存在一行一列

–upper() 将所有字母转大写
select upper(‘SQL Course’) from dual; –SQL COURSE

–initcap() 首字母转大写
select initcap(‘sql course’) from dual; –Sql Course


–字符处理函数

– CONCAT(column1|expression1,column2|expression2)
• 连接两个值 ,等同于||
select ename || ‘的职位是’ || job from emp; –SMITH的职位是CLERK
select concat(ename,’的职位是’,job) from emp;–错误,只能带两个参数
select concat(concat(ename,’的职位是’),job) from emp;–concat函数嵌套使用

– SUBSTR (column|expression,n1[,n2])
• 一,n1,n2。 返回第一个参数中n1从第n2位开始,长度为n2的子串
– 如果n2省略,取第n1位开始的所有字符。
– 如果n1是负值,表示从第一个参数的后面第abs(n1)位开始
向右取长度为n2的子串。
select substr(‘SQL Course’,5) from dual;–Course 包括开始位置,从开始位置截取
select substr(‘SQL Course’,5,4) from dual; –Cour
select substr(‘SQL Course’,-2) from dual; –se

– LENGTH(column | expression)
• 取字符长度
select ‘SQL Course’,length(‘SQL Course’) from dual;–10
select ename,length(ename) from emp;

–INSTR(s1,s2,[,n1],[n2])
• 返回s1中,子串s2从n1开始,第n2次出现的位置。n1,n2默认值
为1
select instr(‘sql course’,’q’) from dual; –2
select instr(‘sql course’,’s’,3) from dual;–9 从索引位置为3的地方开始搜索字符’s’
select instr(‘sql courses’,’s’,3,2) from dual;–11 从索引位置为3的地方开始搜索字符’s’,查找第2次出现的位置

– LPAD(s1,n1,s2)
• 返回s1被s2从左面填充到n1长度后的字符串。
select ‘V’ || lpad(empno,10,0) from emp;– V0000007369
select concat(‘V’,lpad(empno,10,0)) from emp; –V0000007369

– RPAD(s1,n1,s2)
• 返回s1被s2从右面填充到n1长度后的字符串。
select job,length(job),rpad(job,10,’‘) from emp;–CLERK****

– TRIM:去除字符串头部或尾部(头尾)的字符
格式:TRIM(leading | trailing | both trim_character From
m trim_source)
select trim(’ sql course ‘) from dual;–默认去前后空格
select trim(leading ‘I’ from ‘Isql courseI’) from dual; –sql courseI 去除头部的‘I’字符
select trim(trailing ‘I’ from ‘Isql courseI’) from dual; –Isql course 去除尾部的‘I’字符
select trim(both ‘I’ from ‘Isql courseI’) from dual; –sql course 去除首尾部的‘I’字符

– REPLACE(s1,s2,s3)
• 把s1中的s2用s3替换。
select replace(’ Sql Cource ‘,’ ‘,”) from dual; –SqlCource
select replace(‘sql Cource’,’s’,’S’) from dual; –Sql Cource


练习:
/*1.写一个查询,用首字母大写,其它字母小写显示雇员的 ename,显
示名字的长度,并给每列一个适当的标签,条件是满足所有雇员名字
的开始字母是J、A 或 M 的雇员,并对查询结果按雇员的ename升序
排序。(提示:使用initcap、length、substr)*/
select initcap(ename) “姓名”,length(ename) “长度”
from emp
where substr(ename,1,1) in (‘J’,’A’,’M’)
order by ename asc;

1.查询员工姓名中中包含大写或小写字母A的员工姓名。
select ename from emp where instr(ename,’A’)>0 or instr(ename,’a’)>0;

2.查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中
包含大写字母A的员工姓名,员工姓名长度(提示,要求使用INSTR函
数,不能使用like进行判断)
select ename,length(ename) from emp where deptno in (10,20) and hiredate>’01-5月-81’
and instr(ename,’A’)>0;

3.查询每个职工的编号,姓名,工资
一一 要求将查询到的数据按照 定的格式合并成一个字符串.
前10位:编号,不足部分用*填充,左对齐
中间10位:姓名,不足部分用*填充,左对齐
充 – 后10位:工资,不足部分用*填充,右对齐
select lpad(empno,10,’‘)||lpad(ename,10,’‘)||rpad(sal,10,’*’) from emp;


–数值函数

–ROUND:将列或表达式所表示的数值四舍五入到小数点后的第n位。
–格式: ROUND(column| expression, n)
select round(45.926),round(45.926,2) from dual; –46 45.93
select round(45.926,-1),round(455.926,-2) from dual; –50 500
select round(44.926,-1),round(445.926,-2) from dual; –40 400

–TRUNC:将列或表达式所表示的数值截取到小数点后的第n位。
–格式:TRUNC(column| expression, n)
select trunc(45.926),trunc(45.926,2) from dual; –45 45.92
select trunc(45.926,-1),trunc(455.926,-2) from dual; –40 400
select trunc(44.926,-1),trunc(445.926,-2) from dual; –40 400

–MOD:取m除以n后得到的余数
–格式:MOD(m,n)
select mod(10,3) from dual;–1


练习:
1.写一个查询,分别计算100.456 四舍五入到小
数点后第2位,第1位,整数位的值。
select round(100.456,2),round(100.456,1),round(100.456,0) from dual;

2.写一个查询,分别计算100.456 从小数点后第
2位,第1位,整数位截断的值。
select trunc(100.456,2),trunc(100.456,1),trunc(100.456,0) from dual;


–日期处理
–默认的日期形式是: DD-MON-RR
–日期类型可以加减数字,功能是在该日期上加减对应的天
–’0-G-’’5-G-’ 数。如: 10 AUG 06 +15结果是 25 AUG 06
–– 日期类型之间可以进行减操作,功能是计算两个日期之间
–0 G ’ 4 G 间隔了多少天。如:’10-AUG-06’-‘4-AUG-06’结果四
–舍五入后是6天
–如果需要对一个日期进行加减相应小时操作,可以使用
–n/24来实现


常用日期函数
– SYSDATE:返回系统日期
– MONTHS_BETWEEN:返回两个日期类型数据之间间隔的自然月数
– D ADD_MONTHS:返回指定日期加上相应的月数后的日期
– NEXT_DAY:返回某一日期的下一个指定日期
– LAST_DAY:返回指定日期当月最后一天的日期
– ROUND(date[,‘fmt’])将date按照fmt指定的格式进行四舍五入,
fmt为可选项,如果没有指定fmt,则默认为DD,将date四舍五入为最
近的天。
格式码:世纪CC,年YY,月MM,日DD,小时HH24,分MI,秒SS
– TRUNC( date[,‘fmt’] )将date按照fmt指定的格式进行截断,fmt为
可选项,如果没有指定fmt,则默认为‘DD’,将date截取为最近的
天。
– EXTRACT:返回日期类型数据中的年份 月份或者日


–MONTHS_BETWEEN:返回两个日期类型数据之间间隔的自然月数
SELECT ename, sal,MONTHS_BETWEEN(SYSDATE,hiredate) months
FROM emp
ORDER BY months;

–ADD_MONTHS:返回指定日期加上相应的月数后的日期
SELECT ename, sal, hiredate, ADD_MONTHS(hiredate,3)
FROM emp
WHERE hiredate>’01-1月 -82’;

– NEXT_DAY:返回某一日期的下一个指定日期
–NEXT_DAY 函数演示——返回在02-2月-06之后的下一个周 是什么日期。
SELECT NEXT_DAY(‘02-2月-06’,’星期一(或者是其他的星期几’) NEXT_DAY
FROM DUAL;

–LAST_DAY:返回指定日期当月最后一天的日期
SELECT LAST_DAY(‘02-2月-06’) “LAST DAY”
FROM DUAL;

–ROUND函数演示——查询81年入职的员工姓名,入职日
–期按月四舍五入的日期。
select ename,
hiredate,
round(hiredate),
round(hiredate, ‘year’), –年份按1-6月和7-12月四舍五入到最近的 几几年1月1日
round(hiredate, ‘month’),–月份按1-15日和16-30日四舍五入到最近的 几月1日
round(hiredate, ‘day’) –天数按周一-周三和周四到周日四舍五入到最近的 周日
from emp
where substr(hiredate, -2, 2) = ‘81’; –1980/12/17 17-12月-80

–TRUNC 函数演示——查询81年入职的员工姓名,入职日
–期按月截断的日期。
SELECT empno, hiredate, TRUNC(hiredate, ‘MONTH’)
FROM emp
WHERE SUBSTR(hiredate,-2,2)=’81’;

–- EXTRACT:返回日期类型数据中的年份、月份或者日。
EXTRACT ([YEAR] [MONTH][DAY]
FROM [日期类型表达式])
select extract(year from sysdate) 年,
extract(month from sysdate) 月,
extract(day from sysdate) 日
from dual;


练习:
• 1.查询每个员工截止到现在一共入职多少天?
select ename,round(TO_DATE(‘01-1月-00’)-hiredate) days from emp;

• D-N-1- 2.当前日期为2015年,指定日期格式为DD MON RR,指定日期为01-1
月-01,该日期实际所代表的日期为?
2001
• 3.当前日期为2015年,指定日期格式为DD-MON-RR,指定日期为01-1月-95,
该日期实际所代表的日期为?
1995
• 4.当前日期为1998年,指定日期格式为DD-MON-RR,指定日期为01-1
月-01,该日期实际所代表的日期为?
2001
• 5.当前日期为1998年,指定日期格式为DD-MON-RR,指定日期为01-1
月-95,该日期实际所代表的日期为?
1995
• 6.当前日期为2015年,指定日期格式为DD-MON-YY,指定日期为01-1
月-01,该日期实际所代表的日期为?
2001
• 7.当前日期为1998年,指定日期格式为DD-MON-YY,指定日期为01-1
月-95,该日期实际所代表的日期为?
1995


• 1.查询服务器当前时间
SELECT SYSDATE FROM DUAL;
• 2.查询部门10,20的员工截止到2000年1月1日,工作了多
少个月,入职的月份。(提示:使用
months_between,extract)
SELECT ename,hiredate,ROUND(MONTHS_BETWEEN(‘01-1月-00’,hiredate)) mon,
EXTRACT(MONTH FROM hiredate) hire_month FROM emp
WHERE deptno in (10,20);

• 3.如果员工试用期6个月,查询职位不是MANAGER的员工姓
名,入职日期,转正日期,入职日期后的第一个星期一,
入职当月的最后一天日期。(提示:使用
add_months,next_day,last_day)
SELECT ename,hiredate,ADD_MONTHS(hiredate,6),
NEXT_DAY(hiredate,’星期一’),LAST_DAY(hiredate)
FROM emp
WHERE job<>’MANAGER’;


显式数据类型转换
通常是在字符类型、日期类型、数值类型之间进行显式转
换。主要有3个显式转换函数:
• TO_CHAR
• TO_NUMBER
• TO_DATE


–to_char 用于日期类型
select to_char(sysdate) from dual; –25-7月 -18 默认DD-MON-RR格式
select to_char(sysdate,’YYYY”年”MM”月”DD”日” hh24:mi:ss’) from dual;–错误 日期格式无法识别,需要给每个中文字符加上”“双引号 2018年07月25日 11:01:56
select to_char(sysdate,’YYYY-MM-DD hh24:mi:ss’) from dual;–2018-07-25 11:02:03
select to_char(sysdate,’YYYY/MM/DD hh24:mi:ss’) from dual;–2018/07/25 11:02:03

select
to_char(sysdate,’YEAR’), –TWENTY EIGHTEEN
to_char(sysdate,’MONTH’), –7月
to_char(sysdate,’DAY’), –星期三
to_char(sysdate,’DY’), –星期三
to_char(sysdate,’AM’), –上午
to_char(sysdate,’YYYY/MM/DD hh12:mi:ss am day’)
from dual;

–to_char 用于数值类型
–注意:进行数字类型到字符型转换时,格式中的宽度一定要超过实际列宽度,否则会显示为###
select to_char(123345789.123) from dual;–123345789.123
select to_char(123345789.126,’ 999 , 999 , 999.99 ) f r o m d u a l ; 123,345,789.13
select to_char(123345789.126,’L999,999,999.99’) from dual;–¥123,345,789.13
select to_char(123345789.126,’L999,999,999,999,999.99’) from dual;
select to_char(123.456,’L0999,999,999.99’) from dual;

–to_number 将字符串转换为数值
select ‘123.456’+100 from dual; –223.456 隐式转换,将字符串默认转换为数值计算
select to_number(‘123.456’)+100 from dual; –223.456 显示转换

select ‘123.456a’+100 from dual; – 错误 无效数字,不能包含非数字字符
select to_number(‘123.456a’)+100 from dual; – 错误 无效数字,不能包含非数字字符

–to_date 将字符串转换为日期
select to_date(‘2018-07-25’) from dual; –错误 文字与格式字符串不匹配
select to_date(‘25-7月-18’) from dual; –只带一个参数,格式必须为DD-MON-RR格式
select to_date(‘2018-07-25’,’YYYY-MM-DD’) from dual;
select to_date(‘2018/07/25’,’YYYY/MM/DD’) from dual;
select to_date(‘2018年07月25日’,’YYYY”年”MM”月”DD”日”’) from dual;– 错误 日期格式不能识别,需要给每个中文字符加上”“双引号

SELECT SYSDATE,TO_CHAR(SYSDATE,’YYYY-MONTH-DD DAY HH:MM:SS’) FROM DUAL;–YY-MM-DD HH:MM:SS


—–通用函数


–nvl(参数一,参数二) 如果参数一为null,取参数二的值,否则,取参数一本身的值
select ename,comm,nvl(comm,0) from emp;

–nvl2(参数一,参数二,参数三) 如果参数一位null,取参数三的值,否则,取参数二的值
select nvl2(null,’男’,’女’) from dual;–’女’
select nvl2(‘M’,’男’,’女’) from dual; – ‘男’

–nullif(参数一,参数二) 如果参数一等于参数二,返回null,否则,返回第一个参数的值
select nullif(10,10) from dual;–null
select nullif(10,20) from dual;–10

–coalesce(参数一,参数二,[参数三…..]) 返回第一个不为null的参数值
select ename,comm,coalesce(comm,null,null,’为null’) from emp;–错误 数据类型不一致
select ename,comm,coalesce(comm,null,null,0) from emp;

–case..when..then..else..end
select ename,job,sal,deptno,
case deptno
when 10 then ‘软件开发事业部’
when 20 then ‘测试部’
when 30 then ‘实施部’
else ‘外卖部’
end
from emp;

–decode
select ename,job,sal,deptno,decode(deptno,10,’软件开发事业部’,20,’测试部’,30,’实施部’,’外卖部’) from emp;
select decode(sex,’M’,’男’,’F’,’女’,’不详’) from [某表];

练习:
1.显示服务器系统当前时间,格式为2007-10-12 17:11:11(提示:使用to_char函数)
SELECT TO_CHAR(SYSDATE,’YYYY-MONTH-DD HH:mi:ss’) FROM DUAL;

2.显示ename、hiredate 和 雇员开始工作日是星期几,列标签DAY(提示:使用to_char函数)
SELECT ename,TO_CHAR(hiredate,’YYYY”年”MONTH”月”DD”日” DAY’) FROM emp;
3.查询员工姓名,工资,格式化的工资(¥999,999.99) (提示:使用to_char函数)
SELECT ename,sal,TO_CHAR(sal,’L999,999.99’) FROM emp;
4.把字符串2015-3月-18 13:13:13 转换成日期格式,并计算和系统当前时间间隔多少天。 (提示:使用to_date函数)
SELECT SYSDATE-TO_DATE(‘2015-03-18 13:13:13’,’YYYY-MM-DD HH24:mi:SS’) FROM DUAL;

在员工表中查询出员工的工资,并计算应交税款:如果工
0 资小于1000,税率为0,如果工资大于等于1000并小于2000,
税率为10%,如果工资大于等于2000并小于3000,税率为
15%,如果工资大于等于3000,税率为20%。
SELECT sal,CASE TRUNC(sal/1000,0)
WHEN 0 THEN 0
WHEN 1 THEN sal*0.1
WHEN 2 THEN sal*0.15
ELSE sal*0.2
END “应交税费”
FROM emp;
select SUBSTR(ename,3,1) from emp;
SELECT ename FROM emp WHERE NULLIF(SUBSTR(ename,3,1),’A’) IS NULL;

猜你喜欢

转载自blog.csdn.net/qq_34693104/article/details/81254997
今日推荐