MySQL 学习笔记(6)—— SQL函数

文章目录

  • 6. MySQL 函数
    • 6.1 数学函数
    • 6.2 字符串函数
    • 6.3 日期和时间函数
    • 6.4 条件判断函数
    • 6.5 窗口函数
    • 6.6 其他函数

6. MySQL 函数

6.1 数学函数

  • ABS(x):绝对值函数
  • PI()返回圆周率的函数
  • SQRT(x)平方根函数
  • MOD(x,y)求余函数
  • CEIL(x)、CEILING(x) 返回不小于x的最小整数值,返回值转化为一个BIGINT
  • FLOOR(x)返回不大于x的最大整数值,返回值转化为一个BIGINT。
    在这里插入图片描述
  • RAND() RAND(x)返回一个随机浮点值v,范围在0到1之间(0 ≤ v ≤ 1.0)。若已指定一个整数参数x,则它被用作种子值,用来产生重复序列
    在这里插入图片描述

-ROUND(x) 返回最接近于参数x的整数,对x值进行四舍五入
-ROUND(x,y) 返回最接近于参数x的数,其值保留到小数点后面y位,若y为负值,则将保留x值到小数点左边y位。

  • TRUNCATE(x,y) 返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小数部分。若y设为负数,则截去(归零)x小数点左起第y位开始后面所有低位的值。
select round(-1.14) ,round(1.14),round(1.38,1), round(222.34,-1),truncate(1.99,1),truncate(11.99,-1);

在这里插入图片描述

  • SIGN(x)返回参数的符号,x的值为负、零或正时返回结果依次为-1、0或1。
  • POW(x,y)或者POWER(x,y)函数返回x的y次乘方的结果值
  • EXP(x)返回e的x乘方后的值
  • LOG(x)返回x的自然对数,x相对于基数e的对数。
  • LOG10(x)返回x的基数为10的对数。
  • RADIANS(x)将参数x由角度转化为弧度
  • DEGREES(x)将参数x由弧度转化为角度
  • SIN(x)返回x正弦,其中x为弧度值
  • ASIN(x)返回x的反正弦,若x不在-1到1的范围之内,则返回NULL。

6.2 字符串函数

  • CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。

  • LENGTH(str)返回值为字符串的字节长度,使用utf8编码字符集时,一个汉字是3字节,一个数字或字母算1字节
    在这里插入图片描述

  • CONCAT(s1,s2,…)返回结果为连接参数产生的字符串,或许有一个或多个参数。如有任何一个参数为NULL,则返回值为NULL。如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。

  • CONCAT_WS代表CONCAT With Separator,是CONCAT()的特殊形式。第一个参数x是其他参数的分隔符,分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。

select concat('My SQL','8.0'),concat('My SQL','8.0',null),concat_ws('-','1','2','3')

在这里插入图片描述

  • INSERT(s1,x,len,s2)返回字符串s1,其子字符串起始于x位置和被字符串s2取代的len字符。如果x超过字符串长度,则返回值为原始字符串。假如len的长度大于其他字符串的长度,则从位置x开始替换。若任何一个参数为NULL,则返回值为NULL。
select insert('Quest',2,4,'what') as co11,insert('Quest',-1,4,'what') as co12,insert('Quest',3,100,'what') as co13;

MySQL 学习笔记(6)—— SQL函数_第1张图片

  • lower(str) 或者LCASE (str)可以将字符串str中的字母字符全部转换成小写字母。
  • UPPER(str)或者UCASE(str)可以将字符串str中的字母字符全部转换成大写字母
select lower('BEAUTIFUL'),lcase('Well'),upper('hello'),ucase('Well');

在这里插入图片描述

  • LEFT(s,n)返回字符串s开始的最左边n个字符
  • RIGHT(s,n)返回字符串str最右边的n个字符
select left('football',4), right('foorball',5)

在这里插入图片描述

  • LTRIM(s)返回字符串s,字符串左侧空格字符被删除。
  • RTRIM(s)返回字符串s,字符串右侧空格字符被删除。
  • TRIM(s)删除字符串s两侧的空格。
  • TRIM(s1 FROM s)删除字符串s中两端所有的子字符串s1。s1为可选项,在未指定情况下,删除空格
select trim('df' from 'dfghdfdfuuuudf');

在这里插入图片描述

  • REPEAT(s,n)返回一个由重复的字符串s组成的字符串,字符串s的数目等于n。若n<=0,则返回一个空字符串。若s或n为NULL,则返回NULL。
  • SPACE(n)返回一个由n个空格组成的字符串
  • REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1。
select repeat('hi',3),concat('(',sapce(6),')'),replace('xxuu','x','y');

