Oracle数据库:条件表达式case when then else end,decode函数,oracle单行函数练习示例
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 2003年12月22日
Kochhar 2005/9/21 17000.00 2006年03月27日
De Haan 2001/1/13 17000.00 2001年07月16日
Hunold 2006/1/3 9000.00 2006年07月10日
加月之后的那个月,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,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。
相关文章
- Oracle数据库使用出现错误-状态: 失败 ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist
- Oracle数据库imp命令导入时1659错误处理
- 【C/C++学院】(26)Oracle数据库编程--程序模板c/cpp
- 【Oracle】利用在线重定义的方式改变普通表为分区表
- docker, oracle创建空间表,创建数据库。
- 使用DbVisualizer 8 连接Oracle数据库
- oracle数据库rman异地恢复
- cx_Oracle连接oracle数据库
- RHEL 4.7下的Oracle 10g RAC到单实例的单向同步
- Oracle数据库中违反唯一约束的处理
- cx_Oracle连接oracle数据库
- oracle 空值处理,排序过滤
- Oracle数据库表结构导出
- [转] Oracle数据库维护常用SQL语句集合
- ArcCatalog中通过ArcSDE向Oracle数据库中导入数据
- 64位Oracle用pl/sql导入表
- oracle 11g客户端如何完全卸载
- Atitit oracle新特性5 6 7 8 9 10 11 12 18 19 20 attilax总结 目录 1.1. :ora 20c1 1.2. Oracle Database 19c 的
- Atitit 数据库 标准库 sdk 函数库 编程语言 mysql oracle attilax总结
- atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
- Oracle数据库有用函数
- Oracle ORA-12541:TNS:no listener错误解决方法 (转)
- Oracle 19c RAC 为了避免一些不必要的bug设定参数
- 关于Oracle树形查询(connect by)的学习笔记
- Oracle RMAN-增量备份
- Oracle的学习心得和知识总结(二十)|Oracle数据库Real Application Testing之DBMS_SQLTUNE包技术详解
- Oracle的学习心得和知识总结(十二)|Oracle数据库Real Application Testing之SQL Performance Analyzer实操(一)