说明:这里的常用函数,是指 《高性能mysql 第三版》 中常出现的函数及我本人在工作中经常使用到的一些函数,关于《高性能mysql 第三版》这本书,我是强烈推荐去读一下的,这里提供网盘下载地址:https://pan.baidu.com/s/1haFdY7c9xb6VNtlfPUaidQ 。
1. 字符串函数
left()
mysql left() 函数返回字符从左边开始计算指定的长度,索引从1开始,接收字符和数字参数。
语法:
LEFT (string, length)
mysql> select left(23433,3);
+---------------+
| left(23433,3) |
+---------------+
| 234 |
+---------------+
1 row in set (0.00 sec)
下面的代码,从dye_production_schedules 这个表中,取出有关字段,并且取出dye_code 这个字段前8位字符。
mysql> select id ,dye_code,order_id ,order_detail_id,left(dye_code,8) from dye_production_schedules limit 10;
+----+----------------+----------+-----------------+------------------+
| id | dye_code | order_id | order_detail_id | left(dye_code,8) |
+----+----------------+----------+-----------------+------------------+
| 1 | POD170821012-3 | 289 | 1378 | POD17082 |
| 2 | POD170821012-3 | 289 | 1378 | POD17082 |
| 3 | POD170821012-3 | 289 | 1378 | POD17082 |
| 4 | POD170821012-3 | 289 | 1378 | POD17082 |
| 5 | POD170821012-3 | 289 | 1378 | POD17082 |
| 6 | POD170821012-3 | 289 | 1378 | POD17082 |
| 7 | POD170821012-3 | 289 | 1378 | POD17082 |
| 8 | POD170821012-3 | 289 | 1378 | POD17082 |
| 9 | POD170821012-3 | 289 | 1378 | POD17082 |
| 10 | POD170821012-3 | 289 | 1378 | POD17082 |
+----+----------------+----------+-----------------+------------------+
10 rows in set (0.00 sec)
mysql>
关于这个函数更多例子,可以参考这个网址:https://www.w3resource.com/mysql/string-functions/mysql-left-function.php
right()
语法与left 相同,功能与left 相反,是从右边开始取lengh 个字符。
mysql> select id ,dye_code,order_id ,order_detail_id,right(dye_code,8) from dye_production_schedules limit 10;
+----+----------------+----------+-----------------+-------------------+
| id | dye_code | order_id | order_detail_id | right(dye_code,8) |
+----+----------------+----------+-----------------+-------------------+
| 1 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 2 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 3 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 4 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 5 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 6 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 7 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 8 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 9 | POD170821012-3 | 289 | 1378 | 821012-3 |
| 10 | POD170821012-3 | 289 | 1378 | 821012-3 |
+----+----------------+----------+-----------------+-------------------+
10 rows in set (0.00 sec)
mysql>
链接:https://www.w3resource.com/mysql/string-functions/mysql-right-function.php
concat()
concat() 函数返回字符串连接结果。
- 至少需要1个的参数
- 如果所有参数是非二进制字符串,返回非二进制字符串
- 如果参数包含二进制字符串,则返回二进制字符串
- 如果参数是数字,则将数字转换为同样的非二进制字符串并返回
- 如果参数中包含NULL , 则返回NULL
mysql> select concat(12.33);
+---------------+
| concat(12.33) |
+---------------+
| 12.33 |
+---------------+
1 row in set (0.00 sec)
mysql> select concat(12.33,12,67);
+---------------------+
| concat(12.33,12,67) |
+---------------------+
| 12.331267 |
+---------------------+
1 row in set (0.00 sec)
mysql> select concat('my name is','xiao mu ','xi zi');
+-----------------------------------------+
| concat('my name is','xiao mu ','xi zi') |
+-----------------------------------------+
| my name isxiao mu xi zi |
+-----------------------------------------+
1 row in set (0.00 sec)
mysql>
mysql> select id,dye_code ,order_id ,order_detail_id ,created_at ,concat('染订单id是:',order_id,' 染订单分录id 是 :',order_detail_id) from dye_production_schedules limit 10 ;
+----+----------------+----------+-----------------+---------------------+------------------------------------------------------------------------+
| id | dye_code | order_id | order_detail_id | created_at | concat('染订单id是:',order_id,' 染订单分录id 是 :',order_detail_id) |
+----+----------------+----------+-----------------+---------------------+------------------------------------------------------------------------+
| 1 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 2 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 3 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 4 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 5 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 6 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 7 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 8 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 9 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
| 10 | POD170821012-3 | 289 | 1378 | 2017-10-25 14:35:11 | 染订单id是:289 染订单分录id 是 :1378 |
+----+----------------+----------+-----------------+---------------------+------------------------------------------------------------------------+
10 rows in set (0.00 sec)
mysql> select curdate(), concat(curdate(),NULL);
+------------+------------------------+
| curdate() | concat(curdate(),NULL) |
+------------+------------------------+
| 2018-10-11 | NULL |
+------------+------------------------+
1 row in set (0.00 sec)
mysql>
concat 和 left 结合
mysql> select concat(left(now(),14),'00:00');
+--------------------------------+
| concat(left(now(),14),'00:00') |
+--------------------------------+
| 2018-10-11 10:00:00 |
+--------------------------------+
1 row in set (0.00 sec)
mysql>
concat 可以用于select where 条件中:
从t_accout 这个表中找到FName ,或者pinyin 中有 "ling" 的记录(这里假设FName 和 pinyin 都不会为 NULL )
mysql> select FID,FName,pinyin,concat(FName,' ',pinyin) as name from t_account where concat(FName,' ',pinyin) like '%ling%' limit 10;
+-----+-----------+--------------+---------------------+
| FID | FName | pinyin | name |
+-----+-----------+--------------+---------------------+
| 63 | Anna | wangsongling | Anna wangsongling |
| 105 | liweiling | liweiling | liweiling liweiling |
| 106 | Tracy | chencuiling | Tracy chencuiling |
| 153 | liuling | liuling | liuling liuling |
| 223 | tzl | tuziling | tzl tuziling |
| 228 | tutu02 | ziling | tutu02 ziling |
| 229 | tutu03 | ziling | tutu03 ziling |
| 246 | tutu | ziling | tutu ziling |
+-----+-----------+--------------+---------------------+
8 rows in set (0.00 sec)
mysql>
注:这里能这样做的前提是假设FName 和 pinyin 这两个字段不为NULL ,如果有一个为NULL ,就只能在where 后面各自 like ,如:where FName like '%ling% ' or pinyin like '%ling%',这样做效率极低,所以建议在表设计阶段就尽量不要使用null ,请用其它方案去替代 null,哪怕是空字符串('')也比null 效率高很多。
更多详细例子,参考:https://www.w3resource.com/mysql/string-functions/mysql-concat-function.php
length()
语法:length(str)
返回给定字符串长度,单字节字符串返回字符串个数,多字节,如汉字,返回字节个数。
mysql> select length('xiaomu');
+------------------+
| length('xiaomu') |
+------------------+
| 6 |
+------------------+
1 row in set (0.00 sec)
mysql> select length('小木');
+----------------+
| length('小木') |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
mysql>
与此功能类似的函数是:char_length() ,返回字符数
mysql> select char_length('xiaomu');
+-----------------------+
| char_length('xiaomu') |
+-----------------------+
| 6 |
+-----------------------+
1 row in set (0.00 sec)
mysql> select char_length('小木');
+---------------------+
| char_length('小木') |
+---------------------+
| 2 |
+---------------------+
1 row in set (0.00 sec)
find_in_set()
语法:
find_in_set(search string ,string list)
函数返回指定在字符串在字符串列表中第一次出现的位置,这个函数第二个参数必须是用','(逗号)分割的,当搜索不到指定内容返回0,参数为null时返回null。
mysql> select find_in_set(4,'4,54,34,34,4');
+-------------------------------+
| find_in_set(4,'4,54,34,34,4') |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select find_in_set(4,'4,54,34,34,4');
+-------------------------------+
| find_in_set(4,'4,54,34,34,4') |
+-------------------------------+
| 1 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select locate(4,'14,24,44');
+----------------------+
| locate(4,'14,24,44') |
+----------------------+
| 2 |
+----------------------+
1 row in set (0.00 sec)
mysql>
更多例子参考:https://www.w3resource.com/mysql/string-functions/mysql-find_in_set-function.php
2.时间处理
add_date()
是date_add 同义词,语法:
ADDDATE(date, INTERVAL expr unit), ADDDATE(expr,days)
Name | Description |
---|---|
date | 时间值 |
INTERVAL | 关键字 |
expr | 时间表达式或数值 |
unit | 时间单位 |
详情参考:https://w3resource.com/mysql/date-and-time-functions/mysql-adddate-function.php
mysql> select date_add('2018-02-19',interval 10 day);
+----------------------------------------+
| date_add('2018-02-19',interval 10 day) |
+----------------------------------------+
| 2018-03-01 |
+----------------------------------------+
1 row in set (0.00 sec)
mysql> select date_add(curdate(), interval 7 day);
+-------------------------------------+
| date_add(curdate(), interval 7 day) |
+-------------------------------------+
| 2018-10-18 |
+-------------------------------------+
1 row in set (0.00 sec)
mysql>
curdate()
返回当前日期 ,是 current_date() 同义词:
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2018-10-11 |
+----------------+
1 row in set (0.00 sec)
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2018-10-11 |
+----------------+
1 row in set (0.01 sec)
mysql>
curtime()
获取当前时间 ,current_time() 同义词
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 14:08:59 |
+-----------+
1 row in set (0.00 sec)
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 14:09:05 |
+----------------+
1 row in set (0.00 sec)
CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP()函数返回当前时间戳,是now() 的同意词。
mysql> select current_timestamp(),now();
+---------------------+---------------------+
| current_timestamp() | now() |
+---------------------+---------------------+
| 2018-10-11 14:11:18 | 2018-10-11 14:11:18 |
+---------------------+---------------------+
1 row in set (0.00 sec)
mysql>
DATE_SUB()
语法:
DATE_SUB(date, INTERVAL expr unit)
返回时间间隔。
详见:https://w3resource.com/mysql/date-and-time-functions/mysql-date_sub-function.php
mysql> select date_sub(curdate(),interval 7 day);
+------------------------------------+
| date_sub(curdate(),interval 7 day) |
+------------------------------------+
| 2018-10-04 |
+------------------------------------+
1 row in set (0.00 sec)
mysql>
说明:date_add 和 date_sub 函数,可以用于高效直观的时间比对查询,比如查询一周内登录活跃用户,在《高性能mysql 第三版》这本书中,很多例子有用到该函数。
FROM_UNIXTIME()
返回从 unix_timestamp 时间,语法:
FROM_ UNIXTIME (unix_timestamp, [format ])
详见:https://w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
UNIX_TIMESTAMP()
返回 unix 时间戳,语法:
UNIX_TIMESTAMP(); UNIX_TIMESTAMP(date);
详见:https://w3resource.com/mysql/date-and-time-functions/mysql-unix_timestamp-function.php
now()
返回当前日期时间
mysql> select unix_timestamp(); #返回当前时间戳
+------------------+
| unix_timestamp() |
+------------------+
| 1539239503 |
+------------------+
1 row in set (0.00 sec)
mysql> select unix_timestamp('2018-02-19') ;#返回2018-02-19的时间戳
+------------------------------+
| unix_timestamp('2018-02-19') |
+------------------------------+
| 1518969600 |
+------------------------------+
1 row in set (0.00 sec)
mysql> select from_unixtime(1518969600);
+---------------------------+
| from_unixtime(1518969600) |
+---------------------------+
| 2018-02-19 00:00:00 |
+---------------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-10-11 14:39:08 |
+---------------------+
1 row in set (0.00 sec)
mysql>
3 .流程控制
case when
详见:https://blog.csdn.net/qq_30038111/article/details/79611167
IF()
if()函数接受三个参数表达式,如果第一个表达式为真,不为0 不为NULL ,它将返回第二个表达式,否则返回第三个表达式。返回值取决于上下文环境。
语法:
IF(expression ,expr_true, expr_false);
详见 :https://www.w3resource.com/mysql/control-flow-functions/if-function.php
mysql> select if(3 > 1 ,'true','false');
+---------------------------+
| if(3 > 1 ,'true','false') |
+---------------------------+
| true |
+---------------------------+
1 row in set (0.00 sec)
mysql> select
->
-> sum(if(`status` = 1 and cancel_status = 0,1,0)) as status1Sum ,
-> sum(if(`status` = 2 and cancel_status = 0,1,0)) as status2Sum,
-> sum(if(`status` = 4 and cancel_status = 0,1,0)) as status3Sum ,
-> sum(if(`cancel_status` = 1, 1 ,0)) as status5Sum
-> from dye_orders where dye_factory_id = 357 and company_id = 63 and
->
-> deleted_at is null;
+------------+------------+------------+------------+
| status1Sum | status2Sum | status3Sum | status5Sum |
+------------+------------+------------+------------+
| 0 | 38 | 181 | 11 |
+------------+------------+------------+------------+
1 row in set (0.00 sec)
mysql>
说明,该函数结合sum函数可以用于高效统计。比如,根据状态值统计每个状态下符合条件的记录个数。我在工作中见过有人写的根据某个状态条件指去数据库查询符合记录的个数的代码,比如上面的4个状态值,查了4次数据库,其实查4次数据库的方式是非常低效的,可以使用上面的例子中所写那样去替代,但上面那样的写法并不是最高效的,那怎样才算是最高效的呢?那就是不查数据库,对就是不查数据库,设计redis 或者memcached ,将数据缓存到缓存系统中,去查缓存(mysql 高性能三原则:不做,少做,尽量快速的做)。以上是我个人经验之谈,至于更多例子,请移步上面的链接。
IFNULL()
语法
IFNULL(expression1, expression2);
IFNULL()函数接受三个参数表达式,如果第一个表达式不为NULL ,它将返回第一个表达式,否则返回第二个表达式。返回值取决于上下文环境。
mysql> select ifnull(0,20);
+--------------+
| ifnull(0,20) |
+--------------+
| 0 |
+--------------+
1 row in set (0.09 sec)
mysql> select ifnull(10,20);
+---------------+
| ifnull(10,20) |
+---------------+
| 10 |
+---------------+
1 row in set (0.00 sec)
mysql>
4.ip地址
INET_ATON()
从一个ip 地址得到相应的整数,与之相对的有INET_NTOA() 函数。
mysql> select inet_aton('192.168.1.195');
+----------------------------+
| inet_aton('192.168.1.195') |
+----------------------------+
| 3232235971 |
+----------------------------+
1 row in set (0.05 sec)
mysql> select inet_ntoa('3232235971');
+-------------------------+
| inet_ntoa('3232235971') |
+-------------------------+
| 192.168.1.195 |
+-------------------------+
1 row in set (0.00 sec)
mysql>
其它详见:https://www.w3resource.com/mysql/mysql-miscellaneous-functions.php
说明:我在https://blog.csdn.net/zhang_referee/article/details/82868081这篇文章中提过,要存ip地址,尽量使用int,因为 1.int 节省存储空间 2. mysql处理数字比处理字符串要快
至于为什么节省存储空间就能让mysql 高效工作这个涉及很多东西,暂时只需知道,磁盘IO比从内存中读数据要慢的多。当数据量比较小时,mysql 会把数据载入内存,当数据量过大无法载入内存中就会扫全表发生磁盘IO,当然后面这一句话并不准确,因为mysql 工作原理很复杂,并不总是简单愚蠢的磁盘IO,建议通读下《高性能mysql》 。
终章:上面所列并不是很全的常用函数,当然一开始定位也不打算写的很全,很多没有在此罗列(聚合函数,information 函数等),主要本着结合实际开发与《高性能mysql》学习,构建高效mysql 查询,举例说明常用函数及自己工作开发总结,如果有意查看更多更全的mysql 函数信息,请移步:https://www.w3resource.com/mysql/mysql-tutorials.php ,一个英文网站,不过单词都比较简单,相信你能搞定它。