关注

【MySQL】第十弹---编程必备:全面掌握日期、字符串、数学及其它关键函数

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】【MySQL】

目录

1. 函数

1.1 日期函数

1.2 字符串函数

1.3 数学函数

1.4 其它函数


1. 函数

1.1 日期函数

  • 获得年月日: 
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2024-09-17     |
+----------------+
1 row in set (0.00 sec)
  • 获得时分秒:
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 21:37:52       |
+----------------+
1 row in set (0.00 sec)
  • 获得时间戳(转化为日期+时间):
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2024-09-17 21:39:02 |
+---------------------+
1 row in set (0.00 sec)
  • 获得当前时间(日期+时间) 
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-09-17 21:44:10 |
+---------------------+
1 row in set (0.00 sec)
  • 在日期的基础上加日期:
# 加10天
mysql> select date_add('2022-01-1',interval 10 day);
+---------------------------------------+
| date_add('2022-01-1',interval 10 day) |
+---------------------------------------+
| 2022-01-11                            |
+---------------------------------------+
1 row in set (0.00 sec)

# 加10分钟
mysql> select date_add('2022-01-1',interval 10 minute);
+------------------------------------------+
| date_add('2022-01-1',interval 10 minute) |
+------------------------------------------+
| 2022-01-01 00:10:00                      |
+------------------------------------------+
1 row in set (0.00 sec)

# 加10秒
mysql> select date_add('2022-01-1',interval 10 second);
+------------------------------------------+
| date_add('2022-01-1',interval 10 second) |
+------------------------------------------+
| 2022-01-01 00:00:10                      |
+------------------------------------------+
1 row in set (0.00 sec)
  • 在日期的基础上减去时间:
# 减15天
mysql> select date_sub('2023-10-12',interval 15 day);
+----------------------------------------+
| date_sub('2023-10-12',interval 15 day) |
+----------------------------------------+
| 2023-09-27                             |
+----------------------------------------+
1 row in set (0.00 sec)

# 减15分钟
mysql> select date_sub('2023-10-12',interval 15 minute);
+-------------------------------------------+
| date_sub('2023-10-12',interval 15 minute) |
+-------------------------------------------+
| 2023-10-11 23:45:00                       |
+-------------------------------------------+
1 row in set (0.00 sec)

# 减15秒
mysql> select date_sub('2023-10-12',interval 15 second);
+-------------------------------------------+
| date_sub('2023-10-12',interval 15 second) |
+-------------------------------------------+
| 2023-10-11 23:59:45                       |
+-------------------------------------------+
1 row in set (0.00 sec)
  • 计算两个日期之间相差多少天(前面 - 后面):
mysql> select datediff('2023-10-15','2023-9-8');
+-----------------------------------+
| datediff('2023-10-15','2023-9-8') |
+-----------------------------------+
|                                37 |
+-----------------------------------+
1 row in set (0.00 sec)

mysql> select datediff('2023-9-8','2023-10-15');
+-----------------------------------+
| datediff('2023-9-8','2023-10-15') |
+-----------------------------------+
|                               -37 |
+-----------------------------------+
1 row in set (0.00 sec)

案例-1:

  • 创建一张表,记录生日
mysql> create table tmp(
    -> id int primary key auto_increment,
    -> birthday date);
Query OK, 0 rows affected (0.03 sec)

mysql> desc tmp;
+----------+---------+------+-----+---------+----------------+
| Field    | Type    | Null | Key | Default | Extra          |
+----------+---------+------+-----+---------+----------------+
| id       | int(11) | NO   | PRI | NULL    | auto_increment |
| birthday | date    | YES  |     | NULL    |                |
+----------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
  • 添加当前日期:
mysql> insert into tmp (birthday) values(current_date());
Query OK, 1 row affected (0.01 sec)

mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 2024-09-17 |
+----+------------+
1 row in set (0.00 sec)

案例-2:

  • 创建一个留言表
mysql> create table msg(
    -> id int primary key auto_increment,
    -> content varchar(30) not null,
    -> sendtime datetime);
Query OK, 0 rows affected (0.02 sec)

mysql> desc msg;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| content  | varchar(30) | NO   |     | NULL    |                |
| sendtime | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
  • 插入数据
mysql> insert into msg (content,sendtime) values('hello mysql',now());
Query OK, 1 row affected (0.01 sec)

mysql> insert into msg (content,sendtime) values('hello friend',now());
Query OK, 1 row affected (0.01 sec)

mysql> select * from msg;
+----+--------------+---------------------+
| id | content      | sendtime            |
+----+--------------+---------------------+
|  1 | hello mysql  | 2024-09-17 21:50:49 |
|  2 | hello friend | 2024-09-17 21:50:56 |
+----+--------------+---------------------+
2 rows in set (0.00 sec)
  • 显示所有留言信息,发布日期只显示日期,不用显示时间
