点击上方“罗晓胜”,马上关注,您的支持对我帮助很大
上期文章
从0到1学数据库:数据库基础
从0到1学数据库:Select查询语句
/ 前言 /
为什么要有函数,不如问函数是什么,是干嘛的! 函数是为了方便我们的各种操作而产生的,就是一个设计好的方程式,给出参数,它就给你对应的结果
/ 正文 /
1.字符函数
2.数值函数
3.日期函数
4.转换函数
5.流程函数
6.系统函数
7.函数嵌套
• 语法: 函数名[(参数1,参数2,…)]
• 其中的参数可以是以下之一:
– 变量
– 列名
– 表达式
• 单行函数还有以下的一些特征:
– 单行函数对单行操作
– 每行返回一个结果
– 有可能返回值与原参数数据类型不一致(转换函数)
– 单行函数可以写在SELECT、WHERE、ORDER BY子句中
– 有些函数没有参数,有些函数包括一个或多个参数
– 函数可以嵌套
字符函数:主要指参数类型是字符型,不同函数返回值可能是 字符型或数字类型。
字符函数
大小写转换:
• LOWER(列名|表达式): 将字符转换成 小写 • UPPER(列名|表达式): 将字符转换成 大写
字符处理:
• LENGTH:取字符长度 格式:LENGTH(column | expression)
• CONCAT:连接两个值,等同于|| 格式:CONCAT(column1|expression1,column2|expression2)
• SUBSTR:截取,返回第一个参数中从n1字符开始长度为n2的子串,如果n1是负值,表示 从后向前数的abs(n1)位,如果n2省略,取n1之后的所有字符 格式:SUBSTR(column | expression,n1[,n2])
• INSTR:定位,返回s1中,子串s2从n1开始,第n2次出现的位置。n1,n2默认值为1 格式:INSTR(s1,s2,[,n1],[n2])
• TRIM:去除空格,也可去除字符串头部或尾部(头尾)的字符 格式:TRIM(leading | trailing | both trim_character From trim_source)
• LPAD:左填充,返回s1被s2从左面填充到n1长度。格式:LPAD(s1,n1,s2)
• RPAD:右填充,返回s1被s2从右面填充到n1长度。格式:RPAD(s1,n1,s2) • REPLACE:替换,把s1中的s2用s3替换。格式:REPLACE(s1,s2,s3)
字符大小写操作函数
• LOWER:示例:LOWER('SQL Course') 结果:sql course
• UPPER:示例:UPPER('SQL Course') 结果:SQL COURSE
字符处理函数
函数 | 结果 |
---|---|
LENGTH('String') | 6 |
CONCAT('Good', 'String') | GoodString |
SUBSTR('String',1,3) | Str |
INSTR('String', 'r') | 3 |
TRIM('S' FROM 'SSMITH') | MITH |
LPAD(sal,10,'*') | ******5000 |
RPAD(sal,10,'*') | 5000****** |
REPLACE('abc','b','d') | adc |
LEFT(str,len):返回字符串str的最左面len个字符。
select LEFT('foobarbar', 5);
RIGHT(str,len):返回字符串str的最右面len个字符。
select RIGHT('foobarbar', 4);
LOCATE(substr,str):返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.
select LOCATE('bar', 'foobarbar'); select LOCATE('xbar', 'foobar');
LTRIM(str):返回删除了其前置空格字符的字符串str。
select LTRIM(' barbar');
RTRIM(str):返回删除了其拖后空格字符的字符串str。
select RTRIM(‘barbar ’);
REPEAT(str,count):返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL。
select REPEAT('MySQL', 3);
REVERSE(str):返回颠倒字符顺序的字符串str。
select REVERSE('abc');
INSERT(str,pos,len,newstr):返回字符串str,在位置pos起始的子串且len个字符长的子串由字符串newstr代替。
select INSERT(‘whatareyou', 5, 3, ‘is');
查询示例:
SELECT id, CONCAT(name, age) NAME, LENGTH (name) length FROM student
• ROUND(列名|表达式, n):四舍五入,将列或表达式所表示的数值四舍五 入到小数点后的第n位。
• CEIL(列名|表达式, n):向上取整
• Floor(列名|表达式, n):向下取整
• truncate(列名|表达式,n):截断,将列或表达式所表示的数值截取到小 数点后的第n位。
• MOD(m,n):取余,取m除以n后得到的余数。
示例:SELECT ROUND(65.654,2),CEIL(65.654),Floor(65.654),truncate(65.654,1),mod(65.654,2) ;
结果-- 65.65 66 65 65.6 1.654
常用的日期运算如下:
• now():返回系统日期+时间
• sysdate():返回系统日期+时间,sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值;
• current_timestamp, current_timestamp():获得当前时间戳函数 • curdate():返回系统当前日期,不返回时间
• curtime():返回当前系统中的时间,不返回日期
MySQL 日期转换函数、时间转换函数
• str_to_date 将日期格式的字符转换成指定格式的日期
• date_format(date,format) 日期转换字符串
• time_format(time,format) 日期转换字符串
示例:
date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') -- 20080808222301
select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30
(日期、天数)转换函数
to_days(date):日期转换天数
time_to_sec(time):时间转换秒数
sec_to_time(seconds):秒数转换时间
示例
select to_days('2008-08-08'); -- 733627
select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'
拼凑日期、时间函数
makdedate(year,dayofyear):拼凑日期
maketime(hour,minute,second):拼凑时间
示例
select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
select maketime(12,15,30); -- '12:15:30'
MySQL 日期时间计算函数
date_add():日期增加一个时间间隔 示例
set @dt = now();
select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);
select date_add(@dt, interval -1 day); -- sub 1 day
select date_add(@dt, interval '01:15:30' hour_second);
结果:2008-08-09 13:28:03
select date_add(@dt, interval '1 01:15:30' day_second);
结果:2008-08-10 13:28:03
date_sub():为日期减去一个时间间隔
select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
结果:1997-12-30 22:58:59
datediff(date1,date2):两个日期相减 date1 - date2,返回天数。timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值:
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7
select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08
注意:timediff(time1,time2) 函数的两个参数类型必须相同。
时间戳(timestamp)转换、增、减函数
timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr)
timestampdiff(unit,datetime_expr1,datetime_expr2)
select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01
select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00
MySQL timestampadd() 函数类似于 date_add()。
select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12
select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
Cast(字段名 as 转换的类型 ),其中类型可以为:
CHAR[(N)] 字符型
DATE 日期型
DATETIME 日期和时间型
DECIMAL float型
SIGNED int
TIME 时间型
示例
cast(123 AS CHAR(3)) //整数转字符串
cast( '123 ' as SIGNED INTEGER) //字符串转整数
select cast(11 as unsigned int) /*整型*/
select cast(11 as decimal(10,2)) /*浮点型*/
CASE value WHEN [compare-value]
THEN result [WHEN [compare-value] THEN result ...] [ELSE result]
END
CASE WHEN [condition]
THEN result [WHEN [condition] THEN result ...] [ELSE result]
END
示例:
SELECT CASE 11 WHEN 1
THEN 'one'
WHEN 2
THEN 'two' ELSE 'more' END;
SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。
IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。示例:
SELECT IF(1>2,2,3);
SELECT IF(1<2,'yes ','no');
SELECT IF(STRCMP('test','test1'),'no','yes');
STRCMP(expr1,expr2) 如果字符串相同,STRCMP()返回0,如果第一参数根据当前的排序次序小于第二个,返回-1,否则返回1。
Strcmp(str1,str2):如果str1>str2返回1,str1=str2反回0,str1 示例: 获取MySQL版本号、连接数、数据库名的函数 VERSION()函数返回数据库的版本号; CONNECTION_ID()函数返回服务器的连接数,也就是到现在为止MySQL服务的连接次数; DATABASE()和SCHEMA()返回当前数据库名。 USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()和CURRENT_USER这几个函数可以返回当前用户的名称。 CHARSET(str)函数返回字符串str的字符集,一般情况这个字符集就是系统的默认字符集; COLLATION(str)函数返回字符串str的字符排列方式。 LAST_INSERT_ID()函数返回最后生成的AUTO_INCREMENT值。 加密函数PASSWORD(str) PASSWORD(str)函数可以对字符串str进行加密。一般情况下,PASSWORD(str)函数主要是用来给用户的密码加密的。下面使用PASSWORD(str)函数为字符串“abcd”加密。 加密函数MD5(str) MD5(str)函数可以对字符串str进行加密。MD5(str)函数主要对普通的数据进行加密。下面使用MD5(str)函数为字符串“abcd”加密。 加密函数ENCODE(str,pswd_str) ENCODE(str,pswd_str)函数可以使用字符串pswd_str来加密字符串str。加密的结果是一个二进制数,必须使用BLOB类型的字段来保存它。 解密函数 DECODE(crypt_str,pswd_str)函数可以使用字符串pswd_str来为crypt_str解密。crypt_str是通过ENCODE(str,pswd_str)加密后的二进制数据。字符串pswd_str应该与加密时的字符串pswd_str是相同的。下面使用DECODE(crypt_str,pswd_str)为ENCODE(str,pswd_str)加密的数据解密。 格式化函数FORMAT(x,n) FORMAT(x,n)函数可以将数字x进行格式化,将x保留到小数点后n位。这个过程需要进行四舍五入。 ASCII(s)返回字符串s的第一个字符的ASCII码; BIN(x)返回x的二进制编码; HEX(x)返回x的十六进制编码; OCT(x)返回x的八进制编码; CONV(x,f1,f2)将x从f1进制数变成f2进制数。 IP地址与数字相互转换的函数 INET_ATON(IP)函数可以将IP地址转换为数字表示; INET_ATON(IP)函数中IP值需要加上引号 INET_NTOA(n)函数可以将数字n转换成IP的形式。 加锁函数和解锁函数 GET_LOCT(name,time)函数定义一个名称为nam、持续时间长度为time秒的锁。如果锁定成功,返回1;如果尝试超时,返回0;如果遇到错误,返回NULL。 RELEASE_LOCK(name)函数解除名称为name的锁。如果解锁成功,返回1;如果尝试超时,返回0;如果解锁失败,返回NULL;IS_FREE_LOCK(name)函数判断是否使用名为name的锁。如果使用,返回0;否则,返回1。重复执行指定操作的函数 BENCHMARK(count,expr)函数将表达式expr重复执行count次,然后返回执行时间。该函数可以用来判断MySQL处理表达式的速度。 改变字符集的函数 CONVERT(s USING cs)函数将字符串s的字符集变成cs 注:CAST(x AS type)和CONVERT(x,type)这两个函数将x变成type类型。这两个函数只对BINARY、CHAR、DATE、DATETIME、TIME、SIGNED INTEGER、UNSIGNED INTEGER这些类型起作用。但两种方法只是改变了输出值的数据类型,并没有改变表中字段的类型。 • 单行函数可以嵌套于任何层。 • 嵌套的函数是从最里层向最外层的顺序计算的。 / 总结 / 本文主要讲了Function函数的各种类型和使用方式,常使用这些函数会方便我们的工作,毕竟有句话叫站在巨人的肩膀。 往期推荐: 如何入门做软件开发 为什么我不推荐入行程序员 做全栈开发很难吗 关注我的公众号,学习技术或投稿 长按上图,识别图中二维码即可关注select STRCMP('text', 'text2');
select STRCMP('text2', 'text');
select STRCMP('text', 'text');
系统信息函数
其他函数
函数嵌套