【MySQL】内置函数详解

📢博客主页:https://blog.csdn.net/2301_779549673

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 JohnKi 原创,首发于 CSDN🙉

📢未来很长,值得我们全力奔赴更美好的生活✨

文章目录


📢前言

MySQL内置函数丰富多样,能够极大地提高数据库操作的效率和灵活性。本文将详细介绍MySQL内置函数,帮助读者更好地理解和运用这些强大的工具。

MySQL的内置函数可以分为多

个类别,包括日期函数、字符串函数、数学函数、加密函数、流程控制函数和其他函数等。这些函数在数据库操作中起着至关重要的作用,可以帮助我们更高效地处理数据。


🏳️‍🌈1 日期函数

MySQL 提供了丰富的日期函数,用于处理日期和时间数据。这些函数可以帮助我们获取当前日期和时间、进行日期的加减运算、计算日期之间的差值等。

  1. 获得年月日
    current_date() :返回当前日期,格式为 YYYY-MM-D
cpp 复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2024-12-11     |
+----------------+
1 row in set (0.00 sec)
  1. 获得时分秒
    current_time() :只显示当前时间,格式为 HH:MM:SS
cpp 复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 12:08:06       |
+----------------+
1 row in set (0.00 sec)
  1. 获得时间戳
    current_timestamp() :返回当前时间戳,格式为 YYYY-MM-DD HH:MM:SS
cpp 复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2024-12-11 12:08:15 |
+---------------------+
1 row in set (0.00 sec)
  1. 日期的基础上加时间
    date_add(date, interval d_value_type):在给定的日期上添加指定的时间间隔
cpp 复制代码
mysql> select date_add('2024-12-11', interval 10 day);
+-----------------------------------------+
| date_add('2024-12-11', interval 10 day) |
+-----------------------------------------+
| 2024-12-21                              |
+-----------------------------------------+
1 row in set (0.00 sec)
  1. 在日期的基础上减日期
    date_sub(date, interval d_value_type):在给定的日期上减去指定的时间间隔
cpp 复制代码
mysql> select date_sub('2024-12-11', interval 20 day);
+-----------------------------------------+
| date_sub('2024-12-11', interval 20 day) |
+-----------------------------------------+
| 2024-11-21                              |
+-----------------------------------------+
1 row in set (0.00 sec)
  1. 计算两个日期之间相差多少天
    datediff(date1, date2) :计算两个日期之间的时间差,单位是
cpp 复制代码
mysql> select datediff('2024-12-11', '2004-8-28');
+-------------------------------------+
| datediff('2024-12-11', '2004-8-28') |
+-------------------------------------+
|                                7410 |
+-------------------------------------+
1 row in set (0.00 sec)
  1. 获得当前时间
    now():返回当前日期时间
cpp 复制代码
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2024-12-11 12:14:05 |
+---------------------+
1 row in set (0.00 sec)

❤️案例-1:创建一张表,记录生日

添加一张表

cpp 复制代码
mysql> create table tmp(
    -> id bigint primary key auto_increment,
    -> birthday date not null
    -> );
Query OK, 0 rows affected (0.03 sec)

插入数据

cpp 复制代码
mysql> insert into tmp(birthday) values('2004-08-28');
Query OK, 1 row affected (0.00 sec)

mysql> insert into tmp(birthday) values('2004-7-28');
Query OK, 1 row affected (0.00 sec)

mysql> insert into tmp(birthday) values('1949-10-1');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 2004-08-28 |
|  2 | 2004-07-28 |
|  3 | 1949-10-01 |
+----+------------+
3 rows in set (0.00 sec)

🧡案例-2:创建一个留言表

添加一张表

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

插入数据