mysql> select content,date(sendtime) from msg;
+--------------+----------------+
| content      | date(sendtime) |
+--------------+----------------+
| hello mysql  | 2024-09-17     |
| hello friend | 2024-09-17     |
+--------------+----------------+
2 rows in set (0.00 sec)
  • 请查询在2分钟内发布的帖子

表中插入数据的时间 + 2分钟大于当前时间就是两分钟内发布的帖子。

# 直接查看两分钟内f发布的帖子,已经过了两分钟因此没有查到
mysql> select * from msg where date_add(sendtime,interval 2 minute) > now();
Empty set (0.00 sec)

# 再插入一条信息
mysql> insert into msg (content,sendtime) values('excuse me',now());
Query OK, 1 row affected (0.01 sec)

# 继续查两分钟内的信息
mysql> select * from msg where date_add(sendtime,interval 2 minute) > now();
+----+-----------+---------------------+
| id | content   | sendtime            |
+----+-----------+---------------------+
|  3 | excuse me | 2024-09-17 21:55:52 |
+----+-----------+---------------------+
1 row in set (0.00 sec)

1.2 字符串函数

  • 获取字符串字符集
mysql> select charset('aaa');
+----------------+
| charset('aaa') |
+----------------+
| utf8           |
+----------------+
1 row in set (0.00 sec)
  • 获取emp表的ename列的字符集 
mysql> select charset(ename) from emp;
+----------------+
| charset(ename) |
+----------------+
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
+----------------+
14 rows in set (0.00 sec)
  • 连接字符串
mysql> select concat('abc','123',456);
+-------------------------+
| concat('abc','123',456) |
+-------------------------+
| abc123456               |
+-------------------------+
1 row in set (0.00 sec)
  • 要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分” 
mysql> select concat(name,'的语文是',chinese,'分,数学是',math,'分') from exam_result;
+------------------------------------------------------------------+
| concat(name,'的语文是',chinese,'分,数学是',math,'分')           |
+------------------------------------------------------------------+
| 唐三藏的语文是134分,数学是98分                                  |
| 猪悟能的语文是176分,数学是98分                                  |
| 曹孟德的语文是140分,数学是90分                                  |
| 刘玄德的语文是110分,数学是115分                                 |
| 孙权的语文是140分,数学是73分                                    |
| 宋公明的语文是150分,数学是95分                                  |
+------------------------------------------------------------------+
6 rows in set (0.00 sec)
  • 求学生表中学生姓名占用的字节数 
# 求的是字节大小,utf8编码下中文占三个字节
mysql> select name,length(name) from student;
+--------+--------------+
| name   | length(name) |
+--------+--------------+
| 张三   |            6 |
| 李四   |            6 |
| 王五   |            6 |
| 孙权   |            6 |
| 妲己   |            6 |
+--------+--------------+
5 rows in set (0.00 sec)

注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;
如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数
(与字符集编码有关) 

  • 求字符串占用字节数 
# 英文字符和数字占一个字节,中文占3字节(utf8编码)
mysql> select length('abcd中');
+-------------------+
| length('abcd中')  |
+-------------------+
|                 7 |
+-------------------+
1 row in set (0.00 sec)
  • 判断子串是否在主串中

在子串中返回起始下标(从1开始),否则返回0.

mysql> select instr('abcdef123','123a') bool;
+------+
| bool |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

mysql> select instr('abcdef123','123') bool;
+------+
| bool |
+------+
|    7 |
+------+
1 row in set (0.00 sec)
  • 转换成大小写
# 转换为大写
mysql> select ucase('abcdef') res;
+--------+
| res    |
+--------+
| ABCDEF |
+--------+
1 row in set (0.00 sec)

# 转换为小写
mysql> select lcase('ABCDEF') res;
+--------+
| res    |
+--------+
| abcdef |
+--------+
1 row in set (0.00 sec)
  • 从左右获取字符串
# 从左边取3个字符
mysql> select left('abcdef',3);
+------------------+
| left('abcdef',3) |
+------------------+
| abc              |
+------------------+
1 row in set (0.00 sec)

# 从右边取3个字符
mysql> select right('abcdef',3);
+-------------------+
| right('abcdef',3) |
+-------------------+
| def               |
+-------------------+
1 row in set (0.00 sec)
  • 将EMP表中所有名字中有S的替换成'上海'
