MySQL的内置函数
本文最后更新于 362 天前,如有失效请评论区留言。

日期函数

函数名称 描述
current_date() 当前日期
current_time() 当前时间
current_timestamp() 当前时间戳
date(datetime) 返回 datetime 参数的日期部分
date_add(date, interval d_value_type) date 中添加日期或时间,interval 后的数值单位可以是:yearminutesecondday
date_sub(date, interval d_value_type) date 中减去日期或时间,interval 后的数值单位可以是:yearminutesecondday
datediff(date1, date2) 两个日期的差,单位是天
now() 当前日期时间

举例:

mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2024-11-20     |
+----------------+
1 row in set (0.00 sec)

mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 11:24:26       |
+----------------+
1 row in set (0.00 sec)

mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2024-11-20 11:24:29 |
+---------------------+
1 row in set (0.00 sec)

mysql> select date('2024-11-20 11:24:00');
+-----------------------------+
| date('2024-11-20 11:24:00') |
+-----------------------------+
| 2024-11-20                  |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2024-11-20  |
+-------------+
1 row in set (0.00 sec)

mysql> select date_add('2024-11-24', interval 30 day);
+-----------------------------------------+
| date_add('2024-11-24', interval 30 day) |
+-----------------------------------------+
| 2024-12-24                              |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> select date_sub('2024-11-24', interval 30 day);
+-----------------------------------------+
| date_sub('2024-11-24', interval 30 day) |
+-----------------------------------------+
| 2024-10-25                              |
+-----------------------------------------+
1 row in set (0.00 sec)

mysql> select datediff('2024-11-24', '2024-12-31');
+--------------------------------------+
| datediff('2024-11-24', '2024-12-31') |
+--------------------------------------+
|                                  -37 |
+--------------------------------------+
1 row in set (0.04 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-11-20 11:26:40 |
+---------------------+
1 row in set (0.00 sec)

创建一个留言表

mysql> create table msg(
    -> id bigint primary key auto_increment,
    -> content varchar(100) not null,
    -> sendtime datetime
    -> );
Query OK, 0 rows affected (0.14 sec)

mysql> desc msg;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | bigint       | NO   | PRI | NULL    | auto_increment |
| content  | varchar(100) | NO   |     | NULL    |                |
| sendtime | datetime     | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> insert into msg (content, sendtime) values('纸上得来终觉浅,绝知此事要躬行!', now());
Query OK, 1 row affected (0.02 sec)

mysql> insert into msg (content, sendtime) values('你好!', now());
Query OK, 1 row affected (0.00 sec)

mysql> insert into msg (content, sendtime) values('你吃了吗?', now());
Query OK, 1 row affected (0.01 sec)

mysql> select * from msg;
+----+--------------------------------------------------+---------------------+
| id | content                                          | sendtime            |
+----+--------------------------------------------------+---------------------+
|  1 | 纸上得来终觉浅,绝知此事要躬行!                 | 2024-11-20 11:41:17 |
|  2 | 你好!                                           | 2024-11-20 11:42:39 |
|  3 | 你吃了吗?                                       | 2024-11-20 11:42:54 |
+----+--------------------------------------------------+---------------------+
3 rows in set (0.00 sec)

# 查询在2分钟内发布的帖子:
mysql> insert into msg (content, sendtime) values('会当凌绝顶,一览众山小!', now()
));
Query OK, 1 row affected (0.02 sec)

mysql> select * from msg where sendtime > date_sub(now(), interval 2 minute);
+----+--------------------------------------+---------------------+
| id | content                              | sendtime            |
+----+--------------------------------------+---------------------+
|  4 | 会当凌绝顶,一览众山小!                | 2024-11-20 11:50:32 |
+----+--------------------------------------+---------------------+
1 row in set (0.00 sec)

字符串函数

函数名称 描述
charset(str) 返回字符串字符集
concat(string2 [, ...]) 连接字符串
instr(string, substring) 返回 substringstring 中出现的位置,没有返回 0
ucase(string2) 转换成大写
lcase(string2) 转换成小写
left(string2, length) string2 中的左边起取 length 个字符
right(string2, length) string2 中的右边起取 length 个字符
length(string) 返回字符串的长度
replace(str, search_str, replace_str) str 中用 replace_str 替换 search_str
strcmp(string1, string2) 逐字符比较两个字符串大小
substring(str, position [, length]) strposition 开始,取 length 个字符
ltrim(string) rtrim(string) trim(string) 去除前空格或后空格

