九、MySQL 常用函数汇总(2)

前置知识:

一、数据库开发与实战专栏导学及数据库基础概念入门
二、MySQL 介绍及 MySQL 安装与配置
三、MySQL 数据库的基本操作
四、MySQL 存储引擎及数据类型
五、数据导入与基本的 SELECT 语句
六、MySQL 数据库练习题1(包含前5章练习题目及答案)
七、MySQL 多表查询详解(附练习题及答案----超详细)
八、MySQL 常用函数汇总(1)

一、条件判断函数

条件判断函数也称为控制流程函数,根据满足的不同条件,执行相应的流程。MySQL 中进行条件判断的函数有 IFIFNULLCASE。本小节将分别介绍各个条件判断函数的用法。

1.1 IF(expr,v1,v2)函数

对于 IF(expr, v1, v2) 函数,如果表达式 exprTRUE(expr <> 0 and expr <> NULL),则返回值为 v1,否则返回值为 v2IF() 的返回值为数字值或字符串值,具体情况视其所在的语境而定。使用 IF() 函数进行条件判断,输入语句如下:

mysql> SELECT IF(1>2,2,3), IF(1<2,'yes ','no'),  IF(STRCMP('test','test1'),'no','yes');
+-------------+---------------------+---------------------------------------+
| IF(1>2,2,3) | IF(1<2,'yes ','no') | IF(STRCMP('test','test1'),'no','yes') |
+-------------+---------------------+---------------------------------------+
|           3 | yes                 | no                                    |
+-------------+---------------------+---------------------------------------+
1 row in set (0.00 sec)
#如果v1或v2中只有一个明确是NULL,则IF()函数的结果类型为非NULL表达式的结果类型。

1.2 IFNULL(v1,v2)函数

对于 IFNULL(v1,v2) 函数,假如 v1 不为 NULL,则 IFNULL() 的返回值为 v1,否则其返回值为 v2IFNULL() 的返回值是数字或者字符串,具体情况取决于其所在的语境。使用 IFNULL() 函数进行条件判断,输入语句如下:

mysql> SELECT IFNULL(1,2), IFNULL(NULL,10), IFNULL(1/0, 'wrong');
+-------------+-----------------+----------------------+
| IFNULL(1,2) | IFNULL(NULL,10) | IFNULL(1/0, 'wrong') |
+-------------+-----------------+----------------------+
|           1 |              10 | wrong                |
+-------------+-----------------+----------------------+
1 row in set (0.00 sec)

1.3 CASE函数

CASE 函数的格式是 CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2]…[ELSE rn+1] END,如果 expr 值等于某个 vn,则返回对应位置 THEN 后面的结果;如果与所有值都不相等,则返回 ELSE 后面的 rn+1。使用 CASE value WHEN 语句执行分支操作,输入语句如下:

mysql> SELECT CASE 2 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;
+------------------------------------------------------------+
| CASE 2 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END |
+------------------------------------------------------------+
| two                                                        |
+------------------------------------------------------------+
1 row in set (0.00 sec)
#使用CASE WHEN语句执行分支操作,输入语句如下:
mysql> SELECT CASE WHEN 1<0 THEN 'true' ELSE 'false' END;
+--------------------------------------------+
| CASE WHEN 1<0 THEN 'true' ELSE 'false' END |
+--------------------------------------------+
| false                                      |
+--------------------------------------------+
1 row in set (0.00 sec)

提示: 一个 CASE 表达式的默认返回值类型是任何返回值的相容集合类型,但具体情况视其所在的语境而定。如果用在字符串语境中,则返回结果为字符串。如果用在数字语境中,则返回结果为十进制值、实数值或整数值。

二、系统信息函数

本小节将介绍常用的系统信息函数。MySQL中的系统信息有数据库的版本号、当前用户名和连接数、系统字符集、最后一个自动生成的ID值等。

2.1 获取MySQL版本号、连接数和数据库名的函数