在这里插入图片描述

  • STRCMP(s1,s2):若所有的字符串均相同,则返回0;若根据当前分类次序,第一个参数小于第二个,则返回-1;其他情况返回1。
select strcmp('jj','jj1'),strcmp('jj1','jj'),strcmp('jj','jj');

在这里插入图片描述

  • SUBSTRING(s,n,len)带有len参数的格式,从字符串s返回一个长度与len字符相同的子字符串,起始于位置n。也可能对n使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的n字符,即倒数第n个字符,而不是字符串的开头位置
  • MID(s,n,len)与SUBSTRING(s,n,len)的作用相同

如果对len使用的是一个小于1的值,则结果始终为空字符串。

select substring('breakfast',5) as co11,substring('breakfast',5,3) as co12,substring('breakfast',-3) as co13,substring('breakfast',-5,3) as co14;
select mid('breakfast',5) as co11,mid('breakfast',5,3) as co12,mid('breakfast',-3) as co13,mid('breakfast',-5,3) as co14;

在这里插入图片描述
在这里插入图片描述

  • LOCATE(str1,str)POSITION(str1 IN str)INSTR(str, str1)3个函数的作用相同,返回子字符串str1在字符串str中的开始位置。
select locate('ball','football'),position('ball'in'football'),instr('ball','football');

在这里插入图片描述

  • REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符串顺序相反

ELT(N,字符串1,字符串2,字符串3,...,字符串N):返回指定位置的字符串的函数。若N = 1,则返回值为字符串1;若N=2,则返回值为字符串2;以此类推;若N小于1或大于参数的数目,则返回值为NULL。

select elt(3,'a','b','c'),elt(3,'a','b');

在这里插入图片描述
-FIELD(s,s1,s2,…,sn)返回字符串s在列表s1,s2,…,sn中第一次出现的位置,在找不到s的情况下,返回值为0。如果s为NULL,则返回值为0,原因是NULL不能同任何值进行同等比较。

select field('a','c','d','a','g','a');field('a','c','d');

在这里插入图片描述

  • FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗号‘,’分开的字符串组成的列表。如果s1不在s2或s2为空字符串,则返回值为0。如果任意一个参数为NULL,则返回值为NULL。这个函数在第一个参数包含一个逗号‘,’时将无法正常运行
select find_in_set('a','c,b,v,a,e');

在这里插入图片描述

  • MAKE_SET(x,s1,s2,…,sn)函数按x的二进制数从s1,s2,…,sn中选取字符串。例如5的二进制是0101,这个二进制从右往左的第1位和第3位是1,所以选取s1和s3。s1,s2,…,sn中的NULL值不会被添加到结果中。
select make_set(1,'a','b','c') as co11,make_set(1|4,'a','b','c') as co12,make_set(1|4,'a','b',null,'c') as co13,make_set(0,'a','b','c') as co14;

在这里插入图片描述

6.3 日期和时间函数

  • CURDATE()CURRENT_DATE()函数的作用相同,将当前日期按照‘YYYY-MM-DD’或YYYYMMDD格式的值返回,具体格式根据函数在字符串或是数字语境中而定。
select curdate(),current_date(),curdate()+0;
select curtime(),current_time(),curtime()+0;

在这里插入图片描述
在这里插入图片描述

  • CURRENT_TIMESTAMP()LOCALTIME()NOW()SYSDATE()4个函数的作用相同,均返回当前日期和时间值,格式为‘YYYY-MM-DDHH:MM:SS’或YYYYMMDDHHMMSS,具体格式根据函数在字符串或数字语境中而定。
select current_timestamp(),localtime(),now(),sysdate();

在这里插入图片描述

  • UNIX_TIMESTAMP(date)若无参数调用,则返回一个UNIX时间戳(‘1970-01-0100:00:00’GMT之后的秒数)作为无符号整数。
select unix_timestamp(),unix_timestamp(now()),now();

在这里插入图片描述

  • FROM_UNIXTIME(date)函数把UNIX时间戳转换为普通格式的时间,与UNIX_TIMESTAMP (date)函数互为反函数
select from_unixtime('1632438991');

在这里插入图片描述

  • UTC_DATE()函数返回当前UTC(世界标准时间)日期值,其格式为‘YYYY-MM-DD’或YYYYMMDD,具体格式取决于函数是否用在字符串或数字语境中。
  • UTC_TIME()返回当前UTC时间值,其格式为‘HH:MM:SS’或HHMMSS,具体格式取决于函数是否用在字符串或数字语境中。
select utc_date(),utc_date()+0,utc_time(),utc_time()+0;

