一. Oracle字符串操作
字符串类型
1. CHAR和VARCHAR2类型
表示字符串数据类型,用来在表中存放字符串信息;
CHAR存放定长字符,即存不满补空格(浪费空间,节省时间);VARCHAR2存放变长字符,存多少占用多少(浪费时间,节省空间);
按照字符的自然顺序排序。
2. CHAR和VARCHAR2的存储编码
默认单位是字节,可指定为字符
— CHAR(10),等价于CHAR(10 BYTE)
— 指定单位为字符:CHAR(10 CHAR),20个字节
— VARCHAR2(10),等价于VARCHAR2(10 BYTE)
— 指定单位为字符:VARCHAR2(10 CHAR),20个字节
每个英文字符占用一个字节,每个中文字符按编码不同,占用2-4个字节
— ZHS16GBK:2个字节
— UTF-8:2-4个字节
3. CHAR和VARCHAR2的最大长度
CHAR最大取值为2000字节,最多保存2000个英文字符
VARCHAR2最大取值为4000字节
CHAR可以不指定长度,默认为1,VARCHAR2必须指定长度
4. LONG和CLOB类型
LONG:VARCHAR2加长版,存储变长字符串,最多达2GB的字符串数据
LONG有诸多限制:每个表只能有一个LONG类型列;不能作为主键;不能建立索引;不能出现在查询条件中
CLOB:存储定长或变长字符串,最多达4GB的字符串数据
ORACLE建议开发中使用CLOB替代LONG类型
字符串函数
1. CONCAT和“||”
CONCAT(char1, char2);
— 返回两个字符串连接后的结果,两个参数char1,char2是要连接的两个字符串
等价操作:连接操作符“||”
如过char1和char2任何一个为NULL,相当于连接了一个空格
“||”在数据库中是连接字符串,相当于java中的“+”,注意和java“||”区分
eg:
java中:”hello” + “world” ==> “helloworld"
DB中:’hello’||’world’ ==> ‘hello world'
oracle中:CONCAT(‘hello’,’world’) ==> ‘hello world'
2. FROM DUAL(虚表)
DUAL:虚表,没有这么一个表,只为了满足SELECT的语法要求。
— 我们常用虚表来测试表达式的结果。
— 在数据库中,我们想测试某个表达式的结果只能使用SELECT语句来实现
— 什么时候使用虚表:当SELECT语句中没有任何表中的字段参与时
— eg: 假设表emp中name和sal两个字段存储的内容分别是名字和薪资
SELECT name||’:’||sal FROM emp
则所得结果为:boss:5000
3. LENGTH
LENGTH(char):用于返回字符串的长度
如果字符类型是VARCHAR2,返回字符的实际长度,如果字符类型是CHAR,长度还要包括后补的空格
eg: SELECT name,LENGTH(name) FROM emp;
所得结果:boss 4(name为CHAR)
4. UPPER,LOWER和INITCAP
大小写转换函数,用来转换字符的大小写
UPPER(char)用于将字符转换为大写形式
LOWER(char)用于将字符转换为小写形式
INITCAP(char)用于将字符串中每个单词的首字符大写,其它字符小写,单词之间用空格和非字母字符分隔
如果熟人的参数是NULL值,仁返回NULL值
5. TRIM,LTRIM,RTRIM
作用:截去子串
语法形式:
— TRIM(c2 FROM c1)从c1的前后截去c2
— LTRIM(c1[, c2])从c1的左边(Left)截去c2
— RTRIM(c1[, c2])从c1的右边(Right)截去c2
如果没有c2就去除空格
eg:SELECT TRIM(‘e’ from ‘eeeeliteeee’) FROM DUAL;
参数中from前面只能是单一字符
若没有from以及前面的字符,则是去除空白
eg:SELECT LTRIM(‘eeeeliteeee’,’e’) FROM DUAL;
SELECT RTRIM(‘eeeliteee’,’e’) FROM DUAL;
不指定第二个参数,默认是去除空白
6. LPAD, RPAD
补位函数,用于在字符串char1的左端或右端用char2补足到n位,char2可重复多次
— LPAD(char1, n, char2)左补位函数
— RPAD(char1, n, char2)右补位函数
在emp表中使用左补位,将sal用$补齐20位
eg:SELECT name, LPAD(sal, 20, ‘$’) as “salary” FROM emp;
作用:要求显示20个字符,若sal的值不足长度,则补充若干个’$’,以达到20个字符
eg:SELECT RPAD(‘aaaaAAAAA’) FROM DUAL;
得到结果为aaaaA
7. SUBSTR
SUBSTR(char, [m[, n]])
— 用于获取字符串的子串,返回char中从m位开始取n个字符
如果m=0,则从首字符开始,如果m取负数,则从尾部开始
如果没有设置n,或者n的长度超过了char的长度,则取到字符串末尾为止
字符串的首位计数从1开始
8. INSTR
INSTR(char1, char2[, n [, m]]);
返回子串char2在原字符串char1中的位置
参数:
— 从n的位置开始搜索,没有指定n,从第一个字符开始搜索
— m用于指定子串的第m次出现次数,如果不指定取值1
— 如果在char1中没有找到子串char2,返回0
二. Oracle数值操作
数值类型
1. NUMBER(P)表示整数
完整语法:NUMBER(precision, scale)
— 如果没有设置scale,则默认取值0,即NUMBER(p)表示整数
— P表示数字的总位数,取值为1-38
用来在表中存放如编码,年龄,次数等用整数记录的数据
2. NUMBER(P, S)表示浮点数
NUMBER(precision, scale)
— precision:NUMBER可以存储的最大数字长度(不包括左右两边的0)
— scale:在小数点右边的最大数字长度(包括左侧0)
指定了s但是没有指定p,则p默认为38
经常用于表中存放金额,成绩等有小数的数据。
NUMBER的变种数据类型:内部实现是NUMBER,可以将其理解为NUMBER的别名,目的是多种数据库及编程语言兼容
— NUMERIC(p, s):完全映射至NUMBER(p, s)
— DECIMAL(p, s)或DEC(p, s):完全映射至NUMBER(p, s)类型
— INTEGER或INT:完全映射至NUMBER(38)类型
— SMALLINT:完全映射至NUMBER(38)类型
— FLOAT(b):映射至NUMBER类型
— DOUBLE PRECISION:映射至NUMBER类型
— REAL:映射至NUMBER类型
数值函数
1. ROUND
ROUND(n[, m]):用于四舍五入
— 参数中的n可以是任何数字,指要被处理的数字
— m必须是整数
— m取正数则四舍五入到小数点后第m位
— m取0值则四舍五入到整数位
— m取负数,则四舍五入到小数点前m位
— m缺省,默认是0
eg:SELECT ROUND(45.678, -1) FROM DUAL; —50
2. TRUNC
TRUNC(n[, m]):用于截取
— n和m的定义和ROUND(n[, m])相同,不同的是功能上按照截取的方式处理数字n
eg:SELECT TRUNC(45.678, -1) FROM DUAL; —40
3. MOD
MOD(m, n):返回m除以n后的余数
—n为0则直接返回m
4. CEIL和FLOOR
CEIL(n),FLOOR(n)这两个函数,一个是取大于或等于n的最小整数值,另一个是取小于或等于n的最大整数值
eg:SELECT CEIL(45.678) FROM DUAL; —46
SELECT FLOOR(45.678) FROM DUAL; —45
三. Oracle日期操作
日期类型
1. DATE
ORACLE中最常用的日期类型,用来保存日期和时间
DATE表示的日期范围可以是公元前4712年1月1日至公元9999年12月31日
DATE类型在数据库中的存储固定为7个字节,格式为:
— 第一个字节:世纪+100
— 第二个字节:年
— 第三个字节:月
— 第四个字节:天
— 第五个字节:小时+1
— 第六个字节:分+1
— 第七个字节:秒+1
2. TIMESTAMP
ORACLE常用的日期类型
与DATE的区别是不仅可以保存日期和时间,还能保存小数秒,最高精度可以到ns(纳秒)
数据库内部用7或者11字节存储,精度为0,用7字节存储,与DATE功能相同,精度大于0则用11字节存储
格式为:
— 第1字节-第7字节:和DATE相同
— 第8-11字节:纳秒,采用4个字节存储,内部运算类型为整型
日期关键字
1. SYSDATE
其本质是一个ORACLE的内部函数,返回当前的系统时间,精确到秒
默认显示格式是DD-MON-RR
2. SYSTIMESTAMP
内部函数,返回当前系统日期和时间,精确到毫秒
日期转换函数
1. TO_DATE
TO_DATE(char[, fmt[, nlsparams]]):将字符串按照定制格式转换为日期类型
— char:要转换的字符串
— fmt:格式
— nlsparams:指定日期语言
— 常用的日期格式见表
YY | 2位数字的年份 |
YYYY | 4位数字的年份 |
MM | 2位数字的月份 |
MON | 简拼的月份 |
MONTH | 全拼的月份 |
DD | 2位数字的天 |
DY | 周几的缩写 |
DAY | 周几的全拼 |
HH24 | 24小时制的小时 |
HH12 | 12小时制的小时 |
MI | 显示分钟 |
SS | 显示秒 |
2. TO_CHAR
将其它类型的书籍转换为字符类型
TO_CHAR(date[, fmt[, nlsparams]]):将日期类型数据date按照fmt的格式输出字符串。nlsparams用于指定日期语言
需要注意的是:在日期格式字符串中,出现的非关键字符或符号的其它字符时,需要使用双引号
eg:SELECT TO_CHAR(SYSDATE, “yyyy”year”mm”month”dd”day”hh:mi:ss”) FROM DUAL;
两个日期可以进行减法操作,差为相差的天数
日期常用函数
1. LAST_DAY
LAST_DAY(date):返回日期date所在月的最后一天
在按照自然月计算某些业务逻辑,或者安排月末周期性活动时很有用处
eg:SELECT LAST_DAY(SYSDATE) FROM DUAL; —30-9月-17
SELECT LAST_DAY(’20-2月-09’) FROM DUAL; —28-2月-09
2. ADD_MONTHS
ADD_MONTHS(date, i):返回日期date加上i个月后的日期值
— 参数i可以是任何数字,大部分时候取正值整数
— 如果i是小数,将会被截取整数后再参与运算
— 如果i负数,则获得的是减去i个月后的日期值
eg:计算职员入职20周年纪念日
SELECT name, ADD_MONTHS(hiredate, 20 * 12) as ‘20周年’ FROM emp;
3. MONTHS_BETWEEN
MONTHS_BETWEEN(date1, date2):计算date1和date2两个日期值之间间隔了多少个月
实际运算是date1-date2,如果date2时间比date1晚,会得到负值
除非两个日期间隔是整数月,否则会得到带小数位的结果。
— 此时可以使用FLOOR得到整月
eg:SELECT name, FLOOR(MONTHS_BETWEEN(SYSDATE, hiredate)) FROM emp;
4. NEXT_DAY
NEXT_DAY(date, char):返回date日期数据的下一个周几,周几是由参数char来决定的
在中文环境下,直接使用“星期三”这种形式,英文环境下,需要使用“WEDNESDAY”这种英文的周几。位避免麻烦,可以直接使用1-7表示周日-周六
NEXT_DAY不是明天
SELECT NEXT_DAY(SYSDATE, 3) FROM DUAL; —离现在最近的周2(不包含今天)
5. LEAST, GREATEST
GREAGEST(expr1[, expr2[, expr3]]...)
LEAST(expr1[, expr2[,expr3]]...)
也被称作比较函数,可以有多个参数值,返回结果是参数列表中最大或最小的值
参数类型必须一致
在比较之前,在参数列表中第二个以后的参数会被隐含的转换为第一个参数的数据类型,所以如果可以转换,则继续比较,如果不能转换将会报错。
6. EXTRACT
EXTRACT(date FROM datetime):从参数date time中提取参数date指定的数据,比如提取年,月,日
eg:SELECT EXTRACT(HOUR FROM TIMESTAMP ‘2008-01-01 10:10:10’) FROM DUAL;
四. 空值操作
NULL的含义
数据库里的重要概念:NULL,即空值
有时表中的某些字段值,数据未知或暂时不存在,取值NULL
任何数据类型均可取值NULL
NULL的操作
1. 插入NULL值和更新成NULL时只有在非空约束时才可操作
查询条件:WHERE name IS NULL/ WHERE name IS NOT NULL
任何数据和NULL相加都是NULL
2. 非空约束
非空(NOT NULL)约束用于确保字段值不为空
默认情况下,任何列都允许有空值
当某个字段被设置了非空约束条件,这个字段中必须存在有效值。
空值函数
1. NVL
NVL(expr1, expr2):将NULL转变为非NULL值
— 如果expr1为NULL,则取值expr2,expr2是实际值
— expr1和expr2可以是任何数据类型,但两个参数的数据类型必须是一致的
2. NVL2
NVL2(expr1, expr2, expr3):和NULL函数功能类似,都是将NULL转变为实际值
NVL2用来判断expr1是否为NULL,如果不是NULL,返回expr2,如果是NULL,返回expr3