【MySQL】9. 内置函数

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】9. 内置函数

函数

1. 日期函数

在这里插入图片描述
获得年月日:

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

获得时分秒:

mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 12:35:51       |
+----------------+
1 row in set (0.00 sec)

获得时间戳:

mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2024-03-23 12:36:36 |
+---------------------+
1 row in set (0.00 sec)

在日期的基础上加日期:

select date_add('2017-10-28', interval 10 day);
+-----------------------------------------+
| date_add('2017-10-28', interval 10 day) |
+-----------------------------------------+
|                              2017-11-07 |
+-----------------------------------------+

在日期的基础上减去时间:

select date_sub('2017-10-1', interval 2 day);
+---------------------------------------+
| date_sub('2017-10-1', interval 2 day) |
+---------------------------------------+
|                            2017-09-29 |
+---------------------------------------+

计算两个日期之间相差多少天:

select datediff('2017-10-10', '2016-9-1');
+------------------------------------+
| datediff('2017-10-10', '2016-9-1') |
+------------------------------------+
|                                404 |
+------------------------------------+

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

create table tmp(
id int primary key auto_increment,
birthday date
);

添加当前日期:

insert into tmp(birthday) values(current_date());
mysql> select * from tmp;
+----+------------+
| id |  birthday  |
+----+------------+
| 1  | 2017-11-19 |
+----+------------+

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

mysql> create table msg (
id int primary key auto_increment,
content varchar(30) not null,
sendtime datetime
);

插入数据

mysql> insert into msg(content,sendtime) values('hello1', now());
mysql> insert into msg(content,sendtime) values('hello2', now());
mysql> select * from msg;
+----+---------+---------------------+
| id | content |            sendtime |
+----+---------+---------------------+
| 1  |  hello1 | 2017-11-19 14:12:20 |
| 2  |  hello2 | 2017-11-19 14:13:21 |
+----+---------+---------------------+

显示所有留言信息,发布日期只显示日期,不用显示时间

select content,date(sendtime) from msg;

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

select * from msg where date_add(sendtime, interval 2 minute) > now();
理解:
------------------------------|-----------|-------------|------------------
                           初始时间       now()      初始时间+2min

2. 字符串函数

在这里插入图片描述
这里的学习需要用到:
之前的exam_result 表格
具体的数据请看这篇文章!
和 scott 数据库
在标题7的位置

案例:

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)

获取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 * from exam_result;
+----+----------+---------+------+---------+
| id | name     | chinese | math | english |
+----+----------+---------+------+---------+
|  1 | 唐三藏    |      67 |   98 |      56 |
|  2 | 孙悟空    |      87 |   78 |      77 |
|  3 | 猪悟能    |      88 |   98 |      90 |
|  4 | 曹孟德    |      82 |   84 |      67 |
|  5 | 刘玄德    |      55 |   85 |      45 |
|  6 | 孙权      |      70 |   73 |      78 |
|  7 | 宋公明    |      75 |   65 |      30 |
+----+----------+---------+------+---------+
7 rows in set (0.00 sec)

要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分”

mysql> select concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from exam_result;
+------------------------------------------+
| 分数                                     |
+------------------------------------------+
| 唐三藏的语文是67分,数学是98|
| 孙悟空的语文是87分,数学是78|
| 猪悟能的语文是88分,数学是98|
| 曹孟德的语文是82分,数学是84|
| 刘玄德的语文是55分,数学是85|
| 孙权的语文是70分,数学是73|
| 宋公明的语文是75分,数学是65|
+------------------------------------------+

求学生表中学生姓名占用的字节数

mysql> select length(name), name from exam_result;
+--------------+----------+
| length(name) | name     |
+--------------+----------+
|            9 | 唐三藏    |
|            9 | 孙悟空    |
|            9 | 猪悟能    |
|            9 | 曹孟德    |
|            9 | 刘玄德    |
|            6 | 孙权      |
|            9 | 宋公明    |
+--------------+----------+
7 rows in set (0.00 sec)

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

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

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字段的第二个到第三个字符

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)

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

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> select abs(-100.2);
+-------------+
| abs(-100.2) |
+-------------+
|       100.2 |
+-------------+
1 row in set (0.00 sec)

