MySQL内置函数

发布于:2024-08-20 ⋅ 阅读:(29) ⋅ 点赞:(0)


img

MySQL内置函数

1、日期函数

函数名称 描述
CURDATE() 返回当前日期(不包含时间部分)。
CURTIME() 返回当前时间(不包含日期部分)。
NOW() 返回当前日期和时间。
DATE(datetime) 返回 datetime 的日期部分。
DATE_ADD(date, INTERVAL) 为日期添加指定的时间间隔。
DATE_SUB(date, INTERVAL) 从日期中减去指定的时间间隔。
DATEDIFF(date1, date2) 计算两个日期之间的天数差异。
DATE_FORMAT(date, format) 以指定的格式格式化日期。
STR_TO_DATE(str, format) 按指定格式解析字符串并转换为日期。
YEAR(date) 返回日期中的年份部分。
MONTH(date) 返回日期中的月份部分。
DAY(date) 返回日期中的日部分。
HOUR(time) 返回时间中的小时部分。
MINUTE(time) 返回时间中的分钟部分。
SECOND(time) 返回时间中的秒部分。
WEEK(date, mode) 返回日期所在的周数(0-53)。
DAYOFWEEK(date) 返回日期对应的一周中的天数(1=星期日, 2=星期一,…)。
LAST_DAY(date) 返回日期所在月份的最后一天。
FROM_UNIXTIME(unix_timestamp) 将 UNIX 时间戳转换为日期。
UNIX_TIMESTAMP() 返回当前时间的 UNIX 时间戳。
SEC_TO_TIME(seconds) 将秒数转换为时间。
-- 获取当前日期(年月日)
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2024-08-18     |
+----------------+
1 row in set (0.02 sec)

-- 获取当前时间
mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 16:36:10       |
+----------------+
1 row in set (0.00 sec)

-- 在日期的基础上加时间
mysql> select date_add('2024-08-18',interval 10 day);
+----------------------------------------+
| date_add('2024-08-18',interval 10 day) |
+----------------------------------------+
| 2024-08-28                             |
+----------------------------------------+
1 row in set (0.01 sec)

-- 在日期的基础上减时间
mysql> select date_sub('2024-08-18',interval 20 day);
+----------------------------------------+
| date_sub('2024-08-18',interval 20 day) |
+----------------------------------------+
| 2024-07-29                             |
+----------------------------------------+
1 row in set (0.00 sec)

-- 计算两个日期之间相差多少天
mysql> select datediff('2024-08-18','2024-07-29');
+-------------------------------------+
| datediff('2024-08-18','2024-07-29') |
+-------------------------------------+
|                                  20 |
+-------------------------------------+
1 row in set (0.00 sec)
  • 案例1:
mysql> create database test6;
Query OK, 1 row affected (0.00 sec)

mysql> use test6;
Database changed
mysql> create table tmp(
   -> id int primary key auto_increment,
   -> brithday date
   -> );
Query OK, 0 rows affected (0.33 sec)

mysql> insert into tmp(brithday) values(current_time());
Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> select * from tmp;
+----+------------+
| id | brithday   |
+----+------------+
|  1 | 2024-08-18 |
+----+------------+
1 row in set (0.00 sec)
  • 案例2:
mysql> create table msg( 
   -> id int primary key auto_increment,
   -> content varchar(30) not null,
   -> senttime datetime
   -> );
Query OK, 0 rows affected (0.05 sec)

mysql> insert into msg(content,senttime) values('hello i am 1',current_time()),('hello i am 2',current_time());
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into msg(content,senttime) values('hello i am 3',current_time());
Query OK, 1 row affected (0.00 sec)

mysql> select * from msg;
+----+--------------+---------------------+
| id | content      | senttime            |
+----+--------------+---------------------+
|  1 | hello i am 1 | 2024-08-18 16:46:36 |
|  2 | hello i am 2 | 2024-08-18 16:46:36 |
|  3 | hello i am 3 | 2024-08-18 16:47:51 |
+----+--------------+---------------------+
3 rows in set (0.00 sec)

mysql> 

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

mysql> select content,date(senttime) from msg;
+--------------+----------------+
| content      | date(senttime) |
+--------------+----------------+
| hello i am 1 | 2024-08-18     |
| hello i am 2 | 2024-08-18     |
| hello i am 3 | 2024-08-18     |
+--------------+----------------+
3 rows in set (0.00 sec)

mysql>

查询在10分钟内发布的消息:

mysql> select * from msg where date_add(senttime,interval 10 minute) > now();
+----+--------------+---------------------+
| id | content      | senttime            |
+----+--------------+---------------------+
|  1 | hello i am 1 | 2024-08-18 16:46:36 |
|  2 | hello i am 2 | 2024-08-18 16:46:36 |
|  3 | hello i am 3 | 2024-08-18 16:47:51 |
+----+--------------+---------------------+
3 rows in set (0.00 sec)

mysql>

2、字符串函数

函数 描述
charset(str) 返回字符串字符集
concat(string2 [, ...]) 连接字符串
instr(string, substring) 返回 substringstring 中出现的位置,如果没有则返回 0
ucase(string2) 转换成大写
lcase(string2) 转换成小写
left(string2, length) string2 中的左边起取 length 个字符
length(string) 返回 string 的长度
replace(str, search_str, replace_str) str 中用 replace_str 替换 search_str
strcmp(string1, string2) 逐字符比较两个字符串大小
substring(str, position [, length]) strposition 开始,取 length 个字符
ltrim(string) rtrim(string) trim(string) 去除前空格、后空格或两端空格

案例:

  • 获取EMP表的ename字段的字符集:
