zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Oracle数据库:条件表达式case when then else end,decode函数,oracle单行函数练习示例

Oracle数据库 函数 示例 练习 条件 表达式 when
2023-09-11 14:15:38 时间

Oracle数据库:条件表达式case when then else end,decode函数,oracle单行函数练习示例

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开
测开的话,你就得学数据库,sql,oracle,尤其sql要学,当然,像很多金融企业、安全机构啥的,他们必须要用oracle数据库
这oracle比sql安全,强大多了,所以你需要学习,最重要的,你要是考网络警察公务员,这玩意你不会就别去报名了,耽误时间!

oracle系列文章:
【1】Oracle数据库:啥是oracle数据库?你为啥要学oracle?
【2】Oracle数据库:oracle 11g安装教程,已安装好的oracle各个文件夹的作用,oracle用户权限怎么样
【3】Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
【4】Oracle数据库:创建表空间,创建新用户,给用户分配对象、角色和系统权限,登录新用户建表
【5】Oracle数据库:链接配置,包括sqlnet.ora里面的transnames.ora配置数据库标识符SID,listener暂时简单了解
【6】Oracle数据库:net configureation assistant工具配置监听listener,配置本地网络访问服务器上的数据库
【7】Oracle数据库:oracle字符类型、数字类型、创建表表名的命名规则
【8】Oracle数据库:约束条件:主键约束、唯一约束、检查约束、非空约束、外键约束、默认值填写
【9】Oracle数据库:表的关系:一对多,一对一,多对多,一一继承和修改的关系,表不是重点,重点是数据和约束关系
【10】Oracle数据库:sql语言结构,数据查询语言DQL,select * from table;算术,别名,连接,去重等操作
【11】Oracle数据库:约束行限制where语句,判断条件,比较条件,字符串日期格式,in,like,escape,null语句
【12】Oracle数据库:逻辑运算and,or,not和各种运算的优先级控制
【13】Oracle数据库:排序order by语句,select from where order by的执行先后顺序,各种样例
【14】Oracle数据库:oracle函数,单行函数,多行函数,upper,lower,initcap,字符串函数
【15】Oracle数据库:数字函数,日期函数,round,trunc,mod,months_between,add_months,next_day,last_day,sysdate
【16】Oracle数据库:oracle数据类型转换to_char()日期和数字转字符,to_number()字符转数字,to_date()字符转日期函数
【17】Oracle数据库:oracle函数嵌套,nvl函数,nvl2函数,nullif函数,coalesce合并函数


oracle条件表达式

在这里插入图片描述
能力相同
写法不同而已

CASE 表达式

在这里插入图片描述
switch(a)
case 1,2,3
xxxxx
default
yyyyy

类似
case xxx
when aaa then return1
else return2
end
类似的思路

在这里插入图片描述
在这里插入图片描述

SQL> select last_name,job_id,salary, CASE job_id WHEN 'IT_PROG' THEN salary*(1+10/100) WHEN 'ST_CLERK' THEN salary*(1+15/100) WHEN 'SA_REP' THEN salary*(1+20/100) ELSE salary END as saladd from employees;

LAST_NAME                 JOB_ID         SALARY     SALADD
------------------------- ---------- ---------- ----------
King                      AD_PRES      24000.00      24000
Kochhar                   AD_VP        17000.00      17000
De Haan                   AD_VP        17000.00      17000
Hunold                    IT_PROG       9000.00       9900
Ernst                     IT_PROG       6000.00       6600
Austin                    IT_PROG       4800.00       5280
Pataballa                 IT_PROG       4800.00       5280
Lorentz                   IT_PROG       4200.00       4620
Greenberg                 FI_MGR       12008.00      12008
Faviet                    FI_ACCOUNT    9000.00       9000
Chen                      FI_ACCOUNT    8200.00       8200
Sciarra                   FI_ACCOUNT    7700.00       7700
Urman                     FI_ACCOUNT    7800.00       7800
Popp                      FI_ACCOUNT    6900.00       6900
Raphaely                  PU_MAN       11000.00      11000
Khoo                      PU_CLERK      3100.00       3100
Baida                     PU_CLERK      2900.00       2900
Tobias                    PU_CLERK      2800.00       2800
Himuro                    PU_CLERK      2600.00       2600
Colmenares                PU_CLERK      2500.00       2500