举例

# 1. [charset]获取msg表中content列的字符集
mysql> select * from msg;
+----+--------------------------------------------------+---------------------+
| id | content                                          | sendtime            |
+----+--------------------------------------------------+---------------------+
|  1 | 纸上得来终觉浅,绝知此事要躬行!                     | 2024-11-20 11:41:17 |
|  2 | 你好!                                            | 2024-11-20 11:42:39 |
|  3 | 你吃了吗?                                         | 2024-11-20 11:42:54 |
|  4 | 会当凌绝顶,一览众山小!                            | 2024-11-20 11:50:32 |
+----+--------------------------------------------------+---------------------+
4 rows in set (0.00 sec)

mysql> select charset(content) from msg;
+------------------+
| charset(content) |
+------------------+
| utf8mb4          |
| utf8mb4          |
| utf8mb4          |
| utf8mb4          |
+------------------+
4 rows in set (0.00 sec)

# 2. [concat]显示msg中的留言信息,格式是:'用户' + id + ' 在' + sendtime + ' 发布了:' content
mysql> select concat('用户', id, ' 在', sendtime, ' 发布了:', content) as '留言信息' from msg;
+---------------------------------------------------------------------------------------------+
| 留言信息                                                                                     |
+---------------------------------------------------------------------------------------------+
| 用户1 在2024-11-20 11:41:17 发布了:纸上得来终觉浅,绝知此事要躬行!                             |
| 用户2 在2024-11-20 11:42:39 发布了:你好!                                                    |
| 用户3 在2024-11-20 11:42:54 发布了:你吃了吗?                                                |
| 用户4 在2024-11-20 11:50:32 发布了:会当凌绝顶,一览众山小!                                    |
+---------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

# 3. [instr]找到msg的留言中'!'出现的位置
mysql> select * from msg;
+----+--------------------------------------------------+---------------------+
| id | content                                          | sendtime            |
+----+--------------------------------------------------+---------------------+
|  1 | 纸上得来终觉浅,绝知此事要躬行!                 | 2024-11-20 11:41:17 |
|  2 | 你好!                                           | 2024-11-20 11:42:39 |
|  3 | 你吃了吗?                                       | 2024-11-20 11:42:54 |
|  4 | 会当凌绝顶,一览众山小!                         | 2024-11-20 11:50:32 |
+----+--------------------------------------------------+---------------------+
4 rows in set (0.00 sec)

mysql> select instr(content, '!') from msg;
+-----------------------+
| instr(content, '!')  |
+-----------------------+
|                    16 |
|                     3 |
|                     0 |
|                    12 |
+-----------------------+
4 rows in set (0.00 sec)

# 4. [ucase]将所有字母转换成大写
mysql> select ucase('abc123QQQ');
+--------------------+
| ucase('abc123QQQ') |
+--------------------+
| ABC123QQQ          |
+--------------------+
1 row in set (0.06 sec)

# 5. [lcase]将所有字母转换成小写
mysql> select lcase('abc123QQQ');
+--------------------+
| lcase('abc123QQQ') |
+--------------------+
| abc123qqq          |
+--------------------+
1 row in set (0.01 sec)

# 6. [left]从左到右提取4个字符
mysql> select left('abc123QQQ', 4);
+----------------------+
| left('abc123QQQ', 4) |
+----------------------+
| abc1                 |
+----------------------+
1 row in set (0.00 sec)

# 6. [right]从右到左提取4个字符
mysql> select right('abc123QQQ', 4);
+-----------------------+
| right('abc123QQQ', 4) |
+-----------------------+
| 3QQQ                  |
+-----------------------+
1 row in set (0.00 sec)

# 7. [length]求出字符串长度
mysql> select length('abc123QQQ');
+---------------------+
| length('abc123QQQ') |
+---------------------+
|                   9 |
+---------------------+
1 row in set (0.00 sec)
# 注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

# 8. [replace]将表中所有的'!'替换成'。'
mysql> select * from msg;
+----+--------------------------------------------------+---------------------+
| id | content                                          | sendtime            |
+----+--------------------------------------------------+---------------------+
|  1 | 纸上得来终觉浅,绝知此事要躬行!                    | 2024-11-20 11:41:17 |
|  2 | 你好!                                           | 2024-11-20 11:42:39 |
|  3 | 你吃了吗?                                        | 2024-11-20 11:42:54 |
|  4 | 会当凌绝顶,一览众山小!                           | 2024-11-20 11:50:32 |
+----+--------------------------------------------------+---------------------+
4 rows in set (0.00 sec)