mysql> select charset(ename) from EMP;
+----------------+
| charset(ename) |
+----------------+
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
| utf8           |
+----------------+
13 rows in set (0.02 sec)
  • 要求显示exam_result表中的信息,格式为“XXX的语文是XX分,数学是XX分,英语XX分”:
mysql> select concat(name,'的语文是',chinese,'分,数学是',math,'分') as '分数' from exam_result;
+-----------------------------------------------+
| 分数                                          |
+-----------------------------------------------+
| 唐三藏的语文是134分,数学是98分               |
| 猪悟能的语文是176分,数学是98分               |
| 曹孟德的语文是140分,数学是90分               |
| 刘玄德的语文是110分,数学是115分              |
| 孙权的语文是140分,数学是73分                 |
| 宋公明的语文是150分,数学是95分               |
+-----------------------------------------------+
6 rows in set (0.01 sec)

mysql> 
  • 显示exam_result表中的姓名占用的字节数:
mysql> select length(name),name from exam_result;
+--------------+-----------+
| length(name) | name      |
+--------------+-----------+
|            9 | 唐三藏    |
|            9 | 猪悟能    |
|            9 | 曹孟德    |
|            9 | 刘玄德    |
|            6 | 孙权      |
|            9 | 宋公明    |
+--------------+-----------+
6 rows in set (0.01 sec)

mysql> 

注意:length函数返回的长度以字节为单位。一个字母算1个自己,一个汉字占多个字节(utf8占2个字节)。

  • 把EMP表中的所有名字中有S的替换为’云南’:
mysql> select replace(ename,'S','云南'),ename from EMP;
+-----------------------------+--------+
| replace(ename,'S','云南')   | ename  |
+-----------------------------+--------+
| 云南MITH                    | SMITH  |
| ALLEN                       | ALLEN  |
| WARD                        | WARD   |
| JONE云南                    | JONES  |
| BLAKE                       | BLAKE  |
| CLARK                       | CLARK  |
| 云南COTT                    | SCOTT  |
| KING                        | KING   |
| TURNER                      | TURNER |
| ADAM云南                    | ADAMS  |
| JAME云南                    | JAMES  |
| FORD                        | FORD   |
| MILLER                      | MILLER |
+-----------------------------+--------+
13 rows in set (0.00 sec)

mysql> 
  • 截取EMP表中ename中的第二个到第三个字符:
mysql> select substring(ename,2,2) , ename from EMP;
+----------------------+--------+
| substring(ename,2,2) | ename  |
+----------------------+--------+
| MI                   | SMITH  |
| LL                   | ALLEN  |
| AR                   | WARD   |
| ON                   | JONES  |
| LA                   | BLAKE  |
| LA                   | CLARK  |
| CO                   | SCOTT  |
| IN                   | KING   |
| UR                   | TURNER |
| DA                   | ADAMS  |
| AM                   | JAMES  |
| OR                   | FORD   |
| IL                   | MILLER |
+----------------------+--------+
13 rows in set (0.00 sec)

mysql>
  • 以首字母小写的方式现实所有员工的姓名:
mysql> select concat(lcase(substring(ename,1,1)),substring(ename,2)),ename from
EMP;
+--------------------------------------------------------+--------+
| concat(lcase(substring(ename,1,1)),substring(ename,2)) | ename  |
+--------------------------------------------------------+--------+
| sMITH                                                  | SMITH  |
| aLLEN                                                  | ALLEN  |
| wARD                                                   | WARD   |
| jONES                                                  | JONES  |
| bLAKE                                                  | BLAKE  |
| cLARK                                                  | CLARK  |
| sCOTT                                                  | SCOTT  |
| kING                                                   | KING   |
| tURNER                                                 | TURNER |
| aDAMS                                                  | ADAMS  |
| jAMES                                                  | JAMES  |
| fORD                                                   | FORD   |
| mILLER                                                 | MILLER |
+--------------------------------------------------------+--------+
13 rows in set (0.00 sec)

mysql>

3、数学函数

函数名称 描述
abs(number) 绝对值函数
bin(decimal_number) 十进制转换二进制
hex(decimalNumber) 转换成十六进制
conv(number, from_base, to_base) 进制转换
ceiling(number) 向上去整
floor(number) 向下去整
format(number, decimal_places) 格式化,保留小数
rand() 返回随机浮点数,范围[0.0, 1.0)
mod(number, denominator) 取模,求余

使用:

mysql> select abs(-100.2);
+-------------+
| abs(-100.2) |
+-------------+
|       100.2 |
+-------------+
1 row in set (0.01 sec)

mysql> select bin(2);
+--------+
| bin(2) |
+--------+
| 10     |
+--------+
1 row in set (0.00 sec)

mysql> select hex(10);
+---------+
| hex(10) |
+---------+
| A       |
+---------+
1 row in set (0.00 sec)

mysql> select conv(10,10,2);
+---------------+
| conv(10,10,2) |
+---------------+
| 1010          |
+---------------+
1 row in set (0.00 sec)

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

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

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

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

mysql> select mod(10,9);
+-----------+
| mod(10,9) |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

mysql> 

4、其他函数

  • user()查询当前用户:
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
  • md5(str)对一个字符串进行md5摘要(https的加密博客有提到),摘要后得到一个32位字符串:
mysql> select md5('admin');
+----------------------------------+
| md5('admin')                     |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
1 row in set (0.03 sec)
  • database()显示当前正在使用的数据库:
mysql> select database();
+------------+
| database() |
+------------+
| test5      |
+------------+
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)

OKOK,MySQL内置函数就到这里,如果你对Linux和C++也感兴趣的话,可以看看我的主页哦。下面是我的github主页,里面记录了我的学习代码和leetcode的一些题的题解,有兴趣的可以看看。

Xpccccc的github主页


网站公告

今日签到

点亮在社区的每一天
去签到