mysql> select ename from emp;
+--------+
| ename  |
+--------+
| SMITH  |
| ALLEN  |
| WARD   |
| JONES  |
| MARTIN |
| BLAKE  |
| CLARK  |
| SCOTT  |
| KING   |
| TURNER |
| ADAMS  |
| JAMES  |
| FORD   |
| MILLER |
+--------+
14 rows in set (0.00 sec)

mysql> select replace(ename,'S','上海') from emp;
+-----------------------------+
| replace(ename,'S','上海')   |
+-----------------------------+
| 上海MITH                    |
| ALLEN                       |
| WARD                        |
| JONE上海                    |
| MARTIN                      |
| BLAKE                       |
| CLARK                       |
| 上海COTT                    |
| KING                        |
| TURNER                      |
| ADAM上海                    |
| JAME上海                    |
| FORD                        |
| MILLER                      |
+-----------------------------+
14 rows in set (0.00 sec)
  •  截取EMP表中ename字段的第二个到第三个字符
# 原表数据
mysql> select ename from emp;
+--------+
| ename  |
+--------+
| SMITH  |
| ALLEN  |
| WARD   |
| JONES  |
| MARTIN |
| BLAKE  |
| CLARK  |
| SCOTT  |
| KING   |
| TURNER |
| ADAMS  |
| JAMES  |
| FORD   |
| MILLER |
+--------+
14 rows in set (0.00 sec)

# 截取后数据
mysql> select substring(ename,2,2) from emp;
+----------------------+
| substring(ename,2,2) |
+----------------------+
| MI                   |
| LL                   |
| AR                   |
| ON                   |
| AR                   |
| LA                   |
| LA                   |
| CO                   |
| IN                   |
| UR                   |
| DA                   |
| AM                   |
| OR                   |
| IL                   |
+----------------------+
14 rows in set (0.00 sec)
  • 以首字母小写的方式显示所有员工的姓名

截取姓名的第一个字符,将第一个字符转换为小写,再拼接上从第二个字符开始的姓名。

mysql> select concat(lcase(substring(ename,1,1)),substring(ename,2)) from emp;
+--------------------------------------------------------+
| concat(lcase(substring(ename,1,1)),substring(ename,2)) |
+--------------------------------------------------------+
| sMITH                                                  |
| aLLEN                                                  |
| wARD                                                   |
| jONES                                                  |
| mARTIN                                                 |
| bLAKE                                                  |
| cLARK                                                  |
| sCOTT                                                  |
| kING                                                   |
| tURNER                                                 |
| aDAMS                                                  |
| jAMES                                                  |
| fORD                                                   |
| mILLER                                                 |
+--------------------------------------------------------+
14 rows in set (0.00 sec)
  • 去除前后空格

ltrim() 去除前空格,rtrim() 去除后空格,trim() 去除前后空格。

# 去除前空格
mysql> select ltrim('   nihao           ') res;
+------------------+
| res              |
+------------------+
| nihao            |
+------------------+
1 row in set (0.00 sec)

# 去除后空格
mysql> select rtrim('   nihao           ') res;
+----------+
| res      |
+----------+
|    nihao |
+----------+
1 row in set (0.00 sec)

# 去除后空格
mysql> select trim('   nihao           ') res;
+-------+
| res   |
+-------+
| nihao |
+-------+
1 row in set (0.00 sec)

1.3 数学函数

  • 绝对值 
mysql> select abs(100);
+----------+
| abs(100) |
+----------+
|      100 |
+----------+
1 row in set (0.00 sec)

mysql> select abs(-100);
+-----------+
| abs(-100) |
+-----------+
|       100 |
+-----------+
1 row in set (0.00 sec)
  • 向上取整(有小数则数值变大)
mysql> select ceiling(3.0);
+--------------+
| ceiling(3.0) |
+--------------+
|            3 |
+--------------+
1 row in set (0.00 sec)

mysql> select ceiling(3.1);
+--------------+
| ceiling(3.1) |
+--------------+
|            4 |
+--------------+
1 row in set (0.00 sec)

mysql> select ceiling(-3.1);
+---------------+
| ceiling(-3.1) |
+---------------+
|            -3 |
+---------------+
1 row in set (0.00 sec)

mysql> select ceiling(-3.9);
+---------------+
| ceiling(-3.9) |
+---------------+
|            -3 |
+---------------+
1 row in set (0.00 sec)
  • 向下取整(有小数则数值变大)
mysql> select floor(3.9);
+------------+
| floor(3.9) |
+------------+
|          3 |
+------------+
1 row in set (0.00 sec)

mysql> select floor(3.1);
+------------+
| floor(3.1) |
+------------+
|          3 |
+------------+
1 row in set (0.00 sec)