VERSION() 返回表示 MySQL 服务器版本的字符串,这个字符串使用 utf8字符集。查看当前 MySQL 版本号,输入语句如下:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.30    |
+-----------+
1 row in set (0.00 sec)

CONNECTION_ID() 返回 MySQL 服务器当前连接的次数,每个连接都有各自唯一的ID。查看当前用户的连接数,输入语句如下:

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|            4968 |
+-----------------+
1 row in set (0.00 sec)

SHOW PROCESSLIST; SHOW FULL PROCESSLIST; processlist 命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态、帮助识别出有问题的查询语句等。如果是 root 账号,能看到所有用户的当前连接;如果是其他普通账号,则只能看到自己占用的连接。show processlist 只列出前100条,如果想全部列出,可使用 show full processlist 命令。

mysql> SHOW PROCESSLIST;
+------+-----------------+-----------------+-------------+---------+--------+------------------------+------------------+
| Id   | User            | Host            | db          | Command | Time   | State                  | Info             |
+------+-----------------+-----------------+-------------+---------+--------+------------------------+------------------+
|    5 | event_scheduler | localhost       | NULL        | Daemon  | 712096 | Waiting on empty queue | NULL             |
| 4966 | root            | localhost:49935 | work-spider | Sleep   |   1858 |                        | NULL             |
| 4967 | root            | localhost:51134 | work-spider | Sleep   |   1858 |                        | NULL             |
| 4968 | root            | localhost:51868 | NULL        | Query   |      0 | init                   | SHOW PROCESSLIST |
+------+-----------------+-----------------+-------------+---------+--------+------------------------+------------------+
4 rows in set (0.00 sec)
#各个列的含义和用途:
#1.Id列,用户登录MySQL时,系统分配的是 connection id
#2.User列,显示当前用户。如果不是root,这个命令就只显示用户权限范围内的SQL语句。
#3.Host列,显示这个语句是从哪个IP的哪个端口上发出的,可以用来追踪出现问题语句的用户。
#4.db列,显示这个进程目前连接的是哪个数据库。
#5.Command列,显示当前连接执行的命令,一般取值为休眠(Sleep)、查询(Query)、连接(Connect)。
#6.Time列,显示这个状态持续的时间,单位是秒。
#7.State列,显示使用当前连接的SQL语句的状态,很重要的列。后续会有所有状态的描述,State只是语句执行中的某一个状态。
#一个SQL语句,以查询为例,可能需要经过Copying to tmp table、Sorting result、Sending data等状态才可以完成。
#8.Info列,显示这个SQL语句,是判断问题语句的一个重要依据。

DATABASE()SCHEMA() 函数返回使用 utf8 字符集的默认(当前)数据库名。查看当前使用的数据库,输入语句如下:

mysql> SELECT DATABASE(),SCHEMA();
+-------------+-------------+
| DATABASE()  | SCHEMA()    |
+-------------+-------------+
| mysql_study | mysql_study |
+-------------+-------------+
1 row in set (0.00 sec)

2.2 获取用户名的函数

USER()、CURRENT_USER()、CURRENT_USER()、SYSTEM_USER() 和 SESSION_USER() 这几个函数返回当前被 MySQL 服务器验证的用户名和主机名组合。这个值符合确定当前登录用户存取权限的 MySQL 账户。一般情况下,这几个函数的返回值是相同的。获取当前登录用户名称,输入语句如下:

mysql> SELECT USER(), CURRENT_USER(), SYSTEM_USER();
+----------------+----------------+----------------+
| USER()         | CURRENT_USER() | SYSTEM_USER()  |
+----------------+----------------+----------------+
| root@localhost | root@%         | root@localhost |
+----------------+----------------+----------------+
1 row in set (0.00 sec)
#返回结果值表明了当前账户连接服务器时的用户名及所连接的客户主机,root为当前登录的用户名,localhost为登录的主机名。

2.3 获取字符串的字符集和排序方式的函数

CHARSET(str) 返回字符串 str 自变量的字符集。使用 CHARSET() 函数返回字符串使用的字符集,输入语句如下:

