NO.44 Oracle字符串、数值、日期和空值函数

为方便测试,创建表emp,包含以下信息:

emp测试用表

DQL:数据查询语言

必要的字句有两部分组成:

SELECT子句:用来指定要查询的字段,这里可以包含表中的实际字段,表达式,函数。

FROM子句:用来指定数据来源的表

SELECT * FROM emp

SELECT ename,job,sal,deptno FROM emp

SELECT ename,sal,sal*12 FROM emp

可以使用WHERE子句添加过滤条件,来查询满足条件的数据

查看工资高于2000的员工信息?

SELECT ename,sal,deptno FROM emp WHERE sal>2000


字符串函数

1:CONCAT(char1,char2)

连接字符串char1,char2

SELECT CONCAT(ename,sal) FROM emp

SELECT CONCAT(CONCAT(ename,','),sal) FROM emp

"||"也是用来连接字符串使用的

SELECT ename||','||sal FROM emp

2:LENGTH(char)

查看给定字符串的长度

查看每个员工名字的单词个数?

SELECT ename,LENGTH(ename) FROM emp

查看名字是5个字母的员工都有谁?

SELECT ename,sal,deptno FROM emp WHERE LENGTH(ename)=5

3:UPPER,LOWER,INITCAP

将字符串转换为全大写,全小写,首字母大写

dual:伪表,当查询的数据与任何表中数据无关时,可以在FROM子句中使用伪表。

SELECT UPPER('helloworld'),LOWER('HELLOWORLD'),INITCAP('HELLO WORLD') FROM dual

SELECT ename,sal,deptno FROM emp WHERE ename=UPPER('smith')

4:TRIM,LTRIM,RTRIM

去除字符串两边的指定重复字符,或单独去除左边,单独去除右边。

SELECT TRIM('e' FROM 'eeeeliteee') FROM dual

LTRIM,RTRIM删除方式是从左或右,只要字符是第二个参数指定的字符之一就去除。

SELECT LTRIM('efsfefsfffffesefsliteee','fes') FROM dual

SELECT RTRIM('eeeeliteee','e') FROM dual

5:LPAD,RPAD

补位函数.

LPAD(char1,n,char2)

以LPAD为例,要将char1显示n位长度,若不足则在左侧补充若干个char2字母以达到该长度。

char2字符必须是单一的一个字符。若char1超过n位,则从左开始截取到n位。

SELECT ename,RPAD(sal,6,'$') FROM emp

6:SUBSTR(char,m[,n])

截取字符串char,从第m个字符开始截取。若n不指定,或n超过实际可以截取的长度时,则表示截取到字符串末尾。n为截取的字符长度。

需要注意,在数据库中下标是从1开始的!

m若为负数,则是从倒数位置开始截取。

SELECT SUBSTR('thinking in java',-7,2) FROM dual

7:INSTR(char1,char2[,m[,n]])

查找char2在char1中的位置。

m,n不指定默认值都是1,。

m表示从第几个字符开始查找。n表示第几次出现。

SELECT INSTR('thinking in java','in',4,2) FROM dual


数值函数

1:ROUND(m,n)

对m进行四舍五入,保留小数点后n位。

若n为0则是保留到整数位。若n为负数,则是保留十位以上的位数。

SELECT ROUND(45.678, 2) FROM DUAL;

SELECT ROUND(45.678, 0) FROM DUAL;

SELECT ROUND(45.678, -1) FROM DUAL;

2:TRUNC函数

截取数字,参数意义与ROUND一致

SELECT TRUNC(45.678, 2) FROM DUAL;

SELECT TRUNC(45.678, 0) FROM DUAL;

SELECT TRUNC(45.678, -1) FROM DUAL;

3:MOD(m,n)

求余数,计算是依据m除以n。

n若为0,函数直接返回m的值

SELECT MOD(13,4) FROM dual

4:CEIL,FLOOR

向上取整与向下取整

CEIL:返回大于参数的最小整数

FLOOR:返回小于参数的最大整数

SELECT CEIL(45.678) FROM dual

SELECT FLOOR(45.678) FROM dual


日期类型

DATE与TIMESTAMP

DATE:7字节,分别存:世纪,年,月,日,时,分,秒

TIMESTAMP:7-11字节,前面与DATE一致,后4个字节存秒以下的精度,最多可以表示到纳秒。

常用的日期关键字:

SYSDATE,SYSTIMESTAMP

对应数据库内置函数,返回对应类型的当前系统时间。

SELECT SYSDATE FROM dual

SELECT SYSTIMESTAMP FROM dual

日期转换函数

1:TO_DATE()

将给定的字符串按照指定的日期格式解析为一个DATE类型数据。

在日期格式中,凡不是英文和符号的其他字符都需要使用双引号括起来。

SELECT TO_DATE('2008年08月08日 20:08:08','YYYY"年"MM"月"DD"日" HH24:MI:SS') FROM dual

