本文最后更新于 362 天前,如有失效请评论区留言。
日期函数
| 函数名称 |
描述 |
current_date() |
当前日期 |
current_time() |
当前时间 |
current_timestamp() |
当前时间戳 |
date(datetime) |
返回 datetime 参数的日期部分 |
date_add(date, interval d_value_type) |
在 date 中添加日期或时间,interval 后的数值单位可以是:year、minute、second、day |
date_sub(date, interval d_value_type) |
在 date 中减去日期或时间,interval 后的数值单位可以是:year、minute、second、day |
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) |
返回 substring 在 string 中出现的位置,没有返回 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]) |
从 str 的 position 开始,取 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)