SQL函数
主要有两种:单行函数、多行函数(分组函数、聚合函数)
一、单行函数
只对一行进行变换,每行返回一个结果。可以转换数据类型,可以嵌套参数可以是一列或一个值(对查询结果的每一行记录都有效,会影响每一行记录)。
二、多行函数(分组函数、聚合函数)
多行函数,每次对一组记录进行处理。然后对于这一组记录只返回一个结果。
dual
dual为了补全sql语句使用,但在MySQL中是无法查询出该表的(Qracle可以),在MySQL中dual是一个保留字。
select * from dual;
直接查询其内容会报错
而在Oracle中它是一张虚拟表,不能保存任何数据,只有一个字段(列),一行记录。当我们不希望从任何表中读取数据,就可以使用DUAL表。
单行函数详解
分类:
字符、数值、日期、控制、其他
1、字符函数
1)大小写转换函数
upper(str) 将str字符串转成全大写
select upper('hAHa') from dual;
lower(str) 将str字符串转成全小写
select lower('hAHa') from dual;
2)字符截取函数
SUBSTRING(str,n,len):获取子串函数
str:被截取的字符串
n:开始截取的位置 (以1位开始)
len:截取字符的个数
将str字符串从n位置起,截取len个字符
结果:字符类型
select substr('0123456', 3, 3) from dual;
查询emp表中,员工姓名前三个字母
select substr(ename,1,3) from emp;
3)字符查找函数
instr(str,str1):在str中寻找str1字符串,返回str1在str中的位置(第一个子字符串)
如果没找到,返回0
如果找到了,返回对应的位置(数值型)
select instr('I LIKE GIRL','I') from dual;
4)字符拼接函数
concat(str1,str2):将str1和str2拼接成一个字符串多个拼接
select concat('haha','hehe','xixi') from dual;
CONCAT_WS(x,s1,s2,…):字符串连接, x是其它参数的分隔符;
select CONCAT_WS('*','haha','hehe','xixi') from dual;
5)字符替换函数
replace(str1,str2,str3):在str1字符串中,使用str3来替换全部str2
select replace('ABCDECD','CD','HAHA') from dual;
6)字符串的长度函数
length(str):返回str字符串的字符个数
select length('abcde'), length('haha'),length('哈哈') from dual;
注意:如果想使中文和英文一样对待,可以使用char_length()。
select char_length('哈哈') from dual;
7)字符串补齐函数
lpad(str1,n1,str2)
rpad(str1,n1,str2)
lpad:将str1字符串使用str2在其左侧补充到n1个长度
rpad:将str1字符串使用str2在其右侧补充到n1个长度
select lpad('abc',6, '*'), rpad('abc',6, '*') from dual;
8)去除前后字符函数
trim函数能去掉字符的前后空格,或者去掉字符串中首尾特定字符(使用该方式需要使用到FROM关键字)
SELECT TRIM('H' FROM 'HelloHWorldHH') FROM dual;
SELECT TRIM(' HelloHWorldHH ') FROM dual;
2、数值函数
1)ROUND(n1,n2)
ROUND(x,y):返回保留小数点后面y位,四舍五入的整数;
将n1四舍五入,精确到小数点后n2位
select round(3.1415, 3), round(3.14, 0), round(6.14, -1) from dual;
2)TRUNCATE(x,y)
返回被舍弃的小数点后y位的数字x;
将n1数字舍弃,精确到小数点后n2位
select truncate(3.1415, 3), truncate(3.14, 0),truncate(6.14, -1) from dual;
3) MOD(n1,n2)
求n1除以n2后得到的余数——取余
select mod(5,3),mod(5,-3),mod(-5,3),mod(-5,-3) from dual;
3、日期函数
1)now()、sysdate()
now():获取的是MySQL服务器自身的时间戳
sysdate():获取的是系统的时间戳。
select sysdate() from dual;
select now() from dual;
注意:
当进行主从同步的时候,主库执行完一条语句,会把自己的数据库时间戳同步到备库上。这时候备库执行相同的语句会获得相同的时间戳,要是用sysdate(),就算数据库时间戳同步了也没用,因为取的是系统时间戳。所以,在实际开发应用中,尽量使用MySQL的 now()函数。
SELECT NOW(),CURDATE(),CURTIME() from dual;
2)TIMEDIFF、DATEDIFF
TIMEDIFF(expr1, expr2):返回两个时间相减相差的时间数;
DATEDIFF(expr1, expr2):返回两个日期相减相差的天数;
SELECT TIMEDIFF('2018-05-21 14:51:43','2018-05-19 12:54:43');
假设emp表中所有员工至今都未辞职,计算他们现在的司龄
select DATEDIFF(CURDATE(), hiredate)/365 from emp;
select year(CURDATE()) - year(hiredate) from emp;
注意:
1、计算员工的司龄,可以有精确到小数点后两位(不用四舍五入)方式,也可以采用四舍五入的方式。
2、利用时间的差值函数可以用于计算年龄,司龄,工龄等这些类似的随着时间流逝会改变的数据。
3)DATE_ADD、DATE_SUB
DATE_ADD(date,INTERVAL expr type):日期加上一个时间间隔值;
DATE_SUB(date,INTERVAL expr type):日期减去一个时间间隔值;
date:基础日期时间
expr:追加数值
type:追加的日期时间数值的日期时间类型
注意:为date时间,追加d1个月 结果还是一个日期
设公司试用期为6个月,计算emp中员工,计算转正日期
select DATE_ADD(hiredate,INTERVAL 6 month) from emp;
查询工龄大于或等于35年的员工信息。
SELECT * FROM emp e
WHERE e.hiredate <= DATE_SUB(SYSDATE(),INTERVAL 35 YEAR);
4)last_day
last_day(date1)
date1:所在月份最后一天的日期 (结果类型:日期)
select ename, hiredate, last_day(hiredate) from emp;
5)两个日期之间的天数
两个日期之间直接做减法,能够获得两个日期之间天数的差
注意:不要减反,否则结果为负数
select now(), last_day(now()), last_day(now()) - now() as A,
now() -last_day(now()) as B
from dual;
7)truncate
TRUNCATE(x,y):返回被舍弃的小数点后y位的数字x;
查询81年入职的员工姓名,入职日期按月截断的日期。
SELECT empno, hiredate,
truncate(hiredate, 'MONTH')
FROM emp
WHERE SUBSTR(hiredate,3,2)='81';
8) extract
EXTRACT(unit FROM date):从日期中抽取出某个单独的部分或组合
查询部门中所有员工入职月份
SELECT ename, hiredate, extract(month from hiredate) MONTH
FROM emp;
9)日期和时间格式化的函数
DATE_FORMAT(date,format)
TIME_FORMAT(time,format)
根据format 指定的格式显示日期或者时间值。
date 参数是合法的日期
format 规定日期/时间的输出格式
select date_format(now(), '%Y-%m-%d %H:%i;%s'),
time_format(curtime(), '%H:%i:%s')
from dual;
4、流程控制语句
5)case
SELECT CASE WHEN 1>0
THEN 'true'
ELSE 'false' END
from dual;
SELECT CASE 2
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'more' END
from dual;
2)if
SELECT IF(1<2,'yes ','no');
3)ifnull
IFNULL(expr1,expr2)
假如expr1 不为NULL ,则IFNULL() 的返回值为expr1 ; 否则其返回值为expr2 。
IFNULL() 的返回值是数字或是字符串,具体情况取决于其所使用的语境。
select empno, comm, ifnull(comm,0) from emp;