九MySQL 常用函数汇总
Posted Amo Xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了九MySQL 常用函数汇总相关的知识,希望对你有一定的参考价值。
文章目录
前置知识:
一、数据库开发与实战专栏导学及数据库基础概念入门
二、MySQL 介绍及 MySQL 安装与配置
三、MySQL 数据库的基本操作
四、MySQL 存储引擎及数据类型
五、数据导入与基本的 SELECT 语句
六、MySQL 数据库练习题1(包含前5章练习题目及答案)
七、MySQL 多表查询详解(附练习题及答案----超详细)
八、MySQL 常用函数汇总(1)
一、条件判断函数
条件判断函数也称为控制流程函数,根据满足的不同条件,执行相应的流程。mysql 中进行条件判断的函数有 IF
、IFNULL
和 CASE
。本小节将分别介绍各个条件判断函数的用法。
1.1 IF(expr,v1,v2)函数
对于 IF(expr, v1, v2)
函数,如果表达式 expr
是 TRUE(expr <> 0 and expr <> NULL)
,则返回值为 v1
,否则返回值为 v2
。IF()
的返回值为数字值或字符串值,具体情况视其所在的语境而定。使用 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
,否则其返回值为 v2
。IFNULL()
的返回值是数字或者字符串,具体情况取决于其所在的语境。使用 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时,返回 NULL
。SHA
加密算法比 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
作为长度,加密 str
。hash_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
转换为二进制值,结果为 1111
;CONV(15,10,8)
将十进制的数值 15
转换为八进制值,结果为 17
;CONV(15,10,16)
将十进制的数值 15
转换为十六进制值,结果为 F
。进制说明:
- 二进制,采用0和1两个数字来表示的数。它以2为基数,逢二进一。
- 八进制,采用0、1、2、3、4、5、6、7八个数字,以数字0开头,逢八进一。
- 十进制,采用
0~9
,共10个数字表示,逢十进一。 - 十六进制,由
0~9
、A~F
组成,以数字0x
开头。它与十进制的对应关系是:0~9
对应0~9
,A~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(没有人在用这个
以上是关于九MySQL 常用函数汇总的主要内容,如果未能解决你的问题,请参考以下文章