在这里插入图片描述
MONTH(date)函数返回date对应的月份,范围值为1~12。
MONTHNAME(date)函数返回日期date对应月份的英文全名。
DAYNAME(d)函数返回d对应的工作日的英文名称,例如Sunday、Monday等
DAYOFWEEK(d)函数返回d对应的一周中的索引(位置,1表示周日,2表示周一,…,7表示周六)。
WEEKDAY(d)返回d对应的工作日索引:0表示周一,1表示周二,…,6表示周日。
WEEK(d)计算日期d是一年中的第几周。WEEK()的双参数形式允许指定该星期是否起始于周日或周一,以及返回值的范围是否为053或153。若Mode参数被省略,则使用default_week_format系统自变量的值
MySQL 学习笔记(6)—— SQL函数_第2张图片
WEEKOFYEAR(d)计算某天位于一年中的第几周,范围是1~53,相当于WEEK(d,3)。
DAYOFYEAR(d)函数返回d是一年中的第几天,范围是1~366。
DAYOFMONTH(d)函数返回d是一个月中的第几天,范围是1~31
YEAR(date)返回date对应的年份,范围是1970~2069
QUARTER(date)返回date对应的一年中的季度值,范围是1~4。
MINUTE(time)返回time对应的分钟数,范围是0~59
SECOND(time)返回time对应的秒数,范围是0~59
EXTRACT(type FROM date)函数所使用的时间间隔类型说明符与DATE_ADD()或DATE_SUB()的相同,但它从日期中提取一部分,而不是执行日期运算。
TIME_TO_SEC(time)返回已转化为秒的time参数。转换公式为:小时3600+分钟60+秒。
SEC_TO_TIME(seconds)返回被转化为小时、分钟和秒数的seconds参数值,其格式为‘HH:MM:SS’或HHMMSS,具体格式根据该函数是否用在字符串或数字语境中而定。
DATE_ADD(date,INTERVAL expr type)DATE_SUB(date,INTERVAL expr type)中,date是一个DATETIME或DATE值,用来指定起始时间。expr是一个表达式,用来指定从起始日期添加或减去的时间间隔值。对于负值的时间间隔,expr可以以一个负号‘-’开头。type为关键词,指示了表达式被解释的方式。
DATE_ADD(date,INTERVAL expr type)ADDDATE(date,INTERVAL expr type)两个函数的作用相同,执行日期的加运算。
DATE_SUB(date,INTERVAL expr type)或者SUBDATE(date,INTERVAL expr type)两个函数的作用相同,执行日期的减运算。
ADDTIME(date,expr)函数将expr值添加到date,并返回修改后的值,date是一个日期或者日期时间表达式,而expr是一个时间表达式。
SUBTIME(date,expr)函数将date减去expr值,并返回修改后的值。其中,date是一个日期或者日期时间表达式,而expr是一个时间表达式
DATEDIFF(date1,date2)返回起始时间date1和结束时间date2之间的天数。date1和date2为日期或日期时间表达式。计算中只用到这些值的日期部分。
MySQL 学习笔记(6)—— SQL函数_第3张图片
DATE_FORMAT(date,format)根据format指定的格式显示date值。
MySQL 学习笔记(6)—— SQL函数_第4张图片
TIME_FORMAT(time,format)根据表达式format的要求显示时间time。表达式format指定了显示的格式。因为TIME_FORMAT(time,format)只处理时间,所以format只使用时间格式。
GET_FORMAT(val_type, format_type)返回日期时间字符串的显示格式,val_type表示日期数据类型,包括DATE、DATETIME和TIME;format_type表示格式化显示类型,包括EUR、INTERVAL、ISO、JIS、USA。
MySQL 学习笔记(6)—— SQL函数_第5张图片

6.4 条件判断函数

  • IF(expr, v1, v2):如果表达式expr是TRUE(expr<> 0 and expr <> NULL),则返回值为v1;否则返回值为v2。IF()的返回值为数字值或字符串值,具体情况视其所在语境而定。
    MySQL 学习笔记(6)—— SQL函数_第6张图片

  • IFNULL(v1,v2):假如v1不为NULL,则IFNULL()的返回值为v1;否则其返回值为v2。IFNULL()的返回值是数字或者字符串,具体情况取决于其所在的语境。
    MySQL 学习笔记(6)—— SQL函数_第7张图片

  • CASE expr WHEN v1 THEN r1 [WHEN v2THEN r2]…[ELSE rn+1] END:如果expr值等于某个vn,则返回对应位置THEN后面的结果;如果与所有值都不相等,则返回ELSE后面的rn+1
    MySQL 学习笔记(6)—— SQL函数_第8张图片

  • CASE WHEN v1 THEN r1 [WHEN v2 THENr2]… ELSE rn+1] END:某个vn值为TRUE时,返回对应位置THEN后面的结果;如果所有值都不为TRUE,则返回ELSE后的rn+1
    MySQL 学习笔记(6)—— SQL函数_第9张图片

