Oracle 语法总结 (二)

mac2022-06-30  32

一,知识点

DQL语句 用于查询表中数据 DQL必须包含两部分:SELECT子句,FROM子句 SELECT子句:指定要查询的内容,表中的具体字段,*号。函数。表达式 FROM子句:指定数据来源的表 --1 SELECT * FROM emp_liwc SELECT job,sal,sal*12 FROM emp_liwc --2 SDQ中所有WHERE子句添加条件 SELECT job,sal,sal*12 FROM emp_liwc WHERE sal>2000 --3 字符串函数  连接串c1,c2 SELECT CONCAT(CONCAT(ename,':'),sal) FROM emp_liwc  '||'作用同上 SELECT ename||':'||sal FROM emp_liwc --4 LENGTH(C)查询指定字符串的长度 SELECT ename,LENGTH(ename)FROM emp_liwc 查询名字是6个字母的的员工 SELECT ename,sal,job FROM Temp_liwc WHERE LENGTH(ename)=6 UPPER(大写),LOWER(小写),INITCAP(首字母大写,字符串可以用空格分割多个单词 这样每个单词首字母都大写) 当查新数据不予任何表有关系时, 查询伪表:daul SELECT UPPER('helloworle'),LOWER('HELLOWORLD'),INITCAP('hello world')FROM dual SELECT ename,sal,job FROM emp_liwc WHERE ename = UPPER('scott') --5 去两端 TRIM,LTRIM,RTRIN 截取集仅能有一个字符 SELECT TRIM('e' FROM 'eeeseeliwceesee')FROM dual 去掉多个字符中的两端所有相同(任意一个) SELECT LTRIM('eeeseeliwceesee','eeee')FROM dual SELECT RTRIM('eeeseeliwceesee','se')FROM dual --6 补位函数 LPAD(c1,n,c2):将c1显示N位长度,不足c2左补全,超出c1左侧截取并返回 RPAD(c1,n,c2):将c1显示N位长度,不足c2右补全,超出c1左侧截取并返回 SELECT ename,LPAD(sal,6,'$')FROM emp_liwc SELECT ename,RPAD(sal,3,'$')FROM emp_liwc --7 SUBSTR(c,m[,n]) 截取字符串c从第m个字符开始,连续截取n个字符 若n补指定则截取到末尾,n超过长度也是截取到末尾 数据库下标从1开始的 下标负数为Last SELECT SUBSTR('thinking in java',10,2)FROM dual SELECT SUBSTR('thinking in java',-7,2)FROM dual --8 INSTR(char1,char2[,n[,m]]) 查找char2在char1中的位置 从n开始,m次出现,不写为1 SELECT INSTR('thinking in java','in',4,1)FROM dual --9 ROUND(n[,m]) 对n进行四舍五入,保留小数点后m位 m可为负数 m不指定为0 SELECT ROUND(45.3652,3)FROM dual--45.365 SELECT ROUND(564.5264,0)FROM dual--566 SELECT ROUND(55.265,-1)FROM dual--60 --10 TRUNC(n,[,m]) 参数与ROUND意义相同,区别于仅仅截取数字,不做四舍五入 SELECT TRUNC(45.3659,3)FROM dual--45.365 SELECT TRUNC(564.5264,0)FROM dual--564 SELECT TRUNC(55.265,-1)FROM dual--50 --11 MOD(m,n) 求余数规则为m除以n,若n为0直接返回m SELECT ename,MOD(sal,1000)FROM emp_liwc --12 CEIL,FLOOR 向上取整,向下取整 SELECT CEIL(45.678) FROM dual--46 SELECT FLOOR(45.678) FROM dual--45 --13 时间相关关键字 SYSDATE,SYSTIMESTAMP 他们对于ARACLE内部函数,返回当前系统时间 不同的是一个返回DATE ,一个返回时间戳类型 SELECT SYSTIMESTAMP FROM dual --14 日期转换函数 1 TO_DATE() 将字符串按照指定格式转换为date类型 SELECT TO_DATE('2008-08-08 20:08:08','YYYY-MM-DD HH24:MI:SS')FROM dual ORA-01821: 日期格式无法识别 SELECT TO_DATE('2008-08-08 20:08:08','YYYY年MM月DD日 HH24:MI:SS')FROM dual 日期格式字符串字母,数字外所有都要用双引号引用 SELECT TO_DATE('2008年08月08日','YYYY"年"MM"月"DD"日"')FROM dual DATE类型数据可以进行计算 两个DATE进行加减结果为相差的天数 时间越晚,DATE就越大 查看每个员工入职多少天 SELECT ename,SYSDATE-hiredate FROM emp_liwc SELECT SYSDATE-TO_DATE('1995-03-29 20:08:08','YYYY-MM-DD HH24:MI:SS') FROM dual TO_CHAR() 可以将日期转换为字符串,可以讲其他类型转换为字符串,通常转换时间 SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual--2017-09-13 15:24:44 日期格式中YY,RR的区别 都表示年 TO_DATE中 解释为实际年时,对世纪的处理方式不同 yy是根据当前系统时间解释世纪的 rr根据世纪情况判断(表) SELECT TO_CHAR(TO_DATE('95-03-29','YY-MM-DD'),'YYYY-MM-DD') FROM dual--2095-03-29 SELECT TO_CHAR(TO_DATE('95-03-29','RR-MM-DD'),'YYYY-MM-DD') FROM dual--1995-03-29 LAST_DAY(DATE):返回一个DATE表示月底日期 SELECT LAST_DAY(SYSDATE) FROM dual 查看每个员工入职所在月的最后一天 SELECT ename,LAST_DAY(hiredate) FROM emp_liwc ADD_MONTHS(DATE,i) 增加指定月 负数为减去 查看员工入职20周年 SELECT ename,ADD_MONTHS(hiredate,20*12)FROM emp_liwc MOMTHS_BETWEEN(date1,date2) 两个日期相差月 SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate))FROM emp_liwc NEXT_DAY(date,i) 返回给定日期第二天开始的一周之内的指定周几的日期 SELECT NEXT_DAY(SYSDATE,1)FROM dual--17-9月 -17 LEAST,GREATRST 求最大值,最小值,在日期中则是求最大日期,最小日期 SELECT GREATEST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD'))FROM dual SELECT LEAST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD'))FROM dual EXTAACT 提取指定日期对应的时间分量 SELECT EXTRACT(YEAR FROM SYSDATE)FROM dual 查看1982年入职的员工 SELECT ename,hiredate FROM emp_liwc WHERE EXTRACT(YEAR FROM hiredate)=1982