LAST_NAME                 JOB_ID         SALARY     SALADD
------------------------- ---------- ---------- ----------
Weiss                     ST_MAN        8000.00       8000
Fripp                     ST_MAN        8200.00       8200
Kaufling                  ST_MAN        7900.00       7900
Vollman                   ST_MAN        6500.00       6500
Mourgos                   ST_MAN        5800.00       5800
Nayer                     ST_CLERK      3200.00       3680
Mikkilineni               ST_CLERK      2700.00       3105
Landry                    ST_CLERK      2400.00       2760
Markle                    ST_CLERK      2200.00       2530
Bissot                    ST_CLERK      3300.00       3795
Atkinson                  ST_CLERK      2800.00       3220
Marlow                    ST_CLERK      2500.00       2875
Olson                     ST_CLERK      2100.00       2415
Mallin                    ST_CLERK      3300.00       3795
Rogers                    ST_CLERK      2900.00       3335
Gee                       ST_CLERK      2400.00       2760
Philtanker                ST_CLERK      2200.00       2530
Ladwig                    ST_CLERK      3600.00       4140
Stiles                    ST_CLERK      3200.00       3680
Seo                       ST_CLERK      2700.00       3105
Patel                     ST_CLERK      2500.00       2875

LAST_NAME                 JOB_ID         SALARY     SALADD
------------------------- ---------- ---------- ----------
Rajs                      ST_CLERK      3500.00       4025
Davies                    ST_CLERK      3100.00       3565
Matos                     ST_CLERK      2600.00       2990
Vargas                    ST_CLERK      2500.00       2875
Russell                   SA_MAN       14000.00      14000
Partners                  SA_MAN       13500.00      13500
Errazuriz                 SA_MAN       12000.00      12000
Cambrault                 SA_MAN       11000.00      11000
Zlotkey                   SA_MAN       10500.00      10500
Tucker                    SA_REP       10000.00      12000
Bernstein                 SA_REP        9500.00      11400
Hall                      SA_REP        9000.00      10800
Olsen                     SA_REP        8000.00       9600
Cambrault                 SA_REP        7500.00       9000
Tuvault                   SA_REP        7000.00       8400
King                      SA_REP       10000.00      12000
Sully                     SA_REP        9500.00      11400
McEwen                    SA_REP        9000.00      10800
Smith                     SA_REP        8000.00       9600
Doran                     SA_REP        7500.00       9000
Sewall                    SA_REP        7000.00       8400

LAST_NAME                 JOB_ID         SALARY     SALADD
------------------------- ---------- ---------- ----------
Vishney                   SA_REP       10500.00      12600
Greene                    SA_REP        9500.00      11400
Marvins                   SA_REP        7200.00       8640
Lee                       SA_REP        6800.00       8160
Ande                      SA_REP        6400.00       7680
Banda                     SA_REP        6200.00       7440
Ozer                      SA_REP       11500.00      13800
Bloom                     SA_REP       10000.00      12000
Fox                       SA_REP        9600.00      11520
Smith                     SA_REP        7400.00       8880
Bates                     SA_REP        7300.00       8760
Kumar                     SA_REP        6100.00       7320
Abel                      SA_REP       11000.00      13200
Hutton                    SA_REP        8800.00      10560
Taylor                    SA_REP        8600.00      10320
Livingston                SA_REP        8400.00      10080
Grant                     SA_REP        7000.00       8400
Johnson                   SA_REP        6200.00       7440
Taylor                    SH_CLERK      3200.00       3200
Fleaur                    SH_CLERK      3100.00       3100
Sullivan                  SH_CLERK      2500.00       2500