6.5 窗口函数

个窗口函数,用它可以实现很多新的查询方式。窗口函数类似于SUM()、COUNT()那样的集合函数,但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。也就是说,窗口函数是不需要GROUP BY的。
【例: 通过窗口函数实现排名效果】

# 创建公司部门表branch,包含部门的名称和部门人数两个字段
create table branch
(
	name char(255) not null,
	brcount int(11) not null
);
insert into  branch(name,brcount) 
	values ('b1',1),('b2',5),('b3',3),('b4',9),('b5',8);
# 查询数据表branch中的数据
select*from branch;
# 对公司部门人数按从小到大进行排名,可以利用窗口函数来实现
# 这里创建了名称为w1的窗口函数,规定对brcount字段进行排序,然后在SELECT子句中对窗口函数w1执行rank()方法,将结果输出为rank字段。
select*,rank() over w1 as 'rank' from branch
	windows w1 as (order by brcount);
# 需要注意,这里的window w1是可选的。例如,在每一行中加入员工的总数,可以这样操作
select *,sum(brcount) over() as total_count from branch;
# 可以一次性查询出每个部门的员工人数占总人数的百分比,查询结果如下
select *,(brcount)/(sum(brcount) over()) as rate from branch;

MySQL 学习笔记(6)—— SQL函数_第10张图片
MySQL 学习笔记(6)—— SQL函数_第11张图片
MySQL 学习笔记(6)—— SQL函数_第12张图片
MySQL 学习笔记(6)—— SQL函数_第13张图片

6.6 其他函数

  • LAST_INSERT_ID()函数返回最后生成的AUTO_INCREMENT值。
  • MD5(str)为字符串算出一个MD5 128比特校验和。该值以32位十六进制数字的二进制字符串形式返回,若参数为NULL,则会返回NULL。
  • SHA(str)从原明文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL。SHA加密算法比MD5更加安全。
  • SHA2(str, hash_length)使用hash_length作为长度,加密str。hash_length支持的值为224、256、384、512和0。其中,0等同于256
  • FORMAT(x,n)将数字x格式化,并以四舍五入的方式保留小数点后n位,结果以字符串的形式返回。若n为0,则返回结果函数不含小数部分
  • CONV(N, from_base, to_base)函数进行不同进制数间的转换。返回值为数值N的字符串表示,由from_base进制转化为to_base进制。如有任意一个参数为NULL,则返回值为NULL。自变量N被理解为一个整数,但是可以被指定为一个整数或字符串。最小基数为2,最大基数为36
  • INET_ATON(expr)给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8bit地址。
  • INET_NTOA(expr)给定一个数字网络地址(4或8bit),返回作为字符串的该地址的点地址表示
  • GET_LOCK(str,timeout)设法使用字符串str给定的名字得到一个锁,超时为timeout秒。若成功得到锁,则返回1;若操作超时,则返回0;若发生错误,则返回NULL。假如有一个用GET_LOCK()得到的锁,当执行RELEASE_LOCK()或连接断开(正常或非正常)时,这个锁就会解除。
  • RELEASE_LOCK(str)解开被GET_LOCK()获取的、用字符串str所命名的锁。若锁被解开,则返回1;若该线程尚未创建锁,则返回0(此时锁没有被解开);若命名的锁不存在,则返回NULL。若该锁从未被GET_LOCK()的调用获取,或锁已经被提前解开,则该锁不存
  • IS_FREE_LOCK(str)检查名为str的锁是否可以使用(换言之,没有被封锁)。若锁可以使用,则返回1(没有人在用这个锁);若这个锁正在被使用,则返回0;出现错误,则返回NULL(诸如不正确的参数)。
  • IS_USED_LOCK(str)检查名为str的锁是否正在被使用(换言之,被封锁)。若被封锁,则返回使用该锁的客户端的连接标识符(connection ID);否则,返回NULL。
    MySQL 学习笔记(6)—— SQL函数_第14张图片
  • BENCHMARK(count,expr)函数重复count次执行表达式expr。它可以用于计算MySQL处理表达式的速度。结果值通常为0(0只是表示处理过程很快,并不是没有花费时间)。另一个作用是它可以在MySQL客户端内部报告语句执行的时间。
  • CONVERT(... USING ...):带有USING的CONVERT()函数被用来在不同的字符集之间转化数据。
  • CAST(x, AS type)CONVERT(x, type)函数将一个类型的值转换为另一个类型的值,可转换的type有BINARY、CHAR(n)、DATE、TIME、DATETIME、DECIMAL、SIGNED、UNSIGNED。

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