【MySQL】9.MySQL内置函数

文章目录

  • [7. 函数](#7. 函数)
    • [7.1 日期函数](#7.1 日期函数)
      • [7.1.1 案例1](#7.1.1 案例1)
      • [7.1.2 案例2](#7.1.2 案例2)
    • [7.2 字符串函数](#7.2 字符串函数)
    • [7.3 数学函数](#7.3 数学函数)
    • [7.4 其它函数](#7.4 其它函数)

7. 函数

7.1 日期函数

  • 获得年月日:
mysql 复制代码
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2025-05-06     |
+----------------+
1 row in set (0.00 sec)
  • 获得时分秒:
mysql 复制代码
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 21:38:38       |
+----------------+
1 row in set (0.00 sec)
  • 获得时间戳:
mysql 复制代码
mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2025-05-06 21:38:48 |
+---------------------+
1 row in set (0.00 sec)
  • 在日期的基础上加日期:
mysql 复制代码
mysql> select date_add('2017-10-28', interval 10 day);
+-----------------------------------------+
| date_add('2017-10-28', interval 10 day) |
+-----------------------------------------+
| 2017-11-07                              |
+-----------------------------------------+
1 row in set (0.00 sec)
  • 在日期的基础上减去时间:
mysql 复制代码
mysql> select date_sub('2017-10-1', interval 2 day);
+---------------------------------------+
| date_sub('2017-10-1', interval 2 day) |
+---------------------------------------+
| 2017-09-29                            |
+---------------------------------------+
1 row in set (0.00 sec)
  • 计算两个日期之间相差多少天:
mysql 复制代码
mysql> select datediff('2017-10-10', '2016-9-1');
+------------------------------------+
| datediff('2017-10-10', '2016-9-1') |
+------------------------------------+
|                                404 |
+------------------------------------+
1 row in set (0.00 sec)

7.1.1 案例1

创建一张表,记录生日

mysql 复制代码
mysql> create table tmp(
    -> id int primary key auto_increment,
    -> birthday date
    -> );
Query OK, 0 rows affected (0.02 sec)

添加当前日期:

mysql 复制代码
mysql> insert into tmp(birthday) values(current_date()); 
Query OK, 1 row affected (0.01 sec)

mysql> insert into tmp(birthday) values(current_date()); 
Query OK, 1 row affected (0.01 sec)

mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 2025-05-06 |
|  2 | 2025-05-06 |
+----+------------+
2 rows in set (0.00 sec)

7.1.2 案例2

创建一个留言表

mysql 复制代码
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 复制代码
mysql> insert into msg(content,sendtime) values('hello1', now());
Query OK, 1 row affected (0.00 sec)

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

mysql> select * from msg;
+----+---------+---------------------+
| id | content | sendtime            |
+----+---------+---------------------+
|  1 | hello1  | 2025-05-06 21:42:33 |
|  2 | hello2  | 2025-05-06 21:42:38 |
+----+---------+---------------------+
2 rows in set (0.00 sec)

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

mysql 复制代码
mysql> select content,date(sendtime) from msg;
+---------+----------------+
| content | date(sendtime) |
+---------+----------------+
| hello1  | 2025-05-06     |
| hello2  | 2025-05-06     |
+---------+----------------+
2 rows in set (0.00 sec)

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

mysql 复制代码
mysql> select * from msg where date_add(sendtime, interval 2 minute) > now();
+----+---------+---------------------+
| id | content | sendtime            |
+----+---------+---------------------+
|  1 | hello1  | 2025-05-06 21:42:33 |
|  2 | hello2  | 2025-05-06 21:42:38 |
+----+---------+---------------------+
2 rows in set (0.00 sec)

理解:
------------------------------|-----------|-------------|------------------
                           初始时间     now()       初始时间+2min      

7.2 字符串函数

案例:

设计emp表

mysql 复制代码
mysql> CREATE TABLE `emp` (
    ->   `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
    ->   `ename` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '雇员姓名',
    ->   `job` varchar(15) 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 '部门编号',
    ->   PRIMARY KEY (`empno`),
    ->   KEY `idx_ename` (`ename`),
    ->   KEY `idx_job` (`job`),
    ->   KEY `idx_deptno` (`deptno`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工信息表';
Query OK, 0 rows affected, 9 warnings (0.03 sec)

插入数据

mysql 复制代码
mysql> INSERT INTO emp VALUES 
    -> (007369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20),
    -> (007499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30),
    -> (007521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30),
    -> (007566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20),
    -> (007654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30),
    -> (007698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30),
    -> (007782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10),
    -> (007788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000.00, NULL, 20),
    -> (007839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10),
    -> (007844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30),
    -> (007876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100.00, NULL, 20),
    -> (007900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30),
    -> (007902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20),
    -> (007934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10),
    -> (008001, '张三', '程序员', 7566, '2023-01-15', 4500.00, NULL, 20),
    -> (008002, '李四', '销售代表', 7698, '2023-02-01', 3800.00, 600.00, 30);
Query OK, 16 rows affected (0.00 sec)
Records: 16  Duplicates: 0  Warnings: 0

获取emp表的ename列的字符集

mysql 复制代码
mysql> SELECT charset(ename) FROM emp;
+----------------+
| charset(ename) |
+----------------+
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
| utf8mb3        |
+----------------+
16 rows in set (0.00 sec)

要求显示exam_result表中的信息,显示格式:"XXX的工资是XXX元,职位是XXX元"

mysql 复制代码
mysql> SELECT CONCAT(ename, '的工资是', sal, '元,职位是', job) AS '员工信息' 
    -> FROM emp;
+------------------------------------------------------+
| 员工信息                                             |
+------------------------------------------------------+
| SMITH的工资是800.00元,职位是CLERK                   |
| ALLEN的工资是1600.00元,职位是SALESMAN               |
| WARD的工资是1250.00元,职位是SALESMAN                |
| JONES的工资是2975.00元,职位是MANAGER                |
| MARTIN的工资是1250.00元,职位是SALESMAN              |
| BLAKE的工资是2850.00元,职位是MANAGER                |
| CLARK的工资是2450.00元,职位是MANAGER                |
| SCOTT的工资是3000.00元,职位是ANALYST                |
| KING的工资是5000.00元,职位是PRESIDENT               |
| TURNER的工资是1500.00元,职位是SALESMAN              |
| ADAMS的工资是1100.00元,职位是CLERK                  |
| JAMES的工资是950.00元,职位是CLERK                   |
| FORD的工资是3000.00元,职位是ANALYST                 |
| MILLER的工资是1300.00元,职位是CLERK                 |
| 张三的工资是4500.00元,职位是程序员                  |
| 李四的工资是3800.00元,职位是销售代表                |
+------------------------------------------------------+
16 rows in set (0.00 sec)

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

mysql 复制代码
mysql> SELECT LENGTH(ename) AS name_bytes, ename 
    -> FROM emp;
+------------+--------+
| name_bytes | ename  |
+------------+--------+
|          5 | ADAMS  |
|          5 | ALLEN  |
|          5 | BLAKE  |
|          5 | CLARK  |
|          4 | FORD   |
|          5 | JAMES  |
|          5 | JONES  |
|          4 | KING   |
|          6 | MARTIN |
|          6 | MILLER |
|          5 | SCOTT  |
|          5 | SMITH  |
|          6 | TURNER |
|          4 | WARD   |
|          6 | 张三   |
|          6 | 李四   |
+------------+--------+
16 rows in set (0.00 sec)

注意:length函数返回字符串长度,以字节为单位。

如果是多字节字符则计算多个字节数,如果是单字节字符则算作一个字节。

比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

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

mysql 复制代码
mysql> SELECT REPLACE(ename, 'S', '上海'), ename 
    -> FROM emp;
+-------------------------------+--------+
| REPLACE(ename, 'S', '上海')   | ename  |
+-------------------------------+--------+
| ADAM上海                      | ADAMS  |
| ALLEN                         | ALLEN  |
| BLAKE                         | BLAKE  |
| CLARK                         | CLARK  |
| FORD                          | FORD   |
| JAME上海                      | JAMES  |
| JONE上海                      | JONES  |
| KING                          | KING   |
| MARTIN                        | MARTIN |
| MILLER                        | MILLER |
| 上海COTT                      | SCOTT  |
| 上海MITH                      | SMITH  |
| TURNER                        | TURNER |
| WARD                          | WARD   |
| 张三                          | 张三   |
| 李四                          | 李四   |
+-------------------------------+--------+
16 rows in set (0.00 sec)

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

mysql 复制代码
mysql> SELECT SUBSTRING(ename, 2, 2) AS name_substr, ename 
    -> FROM emp;
+-------------+--------+
| name_substr | ename  |
+-------------+--------+
| DA          | ADAMS  |
| LL          | ALLEN  |
| LA          | BLAKE  |
| LA          | CLARK  |
| OR          | FORD   |
| AM          | JAMES  |
| ON          | JONES  |
| IN          | KING   |
| AR          | MARTIN |
| IL          | MILLER |
| CO          | SCOTT  |
| MI          | SMITH  |
| UR          | TURNER |
| AR          | WARD   |
| 三          | 张三   |
| 四          | 李四   |
+-------------+--------+
16 rows in set (0.00 sec)

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

mysql 复制代码
mysql> SELECT CONCAT(LCASE(SUBSTRING(ename, 1, 1)), SUBSTRING(ename, 2)) AS formatted_name, ename 
    -> FROM emp;
+----------------+--------+
| formatted_name | ename  |
+----------------+--------+
| aDAMS          | ADAMS  |
| aLLEN          | ALLEN  |
| bLAKE          | BLAKE  |
| cLARK          | CLARK  |
| fORD           | FORD   |
| jAMES          | JAMES  |
| jONES          | JONES  |
| kING           | KING   |
| mARTIN         | MARTIN |
| mILLER         | MILLER |
| sCOTT          | SCOTT  |
| sMITH          | SMITH  |
| tURNER         | TURNER |
| wARD           | WARD   |
| 张三           | 张三   |
| 李四           | 李四   |
+----------------+--------+
16 rows in set (0.00 sec)

7.3 数学函数

绝对值

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

向上取整

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

向下取整

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

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

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

产生随机数

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

7.4 其它函数

user() 查询当前用户

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

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

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

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

mysql 复制代码
mysql> select database();
+------------+
| database() |
+------------+
| test_db    |
+------------+
1 row in set (0.00 sec)

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

mysql 复制代码
# 低版本
select password('root');
 +-------------------------------------------+
 | password('root')                         |
 +-------------------------------------------+
 | *81F5E21E35407D884A6CD4A631AEBFB6AF209E1B | 
 +-------------------------------------------+

# 高版本已弃用
mysql> select password('root');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('root')' at line 1

ifnull(val1, val2) 如果val1null,返回val2,否则返回val1的值。

如果 val1val2 都是 NULLIFNULL 函数会返回 NULL

mysql 复制代码
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)
相关推荐
Databend17 小时前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
墨狂之逸才18 小时前
Android TV WebView 遥控器按键处理:从全透传到白名单
android
plainGeekDev1 天前
MVC 写法 → MVVM
android·java·kotlin
恋猫de小郭1 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter
三少爷的鞋1 天前
“结构化”这个词,本质上就是——把混乱的东西变成有组织、有规则、有边界的东西
android
方白羽2 天前
Android Gradle 缓存与文件目录深度解析
android·gradle·android studio
李白客2 天前
KES新版MySQL兼容能力再升级意味着什么?
mysql·国产数据库
ClouGence2 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
曲幽2 天前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
plainGeekDev2 天前
单例模式 → object 声明
android·java·kotlin