LAST_NAME                 JOB_ID         SALARY     SALADD
------------------------- ---------- ---------- ----------
Geoni                     SH_CLERK      2800.00       2800
Sarchand                  SH_CLERK      4200.00       4200
Bull                      SH_CLERK      4100.00       4100
Dellinger                 SH_CLERK      3400.00       3400
Cabrio                    SH_CLERK      3000.00       3000
Chung                     SH_CLERK      3800.00       3800
Dilly                     SH_CLERK      3600.00       3600
Gates                     SH_CLERK      2900.00       2900
Perkins                   SH_CLERK      2500.00       2500
Bell                      SH_CLERK      4000.00       4000
Everett                   SH_CLERK      3900.00       3900
McCain                    SH_CLERK      3200.00       3200
Jones                     SH_CLERK      2800.00       2800
Walsh                     SH_CLERK      3100.00       3100
Feeney                    SH_CLERK      3000.00       3000
OConnell                  SH_CLERK      2600.00       2600
Grant                     SH_CLERK      2600.00       2600
Whalen                    AD_ASST       4400.00       4400
Hartstein                 MK_MAN       13000.00      13000
Fay                       MK_REP        6000.00       6000
Mavris                    HR_REP        6500.00       6500

LAST_NAME                 JOB_ID         SALARY     SALADD
------------------------- ---------- ---------- ----------
Baer                      PR_REP       10000.00      10000
Higgins                   AC_MGR       12008.00      12008
Gietz                     AC_ACCOUNT    8300.00       8300

107 rows selected

逻辑好写
但是真的挺复杂的语句
骚得很,你不学的话,考试基本看不懂………………

怎么缩减呢???
简化case表达式

DECODE函数

在这里插入图片描述

还是上面那个案例,搞它

SQL> select last_name,job_id,salary, decode(job_id, 'IT_PROG', salary*1.1,'ST_CLERK',salary*1.15,'SA_REP', salary*1.2) as saladd from employees;

LAST_NAME                 JOB_ID         SALARY     SALADD
------------------------- ---------- ---------- ----------
King                      AD_PRES      24000.00 
Kochhar                   AD_VP        17000.00 
De Haan                   AD_VP        17000.00 
Hunold                    IT_PROG       9000.00       9900
Ernst                     IT_PROG       6000.00       6600
Austin                    IT_PROG       4800.00       5280
Pataballa                 IT_PROG       4800.00       5280
Lorentz                   IT_PROG       4200.00       4620
Greenberg                 FI_MGR       12008.00 
Faviet                    FI_ACCOUNT    9000.00 
Chen                      FI_ACCOUNT    8200.00 
Sciarra                   FI_ACCOUNT    7700.00 

比case简单多了操

单行函数样例

在这里插入图片描述

SQL> select sysdate as "Date" from dual;

Date
-----------
2022/10/27

在这里插入图片描述

SQL> select employee_id,last_name,salary,round(salary*1.15) as "New salary" from employees;

EMPLOYEE_ID LAST_NAME                     SALARY New salary
----------- ------------------------- ---------- ----------
        100 King                        24000.00      27600
        101 Kochhar                     17000.00      19550
        102 De Haan                     17000.00      19550

取整,round四舍五入
trunc不舍

在这里插入图片描述
jam,in条件
首字母大写,其他小写,用一个函数,叫做那啥
有一个函数
排序好说

SQL> select initcap(last_name),length(last_name) from employees where last_name like 'J%' or last_name like 'A%' or last_name like 'M%' order by last_name;

INITCAP(LAST_NAME)        LENGTH(LAST_NAME)
------------------------- -----------------
Abel                                      4
Ande                                      4
Atkinson                                  8
Austin                                    6
Johnson                                   7
Jones                                     5
Mallin                                    6
Markle                                    6
Marlow                                    6
Marvins                                   7
Matos                                     5
Mavris                                    6
Mccain                                    6
Mcewen                                    6
Mikkilineni                              11
Mourgos                                   7

16 rows selected

initcap直接首字母大写,其余小写
在这里插入图片描述
hire,月数
month_between,小数,需要四舍五入,round处理
嵌套函数了
最后还要按照这个排序

SQL> select last_name,round(months_between(sysdate,hire_date)) as month_work from employees order by round(months_between(sysdate,hire_date));

LAST_NAME                 MONTH_WORK
------------------------- ----------
Kumar                            174
Banda                            174
Ande                             175
Lee                              176

round保留几位小数,后面要用参数的
默认0
在这里插入图片描述

SQL> select last_name||' earn '||to_char(salary,'fm999,999.99')||' monthly, but wants '||to_char(3*salary,'fm999,999.00') as dream_sal from employees;

DREAM_SAL
-------------------------------------------------------------------------
King earn 24,000. monthly, but wants 72,000.00
Kochhar earn 17,000. monthly, but wants 51,000.00
De Haan earn 17,000. monthly, but wants 51,000.00