2:TO_CHAR()

将一个DATE按照指定的日期格式转换为字符串。

TO_CHAR也可以将数字转换为字符串,但是常用的就是将日期进行相应转换。

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM dual

日期可以进行计算:

两个日期之间相减,差为相差的天数,对一个日期加减一个数字结果等同加减了天数。

查看每个员工入职至今过多少天?

SELECT ename,SYSDATE-hiredate FROM emp

根据生日查看到今天为止活了多少天?

SELECT SYSDATE - TO_DATE('1992-06-05','YYYY-MM-DD') FROM dual

查看100天以后是哪天?

SELECT SYSDATE+100 FROM dual

RR也是用两位数字表示年,与YY的不同之处在于,当使用TO_DATE函数将一个字符串中

两位数字转换为对应年的时候YY与RR区别是YY用当前系统时间作为实际,而RR会根据该

数字与当前系统时间的世纪进行相应判断来决定。

SELECT TO_CHAR(TO_DATE('87-08-02','YY-MM-DD'),'YYYY-MM-DD') FROM dual

SELECT TO_CHAR(TO_DATE('87-08-02','RR-MM-DD'),'YYYY-MM-DD') FROM dual

日期常用函数:

1:LAST_DAY(date)

返回给定日期所在月的月底日期

当月月底是哪天?

SELECT LAST_DAY(SYSDATE)

FROM dual

2:ADD_MONTHS(date,i)

对给定日期加指定的月。若i为负数则是减去指定的月。

查看每个员工入职20周年纪念日是哪天?

SELECT ename,ADD_MONTHS(hiredate,12*20) FROM emp

3:MONTHS_BETWEEN(date1,date2)

计算两个日期之间相差的月,计算是根据date1-date2得到的。

查看每个员工入职至今多少个月?

SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate) FROM emp

4:NEXT_DAY(date,i)

i对应的数字为:1-7分别表示周日-周六。

NEXT_DAY返回给定日期第二天开始一周之内对应的指定周几的日期。

SELECT NEXT_DAY(SYSDATE,4) FROM dual

5:LEAST,GREATEST

求最小值与最大值

凡是可以比较大小的数据都可以做为这两个函数的参数。但是所有参数的类型要统一。

对于日期而言,最大值即最晚的日期,最小值即最早的日期。

SELECT LEAST(SYSDATE,TO_DATE('2008-08-08','YYYY-MM-DD')) FROM dual

6:EXTRACT()

获取指定日期中指定分量的值

SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual

查看82年入职的员工?

SELECT ename,sal,hiredate FROM emp WHERE EXTRACT(YEAR FROM hiredate)=1982

NULL值操作:

插入NULL值

CREATE TABLE student(id NUMBER(4),name CHAR(20) NOT NULL,gender CHAR(1));

INSERT INTO student VALUES(1000, '李莫愁', 'F');

INSERT INTO student VALUES(1001, '林平之', NULL);

INSERT INTO student(id, name) VALUES(1002, '张无忌');

更新为NULL

UPDATE student SET gender=NULL WHERE id=1000

SELECT * FROM student

过滤条件中判断NULL值

判断要使用 IS NULL 或 IS NOT NULL

DELETE FROM student WHERE gender IS NOT NULL

NULL的计算:

字符串与NULL连接等于什么也没做

NULL与数字运算结果还是NULL

查看每个员工的收入:(工资+绩效)

SELECT ename,sal,comm,sal+comm FROM emp

空值函数:

NVL(arg1,arg2)

若arg1为NULL,函数返回arg2的值,

若arg1不为NULL,函数返回arg1自身。

所以NVL函数是将NULL替换为一个非NULL值。

SELECT ename,sal,comm,sal+NVL(comm,0) FROM emp

查看每个员工的绩效情况,有绩效的则显示为"有绩效",为NULL的则显示为"没有绩效"

NVL2(arg1,arg2,arg3)

当arg1不为NULL时,函数返回arg2

当arg1为NULL时,函数返回arg3

SELECT ename,comm,NVL2(comm,'有绩效','没有绩效') FROM emp

SELECT ename,sal,comm,NVL2(comm,sal+comm,sal) FROM emp

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,620评论 0 2
  • 1. select * from emp; 2. select empno, ename, job from em...
    海纳百川_4d26阅读 1,814评论 0 4
  • ORACLE日期时间函数大全 TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year:...
    雨一流阅读 620评论 0 2
  • SQL ==SQLPLUS== DML(Data Manipulation Language,数据操作语言)---...
    蝌蚪1573阅读 552评论 0 4
  • 短短二十多天,还没来得及打一个招呼,就这么结束了,”失业“来的很仓促,没有一点准备。 这段经历真的是以往不曾有过的...
    雨落泪尽阅读 581评论 0 2