一. 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:指定日期语言
— 常用的日期格式见表
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。