有的时候需要经常以 DBA 的身份去处理各种各样的数据来满足公司运营的一些需求,发现这个过程中需要经常不可避免的用到一些函数,比如时间处理、字符串处理等函数,毕竟不是专业干这个的,所以很多时候遇到这些问题都需要去网上查一下 MySQL 相关的一些比较牛逼的函数来使用,索性新建一篇文章做一个函数合集的笔记,以后用到了直接来这里复盘,当然也希望对你们有一些帮助,每个函数我尽量写一些例子来帮助更形象的记忆,技多不压身,写代码的说不定以后转行 DBA 也不是问题哈!
1.COUNT() 函数
该函数是用来统计表中的记录有多少行的一个函数。常用的形式有 COUNT(*)、COUNT(1)、COUNT(列名)、COUNT(DISTINCT 列名) 的形式。关于 COUNT(*) 与 COUNT(1) 其实没什么太大的区别,COUNT(*) 属于自动优化帮你找到索引列进行计数统计,而 COUNT(1) 是主键索引,其中这个「1」代表忽略列,统计行数的意思。至于 COUNT(列名) 就是统计当前列的记录数,是忽略 NULL 这种情况的,COUNT(DISTINCT 列名) 自然就是去重,如果列名是索引的话就会加快查询统计速度。
1 2 3 4 5 6 7 |
SELECT COUNT(*) FROM tb_user; SELECT COUNT(1) FROM tb_user; SELECT COUNT(`cust_id`) FROM tb_user; SELECT COUNT(DISTINCT `cust_id`) FROM tb_user; |
2.SUM() 函数
该函数是用来计算某一列的总和或者计算表达式的结果。如果没有返回结果的话 SUM() 函数会返回 NULL 而不是 0。
- SUM 与 GROUP BY 子句组合时,会计算 GROUP BY 子句中指定的每个分组的总和。
- SUM 与 HAVING 组合使用时,可以使用 SUM 函数根据特定条件过滤结果。
- SUM 与 LIMIT 组合使用,可以只计算前几条限制数据的的计算。但是需要子查询。
- 如果希望 SUM 函数返回 0 而不是 NULL 可以使用 COALESCE 函数。COALESCE函数接受两个参数,如果第一个参数为 NULL,则返回第二个参数,否则返回第一个参数。
1 2 3 4 5 |
SELECT SUM(`price`) FROM t_order WHERE CREATE_DATE between "2019-06-21 00:00:00" AND "2019-06-21 00:10:00"; SELECT SUM(`price`) FROM t_order WHERE CREATE_DATE between "2019-06-21 00:00:00" AND "2019-06-21 01:00:00" GROUP BY SHOP_NO; SELECT SUM(`price`) AS saleSum FROM tb_broadband_order WHERE CREATE_DATE between "2019-06-21 00:00:00" AND "2019-06-21 01:00:00" GROUP BY SHOP_NO HAVING saleSum > 50; SELECT SUM(A.`price`) FROM (SELECT * FROM t_order WHERE CREATE_DATE between "2019-06-21 00:00:00" AND "2019-06-21 00:40:00" LIMIT 10) A; SELECT COALESCE(SUM(A.`total_price`),0) FROM (SELECT * FROM t_order WHERE CREATE_DATE between "2019-06-21 00:00:00" AND "2019-06-21 00:40:00" LIMIT 10) A; |
3.DATEDIFF() 函数
返回两个日期之间的天数。第一参数放比较超前的日期,第二个参数放比较早的日期,否则会返回负数。
1 |
SELECT DATEDIFF("2019-09-23", "2018-08-08"); |
4.DATE_FORMAT() 函数
用于以不同的格式显示日期/时间数据。DATE_FORMAT(date,format),date 就是代表日期,format 就代表要格式化的格式。
格式 | 描述 |
---|---|
%a | 缩写星期名 |
%b | 缩写月名 |
%c | 月,数值 |
%D | 带有英文前缀的月中的天 |
%d | 月的天,数值(00-31) |
%e | 月的天,数值(0-31) |
%f | 微秒 |
%H | 小时 (00-23) |
%h | 小时 (01-12) |
%I | 小时 (01-12) |
%i | 分钟,数值(00-59) |
%j | 年的天 (001-366) |
%k | 小时 (0-23) |
%l | 小时 (1-12) |
%M | 月名 |
%m | 月,数值(00-12) |
%p | AM 或 PM |
%r | 时间,12-小时(hh:mm:ss AM 或 PM) |
%S | 秒(00-59) |
%s | 秒(00-59) |
%T | 时间, 24-小时 (hh:mm:ss) |
%U | 周 (00-53) 星期日是一周的第一天 |
%u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v | 周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W | 星期名 |
%w | 周的天 (0=星期日, 6=星期六) |
%X | 年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x | 年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y | 年,4 位 |
%y | 年,2 位 |
1 |
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %T') |
5.FIND_IN_SET() 函数
用于在逗号分隔的字符串列表中查找指定字符串的位置。FIND_IN_SET(needle,haystack);
其实这个函数可以跟 IN 关键字转换用,实际上它俩基本差不多。只不过 IN 的性能更高,相比于 IN,FIND_IN_SET 表达的是是否包含的子集概念,而 IN 直接代表的就是表中的某个字段的值。第一个参数 needle 是要查找的字符串。第二个参数 haystack 是要搜索的逗号分隔的字符串列表。注意如果 needle 包含逗号,该函数将无法正常工作。
- 如果 needle 在 haystack 中,则返回一个正整数。
- 如果 needle 不在 haystack 中,或者 haystack 是空字符串,则返回零。
- 如果 needle 或 haystack 为 NULL,则函数返回 NULL 值。
1 2 3 4 |
SELECT FIND_IN_SET("glorze","glorze,高老四,mysql"); SELECT FIND_IN_SET("高老四博客","glorze,高老四,mysql"); SELECT FIND_IN_SET("高老四博客",""); SELECT FIND_IN_SET("高老四博客",NULL); |
6.SUBSTRING_INDEX() 函数
SUBSTRING_INDEX(str,delim,count),代表从字符串 str 分隔符 delim 在计数发生前的子字符串。count 为正就是从左向右,否则反之。
1 |
SELECT SUBSTRING_INDEX("www.glorze.com",".",1); |
7.TIMESTAMPDIFF() 函数
MySQL 的 TIMESTAMPDIFF 是用来计算两个日期的差值,一共接收三个参数:
- 第一个参数:差值结果类型,值可以为 YEAR、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND 等类型,分别代表年月周日天时分秒。
- 第二个参数与第三个参数分别代表旧日期与新日期,即计算的是后面的日期减去前面的日期的差值。
1 2 3 4 |
SELECT TIMESTAMPDIFF(YEAR, '2019-08-08', '2020-09-04'); SELECT TIMESTAMPDIFF(DAY, '2019-08-08', '2020-09-04'); SELECT TIMESTAMPDIFF(MONTH, '2019-08-08', '2020-09-04'); SELECT TIMESTAMPDIFF(SECOND, '2020-08-08', '2020-09-04'); |
8.DATE() 函数
DATE(expr),提取日期或日期时间表达式 expr 中的日期部分。
1 2 3 4 5 6 7 |
mysql> SELECT DATE('2022-06-06 17:52:08'); +-----------------------------+ | DATE('2022-06-06 17:52:08') | +-----------------------------+ | 2022-06-06 | +-----------------------------+ 1 row in set (0.01 sec) |
9.STR_TO_DATE(str,format) 函数
STR_TO_DATE(str, format),DATE_FORMAT() 函数的反函数。它需要一个字符串 str 和一个格式字符串格式。STR_TO_DATE() 返回一个 DATETIME 值,如果格式字符串包含日期和时间部分,或如果字符串只包含日期或时间的部分返回日期或时间值。
1 2 3 4 5 6 7 |
mysql> select str_to_date('2022-06-06 18:10:31', '%Y-%d-%m'); +------------------------------------------------+ | str_to_date('2022-06-06 18:10:31', '%Y-%d-%m') | +------------------------------------------------+ | 2022-06-06 | +------------------------------------------------+ 1 row in set, 1 warning (0.01 sec) |
10.待续。
相关文章阅读
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可以加入本站封闭式交流论坛「DownHub」开启新世界的大门,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。