CREATE TABLE student_liwc (id NUMBER(4),name CHAR(20),gander CHAR(1)); INSERT INTO student_liwc VALUES(1000,'李莫愁','F'); INSERT INTO student_liwc VALUES(1001,'林平之',NULL); INSERT INTO student_liwc(id,name) VALUES(1002,'张无忌'); SELECT * FROM student_liwc 更新为null UPDATE student_liwc SET gander = null WHERE ID = 1000 过滤条件为null 判断NULL需要使用IS NULL 或者IS NOT NULL DELETE FROM student_liwc WHERE gander IS NULL NULL运算 NULL与字符串拼接等于什么也没做 NULL进行数字运算结果为NULL SELECT ename||NULL FROM emp_liwc 查看每个员工的收入绩效+工资 SELECT ename,sal,comm,sal+comm FROM emp_liwc 空值函数 NVL(a1,a2) 当a1为NULL时返回a2 当a1不为NULL时返回a1 将NULL替换为非空 SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp_liwc SELECT ename,sal,comm,sal+NVL2(comm,comm,0) FROM emp_liwc NVL2(a1,a2,a3) 当a1为NULL时返回a3 当a1不为NULL时返回a2 查看绩效,有绩效显示“有绩效”没绩效的显示“没绩效” SELECT ename,NVL2(comm,'有绩效','没绩效') FROM emp_liwc