mysql> select floor(-3.1);
+-------------+
| floor(-3.1) |
+-------------+
|          -4 |
+-------------+
1 row in set (0.00 sec)
  • 保留2位小数位数(小数四舍五入)
mysql> select format(12.34125,2);
+--------------------+
| format(12.34125,2) |
+--------------------+
| 12.34              |
+--------------------+
1 row in set (0.00 sec)

# 5及以上则进1
mysql> select format(12.34525,2);
+--------------------+
| format(12.34525,2) |
+--------------------+
| 12.35              |
+--------------------+
1 row in set (0.00 sec)
  • 产生随机数 [0.0,1.0),左边可取,右边不可取。
mysql> select rand();
+-------------------+
| rand()            |
+-------------------+
| 0.586795278440039 |
+-------------------+
1 row in set (0.00 sec)

# 产生1-10之间的数
mysql> select rand()*10;
+-------------------+
| rand()*10         |
+-------------------+
| 8.999853217042846 |
+-------------------+
1 row in set (0.00 sec)

# 产生1-10的整数,使用format保留0位小数
mysql> select format(rand()*10,0);
+---------------------+
| format(rand()*10,0) |
+---------------------+
| 7                   |
+---------------------+
1 row in set (0.00 sec)

1.4 其它函数

  • user() 查询当前用户
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
  • md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串

可以使用对密码进行加密转换。

mysql> select md5('abcd123');
+----------------------------------+
| md5('abcd123')                   |
+----------------------------------+
| 79cfeb94595de33b3326c06ab1c7dbda |
+----------------------------------+
1 row in set (0.00 sec)

创建用户表

mysql> create table user1
    -> (id int primary key auto_increment,
    -> password char(32));
Query OK, 0 rows affected (0.02 sec)

插入密码

mysql> insert into user1 (password) values(123456);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user1;
+----+----------+
| id | password |
+----+----------+
|  1 | 123456   |
+----+----------+
1 row in set (0.00 sec)

通过上下键找不到插入密码的那行,因为密码会被mysql自动隐藏,但是如果直接能够使用select查看密码不安全,我们可以使用md5进行加密转换。

加密

mysql> insert into user1 (password) values(md5(123456));
Query OK, 1 row affected (0.01 sec)

mysql> select * from user1;
+----+----------------------------------+
| id | password                         |
+----+----------------------------------+
|  1 | 123456                           |
|  2 | e10adc3949ba59abbe56e057f20f883e |
+----+----------------------------------+
2 rows in set (0.00 sec)

mysql> delete from user1 where id = 2;
Query OK, 1 row affected (0.01 sec)

mysql> insert into user1 (password) values(md5(123));
Query OK, 1 row affected (0.00 sec)

mysql> select * from user1;
+----+----------------------------------+
| id | password                         |
+----+----------------------------------+
|  1 | 123456                           |
|  3 | 202cb962ac59075b964b07152d234b70 |
+----+----------------------------------+
2 rows in set (0.00 sec)

mysql> select id from user1 where password = '123';
Empty set (0.00 sec)

mysql> select id from user1 where password = md5('123');
+----+
| id |
+----+
|  3 |
+----+
1 row in set (0.01 sec)
  • password()函数,MySQL数据库使用该函数对用户加密
mysql> select password('12');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

对 '12' 字符串进行加密,会报不满足密码要求,此时需要查看密码的最低长度,该字符串的长度大于等于最低长度才能正确使用。 

补充

# 查看密码最低长度
show variables like '%password%';
show variables like 'validate_password%';

# 设置密码最低长度
set global validate_password_legnth=4;

 查看密码最低长度

mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

因为密码长度最少为4,因此对'12'进行加密会报错。 

正确方式 

mysql> select password('root');
+-------------------------------------------+
| password('root')                          |
+-------------------------------------------+
| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> select password('12345');
+-------------------------------------------+
| password('12345')                         |
+-------------------------------------------+
| *00A51F3F48415C7D4E8908980D443C29C69B60C9 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
  • ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值

类似于C语言三目表达式,第一个值不为空返回第一个值,为空返回第二个值。

# 第一个值为空返回第二个值
mysql> select ifnull(null,12);
+-----------------+
| ifnull(null,12) |
+-----------------+
|              12 |
+-----------------+
1 row in set (0.00 sec)

# 第一个值不为空返回第一个值
mysql> select ifnull(12,10);
+---------------+
| ifnull(12,10) |
+---------------+
|            12 |
+---------------+
1 row in set (0.00 sec)

mysql> select ifnull(12,null);
+-----------------+
| ifnull(12,null) |
+-----------------+
|              12 |
+-----------------+
1 row in set (0.00 sec)

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2201_75584283/article/details/142319360

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--