Oracle字符串操作
字符串操作
CHAR和VARCHAR2类型
· 表示字符串数据类型,用来在表中存放字符串信息,比如姓名、职业、地址等;
· CHAR存放定长字符,即存不满补空格;VARCHAR2存放变长字符,存多少占用多少;
· 举例:保存字符串“HELLOWORLD”,工10个英文字母;
- CHAR(100):10个字母,补齐90个空格,实际占用100个;浪费空间、节省时间;
- VARCHAR2(100):10个字母,实际占用10;浪费时间、节约空间;
· 按照字符的自然顺序排序;
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个字节;
CHAR和VARCHAR2的最大长度
· CHAR最大取值为2000字节;
- 最多保存2000个英文字符,1000个汉字(GBK);
· VARCHAR2最大取值为4000字节;
- 最多保存4000个英文字符,2000个汉字(GBK);
· CHAR可以不指定长度,默认为1,VARCHAR2必须制定长度;
LONG和CLOB类型
· LONG:VARCHAR2加长版,存储变长字符串,最多达2GB的字符串数据;
· LONG有诸多限制:每个表只能有一个LONG类型列;不能作为主键;不能建立索引;不能出现在查询条件中;
· CLOB:存储定长或变长字符串,最多达4GB的字符串数据;
· ORACLE建议开发中使用CLOB代替LONG类型;
常见字符串函数
LENGHT
· LENGHT(CHAR):用于返回字符串长度;
· 如果字符串类型是VARCHAR2,返回字符的实际长度,如果字符类型是CHAR,长度还要包括后面补的空格;
SELECT ename,LENGHT(ename) from emp;
UPPER、LOWER和INITCAP
· 大小写转换函数,用来转换字符的大小写;
· UPPER(CHAR)用于将字符转换为大写形式;
· LOWER(CHAR)用于将字符转换为小写形式;
· INITCAP(CHAR)用于将字符串中每个单词的首字符大写,其他字符小写,单词之间用空格分隔;
· 如果输入的参数是NULL值,仍然返回NULL值;
SELECT UPPER('helloworld'),LOWER('helloworld'),INITCAP('helloworld') FROM DUAL;
TRIM、LTRIM、RTRIM
· 作用:截取子串
· 语法形式:
- TRIM(c2 FROM c1):从c1的前后截取c2;
- LTRIM(c2 FROM c1):从c1的左边(left)截取c2;
- RTRIM(c2 FROM c1):从c1的右边(Right)截取c2;
如果没有c2,就去除空格;
· TRIM经常用来去掉字符串前后的空格;
LPAD、RPAD
· 补位函数,用于在字符串char1的左端或右端用char2补助到n位,char2可重复多次;
- LPAD(char1,n,char2):左补位函数;
- RPAD(char1,n,char2):右补位函数;
--在emp表中使用左补位,将sal用$补齐6位
SELECT enmae,LPAD(sal,6,'$') as "salary" from emp;
SUBSTR
· SUBSTR(char,m[,n]):用于获取字符串的子串,返回char中从m为开始取n个字符;
· 如果m=0,则从首字符开始,如果m取负数,则从尾部开始;
· 如果没有设置n,或者n的长度超过了char长度,则取到字符串末尾为止;
SELECT SUBSTR('Doctor Who travels in TARDIS',8,25) FROM DUAL;
· 字符串的首位计数是从1开始;
Oracle数值操作
数值类型
NUMBER(P)表示整数
· 完整语法:NUMBER(precision,scale)
- 如果没有设置scale,则默认取值0,即NUMBER(P)表示整数;
- P表示数字的总位数,取值为1-38;
NUMBER(P,S)表示浮点型
· NUMBER(precision,scale)
- precision:NUMBER可以存储的最大数字长度(不包括左右两边的0);
- scale:在小数点右边的最大数字长度(包括左侧0)
· 指定了s但是没有指定p,则默认为38,如:列名number(*,s);
Oracle日期操作
日期类型
DATE(date)
· ORACLE中最常用的日期类型,用来保存日期和时间;
· DATE表示的日期范围可以是公元前4712年1月1日至公元9999年12月31日;
· DATE类型在数据库中的存储固定为7个字节,格式为:
- 第1字节:世纪+100
- 第2字节:年
- 第3字节:月
- 第4字节:日
- 第5字节:小时+1
- 第6字节:分+1
- 第7字节:秒+1
TIMESTAMP
· ORACLE常用的日期类型;
· 与DATE的区别是不仅可以保存日期和时间,还能保存小数秒,最高精度可以到ns(纳秒);
· 数据库内部用7或者11个字节存储,精度为0,用7字节存储,与DATE功能相同,精度大于0则用11字节存储;
· 格式为:
- 第1字节-第7字节:与DATE相同;
- 第8-11字节:纳秒,采用4字节存储,内部运算类型为整型;
CREATE TABLR test(
c1 DATE,
c2 TIMESTAMP
);
日期关键字
SYSDATE
· 其本质是一个Oracle的内部函数,返回当前系统时间,精确到秒;
· 默认显示格式是DD-MON-RR;
SYSTIMESTAMP
· 内部函数,返回当前系统日期和时间,精确到毫秒;
日期传唤函数
TO_DATE
· TO_DATE(char[,fmt[,nlsparams]]):将字符串按照定制格式转换为日期类型;
- char:要转换的字符串;
- fmt:格式;
- nlsparams:指定日期语言;
· 常用日期格式如下:
日期常用函数
LAST_DAY
· LAST_DAY(date):返回日期date所在月的最后一天;
· 用处:在按照自然月计算某些业务逻辑,或者安排月末周期性活动时很有用处;
SELECT LAST_DAY(SYSDATE)FROM DUAL;
ADD_MONTHS
· ADD_MONTHS(date i):返回日期date加上i个月之后的日期;
- 参数i可以是任何数字,大部分时候取正值整数;
- 如果i是小数,将会被截取整数后再参与运算;
- 如果i是负数,则获取的是减去i个月后的日期值;
--计算资源入职20周年纪念日
SELECT ename,ADD_MONTHS(hiredate,20*12)as '20周年' from emp;
MONTH_BETWEEN
· MONTH_BETWEEN(date1,date2):计算date1和date2两个日期之间间隔了多少个月;
· 实际运算是date1-date2,如果date2时间比date1晚,会得到负值;
· 除非两个日期间隔是整数月,否则会得到带小数位的结果,比如计算2009年9月1日到2009年10月10日之间隔多少月,会得到1.29个月
NEXT_DAY
· NEXT_DATE(date,char):返回date日期数据的下一个周几,周几是由参数char来决定的;
· 在中文环境下,直接使用“星期三”这种形式,英文环境下,需要使用“WEDNESDAY”这中英文周几;为了避免麻烦,可以直接用数字1-7表示周日-周六
· NEXT_DAY不是明天;
LEAST(least)、GREATEST(greatest)
· GREATEST(expr1[,expr2[,expr3]]...)
· LEAST(expr1[,expr2[,expr3]]...)
· 也被称作比较函数,可以有多个参数,返回结果是参数列表中最大或最小的值;
· 参数类型必须一致;
· 在比较之前,在参数列表中第二个以后的参数会被隐含的转换为第一个参数的数据类型,所以如果可以转换,则继续比较,如果不能转换将会报错;
EXTRACT(extract)
· EXTRACT(date FROM datetime):从参数datetime中提取参数date指定的数据,比如提取年、月、日
空值操作
NULL含义
· 数据库里的重要概念:NULL,即空值;
· 有时表中的某些字段值,数据未知或暂时不存在,取值NULL;
· 任何数据类型均可取值NULL;
NULL的操作
插入NULL
CREATE TABLE student(id NUMBER(4),NAME CHAR(20),gender CHAR(1))
--正常插入
INSERT INTO student VALUES(1000,'张三','F');
--显示插入NULL值
INSERT INTO student VALUES(1001,'李四',NULL);
--隐式插入NULL值
INSERT INTO student(id,name) VALUES(1001,'王五');
更新成NULL值
UPDATE student SET gender = NULL;
· 注意这种更新只能在此列没有非空约束的情况下可操作;
· 如果某列有非空约束,则无法更新为NULL值,上述语句会报错;
NULL条件查询
· NULL不等于任何值
--注意是IS不是=号
SELECT * FROM student WHERE gender IS NULL;
非空约束
· 非空(NOT NULL)约束用于确认字段值不为空;
· 默认情况下,任何列都允许有空值,但系统的业务逻辑可能会要求某些列不能去空值;
· 当某个字段被设置了非空约束条件,这个字段中必须存在有效值。即:当执行插入数据的操作时,必须提供这个列的数据,当执行更新操作时,不能给这个列设置为NULL;
空值函数
NVL
· NVL(expr1,expr2):将NULL转变为非NULL的值
- 如果expr1为NULL,则取值expr2,expr2是实际值;
- expr1和expr2可以是任何数据类型,但两个参数的数据类型必须是一直的;
NVL2
· NVL2(expr1,expr2,expr3):和NVL函数功能,都是将NULL转变为实际值;
· NVL2用来判断expr1是否为NULL,如果不是NULL,返回expr2,如果是NULL,返回expr3;类似三目运算;