向上取整

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

向下取整

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

在这里插入图片描述

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

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

产生随机数

mysql> select rand();
+-------------------+
| rand()            |
+-------------------+
| 0.663455332315951 |
+-------------------+
1 row in set (0.00 sec)

4. 其它函数

user() 查询当前用户

mysql> select user();
+--------+
| user() |
+--------+
| root@  |
+--------+
1 row in set (0.00 sec)

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

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

mysql> select md5(' ');
+----------------------------------+
| md5(' ')                         |
+----------------------------------+
| 7215ee9c7d9dc229d2921a40e899ec5f |
+----------------------------------+
1 row in set (0.00 sec)

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

在MySQL当中所有的密码存储都是不可显的,防止用户的密码信息泄露
md5函数会将任意类型的字符串转为不规律的32位字符串

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

mysql> select database();
+------------+
| database() |
+------------+
| scott      |
+------------+
1 row in set (0.00 sec)

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

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

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

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)

5. 实战OJ

SQL245 查找字符串中逗号出现的次数

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
JSON 关系型数据库 MySQL
Mysql(5)—函数
MySQL提供了许多内置的函数以帮助用户进行数据操作和分析。这些函数可以分为几类,包括聚合函数、字符串函数、数值函数、日期和时间函数、控制流函数等。
89 1
Mysql(5)—函数
|
12天前
|
SQL 关系型数据库 MySQL
MySQL常见函数第二期,你都用过哪些呢 ?
本期介绍了20个常用的MySQL函数,涵盖日期处理(如CURDATE()、DATE_FORMAT())、数学运算(如ABS()、ROUND())、统计分析(如COUNT()、SUM())等,帮助提高SQL查询效率和数据处理能力。希望对大家的学习有所帮助。
56 7
|
14天前
|
关系型数据库 MySQL
MySQL常见函数第一期,你都用过哪些呢 ?
本期介绍10个常用的MySQL函数:字符串连接(CONCAT)、提取子字符串(SUBSTRING)、获取字符串长度(LENGTH)、转换大小写(UPPER、LOWER)、去除空格(TRIM)、替换字符串(REPLACE)、查找子字符串位置(INSTR)、带分隔符的字符串连接(CONCAT_WS)以及获取当前日期时间(NOW)。
55 8
|
15天前
|
数据采集 关系型数据库 MySQL
MySQL常用函数:IF、SUM等用法
本文介绍了MySQL中常用的IF、SUM等函数及其用法,通过具体示例展示了如何利用这些函数进行条件判断、数值计算以及复杂查询。同时,文章还提到了CASE WHEN语句和其他常用函数,如COUNT、AVG、MAX/MIN等,强调了它们在数据统计分析、数据清洗和报表生成中的重要性。
|
19天前
|
关系型数据库 MySQL 数据处理
【MySQL】函数
MySQL 提供了丰富的函数集,涵盖字符串处理、数值运算、日期时间操作和聚合计算等多个方面。这些函数在日常数据库操作中极为重要,通过合理使用这些函数,可以大大提高数据处理和查询的效率。用户还可以通过自定义函数,扩展 MySQL 的功能以满足特定需求。
26 3
|
21天前
|
关系型数据库 MySQL 数据处理
MySQL函数与约束
MySQL 提供了丰富的函数和强大的约束机制,用于数据处理和完整性维护。通过掌握这些工具,可以有效地管理和分析数据库中的数据,确保数据的一致性和准确性。无论是在日常数据查询中使用内置函数,还是在数据库设计中应用各种约束,都是确保数据库系统稳定、高效运行的关键。希望本文对您理解和应用 MySQL 函数与约束有所帮助。
27 1
|
1月前
|
关系型数据库 MySQL Serverless
MySQL函数
最常用的MySQL函数,包括聚合函数,字符串函数,日期时间函数,控制流函数等
36 1
|
2月前
|
存储 SQL 关系型数据库
MySQL 存储函数及调用
MySQL 存储函数及调用
183 3
|
1月前
|
SQL NoSQL 关系型数据库
|
2月前
|
缓存 关系型数据库 MySQL
MySQL 满足条件函数中使用查询最大值函数
MySQL 满足条件函数中使用查询最大值函数
151 1