mysql> select replace(content, '!', '。') from msg;
+--------------------------------------------------+
| replace(content, '!', '。')                     |
+--------------------------------------------------+
| 纸上得来终觉浅,绝知此事要躬行。                    |
| 你好。                                           |
| 你吃了吗?                                        |
| 会当凌绝顶,一览众山小。                           |
+--------------------------------------------------+
4 rows in set (0.00 sec)

# 9. [substring] 截取字符串,从第二个开始截取2个字符
mysql> select substring(content, 2, 2) from msg;
+--------------------------+
| substring(content, 2, 2) |
+--------------------------+
| 上得                     |
| 好!                     |
| 吃了                     |
| 当凌                     |
+--------------------------+
4 rows in set (0.00 sec)

# 10. 以首字母小写的方式显示
mysql> select ename, concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) from emp;
+--------+------------------------------------------------------------+
| ename  | concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) |
+--------+------------------------------------------------------------+
| SMITH  | sMITH                                                      |
| ALLEN  | aLLEN                                                      |
| WARD   | wARD                                                       |
| JONES  | jONES                                                      |
| MARTIN | mARTIN                                                     |
| BLAKE  | bLAKE                                                      |
| CLARK  | cLARK                                                      |
| SCOTT  | sCOTT                                                      |
| KING   | kING                                                       |
| TURNER | tURNER                                                     |
| ADAMS  | aDAMS                                                      |
| JAMES  | jAMES                                                      |
| FORD   | fORD                                                       |
| MILLER | mILLER                                                     |
+--------+------------------------------------------------------------+
14 rows in set (0.00 sec)

# 11. [ltrim, rtrim, trim] 去除字符串中的空格(无法去除字符串中间的空格)
mysql> select ltrim('      你好      ') as res;
+--------------+
| res          |
+--------------+
| 你好         |
+--------------+
1 row in set (0.00 sec)

mysql> select rtrim('      你好      ') as res;
+--------------+
| res          |
+--------------+
|       你好   |
+--------------+
1 row in set (0.00 sec)

mysql> select trim('      你好      ') as res;
+--------+
| res    |
+--------+
| 你好   |
+--------+
1 row in set (0.00 sec)

数学函数

函数名称 描述
abs(number) 绝对值
bin(decimal_number) 十进制转换成二进制
hex(decimalNumber) 转换成十六进制
conv(number, from_base, to_base) 进制转换
ceiling(number) 向上取整
floor(number) 向下取整
format(number) 格式化,保留小数位数
rand() 返回随机浮点数,范围[0.0, 1.0)
mod(number, denominator) 取模,求余

其他函数

函数名称 描述
user() 查询当前用户
database() 查询当前数据库
md5(str) 对一个字符串进行md5摘要,得到一个32位字符串
password(str) MySQL对一个字符串进行密码摘要,得到一个字符串(mysql8.0删除了这个函数)
ifnull(v1, v2) 如果v1是null,则返回v2,否则返回v1

在数据库中,一般我们创建新的用户,不会直接把用户的密码存在数据库中,而是先进行md5摘要或者password之后,把得到的一串字符串保存在数据库中。当用户登录的时候,先对用户输入的密码进行md5或password拿到一串字符串,再去比对库中的字符串,如果相等则密码正确。所以只有用户本身和使用md5或password函数的人知道真正的密码,其他人都是不知道的。

mysql> insert into user_ps (name, password) values('李四', md5('hello world'));
Query OK, 1 row affected (0.00 sec)

mysql> select * from user_ps;
+----+--------+----------------------------------+
| id | name   | password                         |
+----+--------+----------------------------------+
|  1 | 张三   | abcd1234                         |
|  2 | 张三   | 25d55ad283aa400af464c76d713c07ad |
|  3 | 李四   | 5eb63bbbe01eeed093cb22bb8f5acdc3 |
+----+--------+----------------------------------+
3 rows in set (0.00 sec)

mysql> select name from user_ps where name='李四' and password='hello world';
Empty set (0.00 sec)

mysql> select name from user_ps where name='李四' and password=md5('hello world');
+--------+
| name   |
+--------+
| 李四   |
+--------+
1 row in set (0.00 sec)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