cpp 复制代码
mysql> insert into msg(content, sendtime) 
	values('纸上得来终觉浅,绝知此事要躬行。', nowQuery OK, 1 row affected (0.00 sec)

mysql> select * from msg;
+----+--------------------------------------------------+---------------------+
| id | content                                          | sendtime            |
+----+--------------------------------------------------+---------------------+
|  1 | 纸上得来终觉浅,绝知此事要躬行。                 | 2024-12-11 12:31:24 |
+----+--------------------------------------------------+---------------------+
1 row in set (0.00 sec)

mysql> insert into msg(content, sendtime) values('北国风光,千里冰封,万里雪飘。', now());
Query OK, 1 row affected (0.00 sec)

mysql> select * from msg;
+----+--------------------------------------------------+---------------------+
| id | content                                          | sendtime            |
+----+--------------------------------------------------+---------------------+
|  1 | 纸上得来终觉浅,绝知此事要躬行。                 | 2024-12-11 12:31:24 |
|  3 | 北国风光,千里冰封,万里雪飘。                   | 2024-12-11 12:34:06 |
+----+--------------------------------------------------+---------------------+
2 rows in set (0.00 sec)

查询在2分钟内发布的帖子

cpp 复制代码
理解:
------------------------------|-----------|-------------|------------------
							初始时间 	now() 		初始时间+2min
cpp 复制代码
mysql> select * from msg where date_add(sendtime, interval 2 minute) > now();
+----+-----------------------------------------------+---------------------+
| id | content                                       | sendtime            |
+----+-----------------------------------------------+---------------------+
|  1 | 纸上得来终觉浅,绝知此事要躬行                | 2024-12-11 12:53:14 |
|  2 | 北国风光,千里冰封,万里雪飘                  | 2024-12-11 12:53:34 |
|  3 | 恰同学少年,风华正茂                          | 2024-12-11 12:53:54 |
+----+-----------------------------------------------+---------------------+
3 rows in set (0.00 sec)

🏳️‍🌈2 字符串函数

字符串函数在MySQL中用于处理字符串数据。这些函数可以帮助我们拼接字符串、转换字符串的大小写、截取字符串、替换字符串中的子串等。

注意事项

这些函数都不是真正的去修改数据库中的数据,而是在 select 语句中显示。

  • length(s):计算字符串长度函数,返回字符串的字节长度。例如,SELECT length('Hello');可能返回5,因为在默认编码下,一个字母占用一个字节。
  • concat(s1,s2...,sn):合并字符串函数,返回结果为连接参数产生的字符串,参数可以是一个或多个。例如,SELECT concat('Hello', ', ', 'world!');返回Hello, world!。
  • lower(string) / lcase(string):将字符串中的字母转换为小写。例如,SELECT lower('HELLO');返回hello。
  • upper(string) / ucase(string):将字符串中的字母转换为大写。例如,SELECT upper('hello');返回HELLO。
  • left(string,x):返回字符串string中最左边的x个字符。例如,SELECT left('Hello', 3);返回Hel。
  • right(string,x):返回字符串string中最右边的x个字符。例如,SELECT right('Hello', 3);返回llo。
  • replace(str,search_str,replace_str):在str中用replace_str替换search_str,并返回替换后的新字符串。例如,SELECT replace('Hello world', 'world', 'MySQL');返回Hello MySQL。
  • substring(str,pos[,length]):从str的pos位置开始,取length个字符串。例如,SELECT substring('Hello world', 7);返回world。
  • reverse(string):返回颠倒字符串string的结果。例如,SELECT reverse('Hello');返回olleH。
  • strcmp(string1, string2):逐字符比较两个字符串的大小。例如,SELECT strcmp('Hello', 'Hello');返回0,SELECT strcmp('Hello', 'Hi');返回正数,SELECT strcmp('Hi', 'Hello');返回负数。=
  • trim(string):删除字符串左右两侧的空格。例如,SELECT trim(' Hello ');返回Hello。
  • ltrim(string):去除左侧空格。例如,SELECT ltrim(' Hello ');返回Hello 。
  • rtrim(string):去除右侧空格。例如,SELECT rtrim(' Hello ');返回 Hello。
  • charset(string):返回字符串字符集。例如,SELECT charset('Hello');可能返回数据库的默认字符集。

用到的数据表

cpp 复制代码
mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)

mysql> show create table emp;
+-------+--------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
+-------+--------------------------------------------------------------------------------------------------+
| emp   | CREATE TABLE `emp` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8                                 |
+-------+--------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

获取emp表的ename列的字符集

cpp 复制代码
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)

将EMP表中所有名字中有S的替换成'上海'

