Oracle常用函数(三)

1、sysdate:查询当前日前包含时间

select sysdate from dual;

2、length(str):返回字符串的长度,str 表示一个字符串

select length('aa') from dual;
select ename,length(ename) from emp;
--查询姓名有6个字符的员工信息
select * from emp where length(ename)=6;

3、concat(str1,str2):str1,str2都是字符串,将字符串str1 和 str2 拼接在一起

select concat('aa','bb') from dual;
||:字符串连接符
select 'aa'||'bb' from dual;
select concat(concat('aa','bb'),'cc') from dual;
select 'aa'||'bb'||'cc' from dual;
select 'drop table '||table_name||':' from user_tables;

注意:字符串要用单引号括起来,在字符串(单引号中)中使用两个连着的单引号,这时第一个单引号是一个转义符号

select '''' from dual;
select ',''' from dual;
select 'insert into dept values( '||deptno||','''||dname||
    ''','''||loc||''');' from dept;

4、chr(ASCII):它将 ASCII 列转换成字符

select chr(39) from dual;
select chr(85) from dual;
select chr(97) from dual;
select 'insert into dept values('||deptno||','||chr(39)||dname||chr(39)
  ||','||chr(39)||loc||chr(39)||');' from dept;

5、substr(str,index,len):字符串截取函数,str是一个字符串,index 截取的开始位置,len 截取的长度(第三个参数可省略)

表示从字符串str的 index 位置开始截取 len 个长度的字符

select substr('abcdefg',2,2) from dual;
select substr('abcdefg',2) from dual;
select substr('abcdefg',2,6) from dual;
select substr('abcdefg',2,8) from dual;

6、trim([s from]str):str 表示字符串,s 表示字符,表示去除字符串两端的空格,如果加 s,表示去除字符串两端的字符 s

select '    abcd    ' from dual;
select trim('    abcd    ') from dual;
select trim('$' from '$abcd$$') from dual;

ltrim(str[,‘s’]):去除字符串左边的空格或者字符 s
rtrim(str[,‘s’]):去除字符串右边的空格或字符 s

select ltrim('    abcd    ') from dual;
select rtrim('    abcd    ') from dual;
select ltrim('$abcd$','$') from dual;
select rtrim('$abcd$','$') from dual;

7、replace(str,s,d):替换函数,str 字符串,s 要替换的内容,d 替换的内容,

表示将字符串 str 中的 s 替换成 d

select replace('abcd1qewr1qerazdf','qe','QE') from dual;

8、lpad/rpad(str,len,[s]):str 表示字符串,len 表示扩展后的字符串长度,s 表示要扩展的内容,为可选参数

表示在字符串的左边填充空格或者 s 让字符串的长度到 len 的长度。

select lpad('aa',4) from dual;
select lpad('aa',4,'b') from dual;
select lpad('abcd',2,'6') from dual;
select rpad('abcd',2,'6') from dual;

9、initcap(str):str 表示字符串,将字符串中的英文单词首字母大写

select initcap('hello world') from dual;
select initcap('helloworld') from dual;

10、lower/upper(str):将字符串全部转换成小写/大写

select lower(ename) from emp;
select upper(ename) from emp;

11、instr(str,s[,n1,n2]):在字符串中找某个字符的位置。str 字符串,s:要查询的字符,n1 表示查询的开始位置,n2 表示这个字符第几次出现

在字符串 str 中从 n1 的位置开始查询第 n2 次出现字符 s 的位置

--差字符串首次出现 j 得位置
select instr('asdoqwerjldajsfoqjwelfjaoidsfj','j') from dual;
--从字符串的第10个字符开始查找第一次出现 j 的位置
select instr('asdoqwerjldajsfoqjwelfjaoidsfj','j',10) from dual;
--从字符串的第10个字符开始查找第三次出现 j 的位置
select instr('asdoqwerjldajsfoqjwelfjaoidsfj','j',10,3) from dual;
--从字符串的倒数第3个字符开始反向查找第三次出现 j 的位置
select instr('asdoqwerjldajsfoqjwelfjaoidsfj','j',-3,3) from dual;

12、floor(n):取整函数,只取整数部分,不进行四舍五入

select floor(3.41) from dual;
select floor(3.98) from dual;

13、mod(m,n):求 m 除以 n 的余数的函数

select mod(3,2) from dual;

14、round(n,s):四舍五入函数,n 表示数字,s 表示精度,默认是0

select round(3.134) from dual;
select round(5.76) from dual;
select round(5.68,1) from dual;

15、power(m,n):求 m 的 n 次方

select power(2,3) from dual;

16、to_number(str[,format]):将字符串转换成数字,str 字符串,format 格式字符串

select to_number('78.1234') from dual;

17、to_date(str,format):将字符串转换成固定格式的日期,str 是一个日期,format 是日期格式

yyyy:表示4位的年
MM:表示两位月
dd:表示两位的天
hh24:表示24小时制的小时
mi:表示分钟
ss:表示秒
day:表示星期

select to_date('1999-09-09 14:24:34','yyyy-MM-dd hh24-mi-ss') from dual;

18、to_char(date, format):将日期转换成字符串,date 是一个日期,format是日期格式

select to_char(sysdate,'yyyy') from dual;
select to_char(sysdate,'hh24:mi:ss') from dual;
select to_char(sysdate,'day') from dual;

19、add_months(date,n):给日期加减n个月

select add_months(sysdate,3) from dual;
select add_months(sysdate,-3) from dual;

日起直接加上一个整数,相当于加的天数

select sysdate+1 from dual;

20、months_between(date1,date2):求两个日期相差多少个月

select months_between(sysdate,to_date('20210120','yyyyMMdd')) from dual;

21、last_day(date):取日期当前月的最后一天

select last_day(sysdate) from dual;
select current_date from dual;

22、trunc():截断函数

--截断数字类型,第二个参数表示精度,不会四舍五入
select trunc(3.13453,3) from dual;
--截取到年(本年的第一天)
select trunc(sysdate,'yyyy') from dual;
--截取到月(本月的第一天)
select trunc(sysdate,'MM') from dual;
select trunc(sysdate,'month') from dual;
--截取到周(本周第一天,即上周日)
select trunc(sysdate,'day') from dual;

23、decode(exp,res1,value1,res2,value2,…,default)

exp:表达式
res1,res2,… 表达式的结果
如果表达式的结果和某一个 res 值相等,就会返回 res 后面对应的 value,如果表达式的结果没有一个 res 值和它匹配,它会返回 default 默认值

select decode(ssex,'男','男生','女','女生','未知') from student;

24、nvl(变量,默认值):如果变量的值是空的,函数返回默认值,如果变量的默认值不为空返回变量的值

select nvl(comm,200) from emp;

25、行列转换

1、行转列:将表中多行数据转成一行的多个字段输出

需要行转列的业务逻辑通常是:将表中的一个字段分类统计后作为多个结果字段输出
如:

create table studentScores(
       username varchar2(20),
       subject  varchar2(30),
       score    number
);
insert into studentScores values('张三','语文',90);
insert into studentScores values('张三','英语',80);
insert into studentScores values('张三','数学',70);
insert into studentScores values('李四','语文',60);
insert into studentScores values('李四','英语',61);
insert into studentScores values('李四','数学',62);
select * from studentScores;
select username,
  sum(case when subject='语文' then score else 0 end) 语文,
  sum(case when subject='英语' then score else 0 end) 英语,
  sum(case when subject='数学' then score else 0 end) 数学
from studentScores group by userName;

pivot 函数是行转列的函数

--用pivot函数查出来的字段名就是’语文‘,注意这两个单引号也是名称一部分,所以这行要用双引号括起来
select username,"'语文'","'英语'","'数学'" from Studentscores
pivot(sum(score) for subject in('语文','英语','数学'));
2、列转行:将表中多个列,每个列拉成一条数据

如:

create table studentScores2(
       username varchar2(20),
       yuwen  number,
       yingyu   number,
       shuxue   number
);
insert into studentScores2 values('张三',90,80,70);
insert into studentScores2 values('李四',60,61,62);
select * from studentScores2;
select username,'yuwen' as subject,yuwen as score from studentScores2
union all
select username,'yingyu',yingyu from studentScores2
union all
select username,'shuxue',shuxue from studentScores2;

unpivot 函数是列转行函数

select username,subject,score from studentScores2
unpivot(score for subject in(yuwen,yingyu,shuxue));

你可能感兴趣的:(Oracle,oracle,数据库,sql)