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

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

NO.44 Oracle字符串、数值、日期和空值函数_第1张图片
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

你可能感兴趣的:(NO.44 Oracle字符串、数值、日期和空值函数)