cpp 复制代码
mysql> select replace(ename, 'S', '上海') ,ename from emp;
+-------------------------------+--------+
| replace(ename, 'S', '上海')   | ename  |
+-------------------------------+--------+
| 上海MITH                      | SMITH  |
| ALLEN                         | ALLEN  |
| WARD                          | WARD   |
| JONE上海                      | JONES  |
| MARTIN                        | MARTIN |
| BLAKE                         | BLAKE  |
| CLARK                         | CLARK  |
| 上海COTT                      | SCOTT  |
| KING                          | KING   |
| TURNER                        | TURNER |
| ADAM上海                      | ADAMS  |
| JAME上海                      | JAMES  |
| FORD                          | FORD   |
| MILLER                        | MILLER |
+-------------------------------+--------+
14 rows in set (0.00 sec)

截取EMP表中ename字段的第二个到第三个字符

cpp 复制代码
mysql> select substring(ename, 2, 2), ename from emp;
+------------------------+--------+
| substring(ename, 2, 2) | ename  |
+------------------------+--------+
| MI                     | SMITH  |
| LL                     | ALLEN  |
| AR                     | WARD   |
| ON                     | JONES  |
| AR                     | MARTIN |
| LA                     | BLAKE  |
| LA                     | CLARK  |
| CO                     | SCOTT  |
| IN                     | KING   |
| UR                     | TURNER |
| DA                     | ADAMS  |
| AM                     | JAMES  |
| OR                     | FORD   |
| IL                     | MILLER |
+------------------------+--------+
14 rows in set (0.00 sec)

以首字母小写的方式显示所有员工的姓名

cpp 复制代码
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)

🏳️‍🌈3 数学函数

数学函数在MySQL中用于进行数学计算。这些函数可以帮助我们计算绝对值、进行进制转换、取整、格式化数字、生成随机数等。

绝对值

cpp 复制代码
mysql> select abs(-100.2);
+-------------+
| abs(-100.2) |
+-------------+
|       100.2 |
+-------------+
1 row in set (0.00 sec)

向上取整

cpp 复制代码
mysql> select ceiling(100.22);
+-----------------+
| ceiling(100.22) |
+-----------------+
|             101 |
+-----------------+
1 row in set (0.00 sec)

向下取整

cpp 复制代码
mysql> select floor(100.22);
+---------------+
| floor(100.22) |
+---------------+
|           100 |
+---------------+
1 row in set (0.00 sec)

保留2位小数位数(小数四舍五入

cpp 复制代码
mysql> select format(12.3456, 2);
+--------------------+
| format(12.3456, 2) |
+--------------------+
| 12.35              |
+--------------------+
1 row in set (0.00 sec)

产生随机数

cpp 复制代码
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.6465092046619478 |
+--------------------+
1 row in set (0.00 sec)

🏳️‍🌈4 其它函数

user() 查询当前用户

cpp 复制代码
mysql> select user();
+--------+
| user() |
+--------+
| root@  |
+--------+
1 row in set (0.00 sec)

md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串

cpp 复制代码
mysql> select md5('admin');
+----------------------------------+
| md5('admin')                     |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select md5('abc');
+----------------------------------+
| md5('abc')                       |
+----------------------------------+
| 900150983cd24fb0d6963f7d28e17f72 |
+----------------------------------+
1 row in set (0.00 sec)

database()显示当前正在使用的数据库

cpp 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mall               |
| mysql              |
| performance_schema |
| scott              |
| sys                |
| test_12_10         |
| test_12_11         |
| test_database      |
| test_db            |
+--------------------+
10 rows in set (0.00 sec)

password()函数,MySQL数据库使用该函数对用户加密

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

ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值

cpp 复制代码
mysql> select ifnull('abc', '123');
+----------------------+
| ifnull('abc', '123') |
+----------------------+
| abc                  |
+----------------------+
1 row in set (0.00 sec)

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

👥总结

本篇博文对 【MySQL】内置函数 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

相关推荐
且行志悠3 分钟前
Mysql的使用
mysql
白鹭4 分钟前
MySQL源码部署(rhel7)
数据库·mysql
666和77732 分钟前
Struts2 工作总结
java·数据库
还听珊瑚海吗36 分钟前
SpringMVC(一)
数据库
雨白1 小时前
实现双向滑动的 ScalableImageView(上)
android
星期天要睡觉2 小时前
MySQL 综合练习
数据库·mysql
Y4090012 小时前
数据库基础知识——聚合函数、分组查询
android·数据库
JosieBook3 小时前
【数据库】MySQL 数据库创建存储过程及使用场景详解
数据库·mysql