文章目录
- MySQL内置函数
- 1、日期函数
- 2、字符串函数
- 3、数学函数
- 4、其他函数
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: 0mysql> 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)
返回 substring
在string
中出现的位置,如果没有则返回 0ucase(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])
从 str
的position
开始,取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主页