转格式,薪水转字符串打印
格式要搞清楚,反过来一样
在这里插入图片描述
格式化长度固定好像是咋搞来着

SQL> select last_name,lpad(salary, 15, '$') as sal from employees;

LAST_NAME                 SAL
------------------------- ------------------------------------------------------------
King                      $$$$$$$$$$24000
Kochhar                   $$$$$$$$$$17000
De Haan                   $$$$$$$$$$17000
Hunold                    $$$$$$$$$$$9000

左右填充
lpad
rpad

在这里插入图片描述
hire_date日期6个月之后的第一个星期一
函数嵌套
找next_day

SQL> select last_name,hire_date,salary,to_char(next_day(add_months(hire_date,6),2),'yyyy"年"mm"月"dd"日"') as review from employees;

LAST_NAME                 HIRE_DATE       SALARY REVIEW
------------------------- ----------- ---------- -----------------
King                      2003/6/17     24000.00 20031222日
Kochhar                   2005/9/21     17000.00 20060327日
De Haan                   2001/1/13     17000.00 20010716日
Hunold                    2006/1/3       9000.00 20060710

加月之后的那个月,add_months
next_day(日期,1–7)这个日期之后的第一个星期几
1代表日
to_char(日期,格式)按照指定的格式转化日期为字符串

在这里插入图片描述
不是星期日,那太难星期几
用day来转字符串就行

这里是日期转字符串的又一个应用

SQL> select last_name,hire_date,to_char(hire_date,'day') as day from employees order by to_char(hire_date,'day');

LAST_NAME                 HIRE_DATE   DAY
------------------------- ----------- ------------
Greene                    2007/3/19   星期一
Cambrault                 2007/10/15  星期一
Walsh                     2006/4/24   星期一

如果日期-1
再去d
取的是星期几的那个几
来排序

SQL> select last_name,hire_date,to_char(hire_date,'day') as day from employees order by to_char(hire_date-1,'d');

LAST_NAME                 HIRE_DATE   DAY
------------------------- ----------- ------------
Ladwig                    2003/7/14   星期一
Cambrault                 2007/10/15  星期一
Mallin                    2004/6/14   星期一
Ernst                     2007/5/21   星期一
Greene                    2007/3/19   星期一
Banda                     2008/4/21   星期一

在这里插入图片描述
这个就用那个三目呗

SQL> select last_name,nvl(to_char(commission_pct),'No Com') as com from employees;

LAST_NAME                 COM
------------------------- ----------------------------------------
King                      No Com
Kochhar                   No Com
De Haan                   No Com

这里保证nvl函数的参数要一样

否则报错哦

在这里插入图片描述
decode函数写
不要写case,when then
面试的时候,一定要用decode函数
这比较简单

SQL> select job_id,decode(job_id,'AD_PRES','A','ST_MAN','B','IT_PROG','C','SA_REP','D','ST_CLERK','E') as JOB from employees;

JOB_ID     JOB
---------- ---
AC_ACCOUNT 
AC_MGR     
AD_ASST    
AD_PRES    A

case 条件1,返回结果1
……
这用decode好说

SQL> select job_id,decode(job_id,'AD_PRES','A','ST_MAN','B','IT_PROG','C','SA_REP','D','ST_CLERK','E',to_char(0)) as JOB from employees;

JOB_ID     JOB
---------- ---
AC_ACCOUNT 0
AC_MGR     0
AD_ASST    0
AD_PRES    A
AD_VP      0

直接给0也行的
在这里插入图片描述

SQL> select job_id,CASE job_id WHEN 'AD_PRES' THEN 'A' WHEN 'ST_MAN' THEN 'B' WHEN 'IT_PROG' THEN 'C' WHEN 'SA_REP' THEN 'D' WHEN 'ST_CLERK' THEN 'E' ELSE to_char(0) END as JOB  from employees;

JOB_ID     JOB
---------- ---
AC_ACCOUNT 0
AC_MGR     0

最后的关键字是else哦
不是default
哈哈哈哈
小心了
这比decode复杂多了


总结

提示:重要经验:

1)
2)学好oracle,即使经济寒冬,整个测开offer绝对不是问题!同时也是你考公网络警察的必经之路。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。