一、字符串操作
char:定长字符串类型(无论存多少数据都是固定长度的大小,最大长度为2000个字节),不指定长度时默认为一个字节
varchar2:可变长字符串类型,最大长度为4000个字节,必须指定长度
long:varchar2的加长版,最大长度为2G字节。但是一个表中只能有一个long类型的字段,此字段还不能作为主键,也不能做索引
colb:可代替long类型,最大长度4G字节,没有约束
默认单位:字节
如:char(10),表示占用内存10个字节
相当于char(10 byte)
也可以指定单位为字符char
如:char(10 char):表示内存占用10个字符,占用的字节数与字符集有关
(1)函数:拼接函数(可以使用||代替拼接函数)
--格式:
concat(p1,p2):将字符串p1和p2进行无缝拼接
--练习:将字符串"hello"和"kitty"进行拼接
select concat('hello','kitty') from dual;
--练习:将字符串"hello"和"kitty"拼接成"hello kitty"
select concat('hello',concat(' ','kitty')) from dual;
--练习:将emp表的每个员工的名称和职位拼到一起
select concat(ename,job) from emp;
--练习:可以给查询显示的字段起别名
select ename||'#'||job as "拼接结果" from emp;
(2) 函数:统计长度函数
--格式:length(p1)
--练习:统计一下'hello kitty'的字符串长度
select length('hello kitty') len from dual;
--练习:统计一下所有员工的姓名和长度,要求显示姓名和长度
select ename,length(ename) as len from emp;
--练习:将员工的姓名和职位用||拼起来后统计长度,并显示员工的姓名和职位
select ename,job,length(ename||job) as len from emp;
(3)函数:补位函数
--格式:左补位:lpad(p1,n,p2),相当于右对齐,表示使用p2在p1左边进行补位,总长度为n,n单位为字节;
--练习:使用#在字符串'hello'前进行补充,使整个字符串的总长度为20
select lpad('hello',20,'#') from dual;
--练习:查询所有员工的姓名在姓名前使用空格进行补位,总长度为20
select lpad(ename,20,' ') from emp;
--练习:查询所有员工的姓名和职位,使职位右对齐
select ename,lpad(job,10,' ') from emp;
--格式:右补位:rpad(p1,n,p2),相当于左对齐,表示使用p2在p1右边进行补位,总长度为n,n单位为字节;
--练习:统计一下所有的员工的姓名长度,姓名,在姓名后添加空格使长度到20,并统计加空格后的长度
select length(ename),ename,rpad(ename,20,' '),length(rpad(ename,20,' ')) from emp;
(4)函数:大小写函数
--格式:lower(p):将p中的字母都变成小写
--格式:upper(p):将p中的字母都编程大写
--格式:initcap(p):将p中的首字母大写,其他小写,空格隔开算一个单词
--练习:分别使用三个函数显示每一个员工的名称
select lower(ename),upper(ename),initcap(ename) from emp;
--练习:分别使用三个函数显示"no zuo no die"
select lower('no zuo no die'),upper('no zuo no die') ,initcap('no zuo no die') from dual;
(5)函数:截去函数
--格式:
trim( p2 from p1):从p1前后截去p2,p2必须是一个字符
--练习:截去'上海自来水来自海上'截去'上'
select trim('上' from '上海自来水来自海上') as ex1 from dual;
--练习:截去"aaabbbcsdsdsweaaa"的'a'
select trim('a' from 'aaabbbcsdsdsweaaa') as ex2 from dual;
--格式:ltrim(p1,p2):从p1左边截去含有p2的任意字符都可以截去,从p1左边开始,如果p1要截去的字符p2没有就停止操作
--练习:使用左截去对"abcdefgabc",截去,"abc"
select ltrim('abcdefgabc','abc') from dual;
--格式:rtrim(p1,p2):从p1右边截去含有p2的任意字符都可以截去,从p1右边开始,如果p1要截去的字符p2没有就停止操作
(6)函数:截取子串函数
--格式:
substr(p1,startindex,length):取子串,对p1进行截取,从start位置开始往后截取,没有第三个参数时,
截取到最后,有第三个参数时,len表示截取到长度,start从0~1时,表示从头截取;start为负数时,表示从后往前数的第start个
--练习:截取"no zuo no die"中的"zuo no"
select substr('no zuo no die',2,6) from dual;
--练习:从倒数第四个位置开始截取'no zuo no die'
select substr('no zuo no die',-4) from dual;
(7)函数:检索函数
--格式:instr(p1,p2,m,n),作用返回p2在p1的什么位置上
m:表示从p1的哪个位置开始
n:表示p2第几次出现的位置
instr(p1,p2)
m,n可有可无,没有m,n的时候表示从头开始,查找第一次出现的位置
--练习:查找子串'no'在字符串'no zuo no die'第一,二次出现的位置
select instr('no zuo no die','no',1,1) as 位置 from dual;
select instr('no zuo no die','no',1,2) as 位置 from dual;
--练习:查找子串在字符串中从位置4开始,往后第二次出现的位置
select instr('no zuo no die','no',4,2) as 位置 from dual;
注:查找不到返回值为0