函数分类:数值函数(针对数值类型);字符函数;日期函数;转换函数
函数的作用:方便数据的统计,方便查询处理结果
数值函数
四舍五入:
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
rank() over(partition by a.class order by b.score desc ) seq,a.class ,b.score
from student a
inner join score b
on