二,例子

1:查询emp表中数据,列出一列,内容为名字与职位   显示格式:ename:job SELECT CONCAT(CONCAT(ename,':'),JOB) FROM emp_liwc SELECT ename||':'||job FROM emp_liwc 2:查看每个员工职位的字符个数 SELECT ename,LENGTH(JOB)FROM emp_liwc   3:将所有员工的名字以小写形式,与首字母大写形式    查询出来,第一列为小写形式,第二列为首字母大写 SELECT LOWER(ename),INITCAP(ename)FROM emp_liwc 4:将字符串'aaaaaabaaaaa'中左右两边的a去除 SELECT TRIM('a' FROM 'aaaaaabaaaaa') FROM dual 5:显示每个员工的名字,要求显示10位,第一列左对齐效果,第二列右对齐效果 SELECT RPAD(ename,10),LPAD(ename,10) FROM emp_liwc 6:截取字符串'DOCTOR WHO'中的'WHO' SELECT SUBSTR('DOCTOR WHO',8,3) FROM dual 7:查看'DOCTOR WHO'中'WHO'的位置 8:分别查看55.789四舍五入保留小数点后2位,整数位,十位后的    数字,显示成三列。 SELECT ROUND(55.789,2),ROUND(55.789),ROUND(55.789,-1)FROM dual    9:分别查看55.789截取后保留小数点后2位,整数位,十位后的    数字,显示成三列。 SELECT TRUNC(55.789,2),TRUNC(55.789),TRUNC(55.789,-1)FROM dual 10:查看每名员工工资百位以下的数字? SELECT ename,MOD(sal,100) FROM emp_liwc 11:查看每名员工从入职到今天一共多少天,若有小数则向上取整。 SELECT ename,CEIL(SYSDATE-hiredate)FROM emp_liwc 12:查看从2008-08-08号到今天为止一共经历了多少天? SELECT SYSDATE-TO_DATE('2008-08-08','YYYY-MM-DD')FROM dual 13:将每名员工入职时间以例如:      1981年12月3日      的形式显示 SELECT ename,TO_CHAR(hiredate,'YYYY"年"MM"月"DD"日"') FROM emp_liwc 14:查看每个员工入职所在月的月底是哪天? SELECT ename,LAST_DAY(hiredate)FROM emp_liwc 15:查看每名员工转正日期(入职后3个月) SELECT ename,ADD_MONTHS(hiredate,3)FROM emp_liwc 16:查看每名员工入职至今共多少个月? SELECT ename,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate))FROM emp_liwc 17:查看从明天开始一周内的周日是哪天? SELECT NEXT_DAY(SYSDATE,1)FROM dual 18:查看82年以后入职的员工的入职日期,82年以前的按照      1982年01月01号显示。格式都是DD-MON-RR(默认格式) SELECT GREATEST(hiredate,TO_DATE('1982年01月01日','YYYY"年"MM"月"DD"日"'))FROM emp_liwc      19:查看每名员工的入职年份? SELECT ename,EXTRACT(YEAR FROM hiredate)FROM emp_liwc 20:显示每个员工的总收入(工资加奖金),奖金为NULL的只看工资 SELECT ename,sal+NVL(comm,0)FROM emp_liwc 21:使用NVL2实现20题的需求 SELECT ename,sal+NVL2(comm,comm,0)FROM emp_liwc

浮生夢 举世瞩目 当有一天,有星光刺破黑洞的昏暗,那是我吞吐天地的余晖,代表着我已映照诸天。当有一天,有玄雷划过星空的浩瀚,那是我拳光的劲风,代表着我已回来。当星河列阵,宇宙星海星光齐绽,那是我在笑,我已复苏,我在归来,我已无敌!
最新回复(0)