oracle函数

函数分类:数值函数(针对数值类型);字符函数;日期函数;转换函数

函数的作用:方便数据的统计,方便查询处理结果

数值函数

四舍五入:

ROUND(n,[m])     n:代表需要的字段或数值;m代表取保留小数点前几位或后几位,可要可不要,不要代表取整,m>0代表取小数点后m位,m<0代表取小数点前|m|位

select round (23.4) ,round(23.45,1),round(23.45,-1) from dual;

           23                 23.5              20

取整函数:ceil:取最大值;floor:去最小值

select ceil (23.4) ,floor(23.45) from dual;

         24               23

常用计算:ABS(n):取绝对值

select ABS(23.4) ,ABS(-23.45),ABS(0) from dual;

               23.4          23.4          0

MOD(M,N)取余,M,N中只要有一个为空,那么结果就为空。

select mod (5,2) ,mod(null,2) ,mod(5,null)from dual;

             1           null                    null

power(m,n)m的 n次幂

select power (5,2) ,power(null,2) ,power(5,null)from dual;

               25               null                1

sqrt(n):n的开根号

select sqrt(16)  from dual;

          4

三角函数:SIN(N):正弦;  ASIN(N):反正弦;   COS(N) 余弦;ACOS(N) 反余弦;TAN (N):正切;ATAN(N)反正切

字符函数

大小写转换:upper(n)小写转大写;lower(n)大写转小写;initcap(n):首字母转为大写

select upper(abc)  ,lower(ADV),initcap(abc) from dual;

           ABC              adv          Abc

获取子字符串函数:substring(目标字符串或字段,其实位置[m],长度[n])

获取字符串长度函数:lenght(字符串或是字段)

select length ('acb') from dual;

            4

字符串连接函数:concat(char1,char2)与||操作符的作用一致。

select concat ('ac','bd') from dual;

                 acbd

去除字串函数:trim(要去除的字符(只能是一个)from 总字符串)   前者为空则代表去除总字符串的空格 Ltrim(c1,[c2])Rtrim(c1,[c2])

select trim('a' from 'adbc') from dual

                  bdc

替换函数:replace(总字符串,需要被替换的,[新的])

select replace (‘abcd’,'a','A') from dual;

                        Abcd

日期函数

日期函数:系统时间;日期操作

系统时间:SYSDATE:默认格式:DD-MON-RR

SELECT  SYSDATE FROM DUAL;

              10-1月-17

日期操作:

ADD_MONTHS(date,i):返回指定日期基础上增加i个月份后的时间;i可以是任何正数,若为小数那么只取整数部分,若为负数,则相当于原日期基础上减去月份

select ADD_MONTHS(sysdate,3) from dual;

                     10-4月-17

NEXT_DAY(DATE,CHAR):指定日期的下一char是哪一天

select NEXT_DAY(sysdate,‘星期一’) from dual;

LAST_DAY(date):指定日期本月的最后一天是哪一天

select LAST_DAY(sysdate) friom dual;

          31-1月-17

MONTH_BETWEEN(date1,date2):表示两个日期之间的月份

select MONTHs_BETWEEN(sysdate,'20170322') from dual;

EXTRACT(date FROM datetime):返回datetime的date部分

select EXTRACT(year FROM sysdate) from dual;

                          2017

select EXTRACT(month FROM sysdate) from dual;

                          1

select EXTRACT(day FROM sysdate) from dual;

                          10 

转换函数

转换函数:日期--字符:to_char(需要转换的日期,转换之后的格式:默认格式:DD-MON-RR,转换后:YY YYYY YEAR;MM MONTH;DD DAY;HH24  HH12;MI SS;日期的语言)

SELECT  TO_CHAR(SYSDATE ,'YYYY-MM-DD  HH24:MI:SS') FROM DUAL;

              字符--日期:TO_DATE(字符串,格式)

select to_date(’21050522‘,‘yyyy-mm-dd’) from dual;

              数字--字符

select to_char (‘12345.678','$99.999.999') from dual;

                      $12,345.678

select to_char (’12345.678','S99.999.999') from dual;

                      +12,345.678

              字符--数字:to_numer(字符,格式)

select to_number ('¥1.000',‘$9999') from dual;

                         1000

在查询语句中使用函数:

根据员工的身份证号码查处员工生日:

select substr(idcard,7,8)shengri from emp;

select replace(no,'01','信息技术')  from   dept;

select mod(age,10) from emp;

select extract(yaer from regdate) from users;

select * from usrs where extract(month  from regdate)  = '5';

rank () OVER (PARTITION BY 列名 ORDER BY 列名排序)使用分区方式获取每门课程的最高分 SELECT * FROM (SELECT scoreid, studentid, coursename, TOTALEXAMSCORE, rank () OVER (PARTITION BY coursename ORDER BY TOTALEXAMSCORE DESC)orderbynum FROM cj_scorecourse a, cj_coursescore b WHERE a.scorecourseid = b.scorecourseid and studentID = '62000DA50FC14C7FE040007F01002A63') WHERE orderbynum < 2

 rank()over(order by 列名排序)的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4

dense_rank()over(order by 列名排序)的结果是连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果如:1 1 1 2

select *
(select name,rank() over(partition by class order by score desc ) seq,class ,score
from t

where seq<=3

select 
rank() over(partition by a.class order by b.score desc ) seq,a.class ,b.score
 from student a
inner join score b
on a.id=b.id where seq<=2
原文地址:https://www.cnblogs.com/shanshanliu/p/6269064.html