mysql> SELECT CHARSET('abc'), CHARSET(CONVERT('abc' USING latin1)), CHARSET(VERSION());
+----------------+--------------------------------------+--------------------+
| CHARSET('abc') | CHARSET(CONVERT('abc' USING latin1)) | CHARSET(VERSION()) |
+----------------+--------------------------------------+--------------------+
| gbk            | latin1                               | utf8mb3            |
+----------------+--------------------------------------+--------------------+
1 row in set (0.00 sec)
#CHARSET('abc')返回系统默认的字符集gbk
#CHARSET(CONVERT('abc' USING latin1))返回的字符集为latin1
#前面介绍过,VERSION()返回的字符串使用utf8字符集,因此CHARSET返回结果为utf8mb3

COLLATION(str) 返回字符串 str 的字符排列方式。使用 COLLATION() 函数返回字符串的排列方式,输入语句如下:

mysql> SELECT COLLATION('abc'),COLLATION(CONVERT('abc' USING utf8));
+------------------+--------------------------------------+
| COLLATION('abc') | COLLATION(CONVERT('abc' USING utf8)) |
+------------------+--------------------------------------+
| gbk_chinese_ci   | utf8mb3_general_ci                   |
+------------------+--------------------------------------+
1 row in set, 1 warning (0.00 sec)
#可以看到,使用不同字符集时字符串的排列方式不同

2.4 获取最后一个自动生成的ID值的函数

LAST_INSERT_ID() 函数返回最后生成的 AUTO_INCREMENT 值。使用 SELECT LAST_INSERT_ID 查看最后一个自动生成的列值。

mysql> CREATE TABLE worker(Id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, Name VARCHAR(30));
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO worker VALUES(NULL, 'jimy');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO worker VALUES(NULL, 'amo');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM worker;
+----+------+
| Id | Name |
+----+------+
|  1 | jimy |
|  2 | amo  |
+----+------+
2 rows in set (0.00 sec)

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO worker VALUES  (NULL, 'Kevin'),(NULL,'Michal'),(NULL,'Nick');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                3 |
+------------------+
1 row in set (0.00 sec)
#结果显示,LAST_INSERT_ID值不是5而是3,这是为什么呢?在向数据表中插入一条新记录时,LAST_INSERT_ID()返回带有AUTO_INCREMENT约束
#的字段最新生成的值2;继续向表中同时添加3条记录,读者可能以为这时LAST_INSERT_ID值为5,可显示结果却为3,
#这是因为当使用一条INSERT语句插入多行时,LAST_INSERT_ID()只返回插入的第一行数据时产生的值,在这里为第3条记录。
#之所以这样,是因为这使依靠其他服务器复制同样的 INSERT语句变得简单。提示:LAST_INSERT_ID是与数据表无关的,如果向表a
#插入数据后再向表b插入数据,那么LAST_INSERT_ID返回表b中的Id值。

三、加密函数

加密函数主要用来对数据进行加密处理,以保证某些重要数据不被别人获取。这些函数在保证数据库安全时非常有用。本小节将介绍各种加密函数的作用和使用方法。

3.1 加密函数MD5(str)

MD5(str) 为字符串算出一个 MD5 128 比特校验和。该值以32位十六进制数字的二进制字符串形式返回,若参数为NULL,则会返回NULL。使用 MD5 函数加密字符串,输入语句如下:

mysql> SELECT MD5 ('amoxiang');
+----------------------------------+
| MD5 ('amoxiang')                 |
+----------------------------------+
| 64504e1a9608f2847b7c18abfdf97ad4 |
+----------------------------------+
1 row in set (0.00 sec)

3.2 加密函数SHA(str)

SHA(str) 使用原明文密码 str 计算并返回加密后的密码字符串,当参数为NULL时,返回 NULLSHA 加密算法比 MD5 更加安全。使用 SHA 函数加密密码,输入语句如下:

mysql> SELECT SHA('amo23456');
+------------------------------------------+
| SHA('amo23456')                          |
+------------------------------------------+
| 6a3149de98a3bc36cc5d7baa0edbd6aa6141b512 |
+------------------------------------------+
1 row in set (0.00 sec)

3.3 加密函数SHA2(str, hash_length)

SHA2(str, hash_length) 使用 hash_length 作为长度,加密 strhash_length 支持的值为224、256、384、512和0。其中,0等同于256。使用 SHA2 加密字符串,输入语句如下:

mysql> SELECT SHA2('tom123456',0) A,sha2('tom123456',256) B\G
*************************** 1. row ***************************
A: 9242a986a9edbd14a60450e9284a372efeff7e9f6209f675fdc4457f55de5e27
B: 9242a986a9edbd14a60450e9284a372efeff7e9f6209f675fdc4457f55de5e27
1 row in set (0.00 sec)

四、其他函数

本小节将要介绍的函数不能笼统地归为一类,但是这些函数也非常有用,例如重复指定操作函数、改变字符集函数、IP地址与数字转换函数等。本小节将介绍这些函数的作用和用法。

4.1 格式化函数FORMAT(x,n)

FORMAT(x,n) 将数字 x 格式化,并以四舍五入的方式保留小数点后 n 位,结果以字符串的形式返回。若 n 为0,则返回结果函数不含小数部分。使用 FORMAT 函数格式化数字,保留小数点位数为指定值,输入语句如下:

mysql> SELECT FORMAT(12332.123456, 4), FORMAT(12332.1,4), FORMAT(12332.2,0);
+-------------------------+-------------------+-------------------+
| FORMAT(12332.123456, 4) | FORMAT(12332.1,4) | FORMAT(12332.2,0) |
+-------------------------+-------------------+-------------------+
| 12,332.1235             | 12,332.1000       | 12,332            |
+-------------------------+-------------------+-------------------+
1 row in set (0.00 sec)

4.2 不同进制的数字进行转换的函数

CONV(N, from_base, to_base) 函数进行不同进制数之间的转换,返回值为数值 N 的字符串表示,由 from_base 进制转化为 to_base 进制。如有任意一个参数为 NULL,则返回值为 NULL。自变量 N 被理解为一个整数,但是可以被指定为一个整数或字符串。进制数最小基数为 2,最大基数为 36。使用 CONV 函数在不同进制数值之间转换,输入语句如下:

mysql> SELECT CONV('a',16,2), CONV(15,10,2), CONV(15,10,8), CONV(15,10,16);
+----------------+---------------+---------------+----------------+
| CONV('a',16,2) | CONV(15,10,2) | CONV(15,10,8) | CONV(15,10,16) |
+----------------+---------------+---------------+----------------+
| 1010           | 1111          | 17            | F              |
+----------------+---------------+---------------+----------------+
1 row in set (0.00 sec)

CONV('a',16,2) 将十六进制的 a 转换为二进制表示的数值,十六进制的 a 表示十进制的数值10,二进制的数值 1010 正好等于十进制的数值10;CONV(15,10,2) 将十进制的数值 15 转换为二进制值,结果为 1111CONV(15,10,8) 将十进制的数值 15 转换为八进制值,结果为 17CONV(15,10,16) 将十进制的数值 15 转换为十六进制值,结果为 F。进制说明:

  1. 二进制,采用0和1两个数字来表示的数。它以2为基数,逢二进一。
  2. 八进制,采用0、1、2、3、4、5、6、7八个数字,以数字0开头,逢八进一。
  3. 十进制,采用 0~9,共10个数字表示,逢十进一。
  4. 十六进制,由 0~9A~F 组成,以数字 0x 开头。它与十进制的对应关系是:0~9 对应 0~9A~F 对应 10~15

4.3 IP地址与数字相互转换的函数

INET_ATON(expr) 给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8bit地址。使用 INET_ATON 函数将字符串网络点地址转换为数值网络地址,输入语句如下:

mysql> SELECT INET_ATON('209.207.224.40');
+-----------------------------+
| INET_ATON('209.207.224.40') |
+-----------------------------+
|                  3520061480 |
+-----------------------------+
1 row in set (0.00 sec)

INET_NTOA(expr) 函数给定一个数字网络地址(4或8bit),返回作为字符串的该地址的点地址表示。使用 INET_NTOA 函数将数值网络地址转换为字符串网络点地址,输入语句如下:

#可以看到,INET_NTOA和INET_ATON互为反函数
mysql> SELECT INET_NTOA(3520061480);
+-----------------------+
| INET_NTOA(3520061480) |
+-----------------------+
| 209.207.224.40        |
+-----------------------+
1 row in set (0.00 sec)

4.4 加锁函数和解锁函数

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> SELECT GET_LOCK('lock1',10) AS GetLock, IS_USED_LOCK('lock1') AS ISUsedLock, IS_FREE_LOCK('lock1') AS ISFreeLock,
 RELEASE_LOCK('lock1') AS ReleaseLock;
+---------+------------+------------+-------------+
| GetLock | ISUsedLock | ISFreeLock | ReleaseLock |
+---------+------------+------------+-------------+
|       1 |       4968 |          0 |           1 |
+---------+------------+------------+-------------+
1 row in set (0.00 sec)

4.5 重复执行指定操作的函数

BENCHMARK(count,expr) 函数重复 count 次执行表达式 expr。它可以用于计算 MySQL 处理表达式的速度。结果值通常为0(0只是表示处理过程很快,并不是没有花费时间)。另一个作用是它可以在 MySQL 客户端内部报告语句执行的时间。使用 BENCHMARK 重复执行指定函数,输入语句如下:

mysql> SELECT SHA('newpwd');
+------------------------------------------+
| SHA('newpwd')                            |
+------------------------------------------+
| c7f005b657906521157aa3fc261afe886d51f792 |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT BENCHMARK(500000, SHA('newpwd'));
+----------------------------------+
| BENCHMARK(500000, SHA('newpwd')) |
+----------------------------------+
|                                0 |
+----------------------------------+
1 row in set (0.18 sec)

4.6 改变字符集的函数

带有 USING 参数的 CONVERT(...USING...) 函数用来在不同的字符集之间转化数据。使用 CONVERT() 函数改变字符串的默认字符集,输入语句如下:

mysql> SELECT CHARSET('string'),CHARSET(CONVERT('string' USING latin1));
+-------------------+-----------------------------------------+
| CHARSET('string') | CHARSET(CONVERT('string' USING latin1)) |
+-------------------+-----------------------------------------+
| gbk               | latin1                                  |
+-------------------+-----------------------------------------+
1 row in set (0.00 sec)

4.7 改变数据类型的函数

CAST(x , AS type)CONVERT(x, type) 函数将一个类型的值转换为另一个类型的值,可转换的 typeBINARY、CHAR(n)、DATE、TIME、DATETIME、DECIMAL、SIGNED、UNSIGNED。使用 CASTCONVERT 函数进行数据类型的转换,SQL语句如下:

mysql> SELECT CAST(100 AS CHAR(2)), CONVERT('2018-10-01 12:12:12',TIME);
+----------------------+-------------------------------------+
| CAST(100 AS CHAR(2)) | CONVERT('2018-10-01 12:12:12',TIME) |
+----------------------+-------------------------------------+
| 10                   | 12:12:12                            |
+----------------------+-------------------------------------+
1 row in set, 1 warning (0.00 sec)

可以看到,CAST(100 AS CHAR(2)) 将整数数据 100 转换为带有两个显示宽度的字符串类型,结果为 10CONVERT('2018-10-01 12:12:12',TIME)DATETIME 类型的时间值转换为 TIME 类型,结果为 12:12:12

窗口函数与聚合函数将结合实际查询案例进行讲解,故 MySQL 函数篇不再赘述。

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习数据库的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

猜你喜欢

转载自blog.csdn.net/xw1680/article/details/128698866
今日推荐