Welcome to 9ilk's Code World
(๑•́ ₃ •̀๑) 个人主页: 9ilk
(๑•́ ₃ •̀๑) 文章专栏: MySQL
🏠 时间函数
约定:我们在MySQL中说的日期指的是年 月 日,时间指的是时 分 秒。
🧷 now()
select now();
测试结果:
- now()返回当前日期时间。
🧷 current系列
1. current_date():返回当前日期
select current_date();
测试结果:
2. current_time():返回当前时间
select current_time();
测试结果:
3. current_timestamp(): 返回当前时间戳。
select current_timestamp();
测试结果:
- 对于时间戳,系统会帮我们自动转化我日期时间。
🧷 date系列
1. date(datetime) :返回参数的日期部分。
select date('1949-10-01 00:00:00');
测试结果:
MySQL中函数也是可以嵌套使用的:
select date(now()); //函数嵌套拿到当前日期
测试结果:
2. date_add(date,interval d_value_type) : 在date中添加日期或时间
- interval后的数值单位时可以是year minute second hour day month。
- 可以加上负数也可以加上正数。
select date_add('1949-01-01',interval 10 day);
select date_add('1949-01-01',interval -10 day);
select date_add(now(),interval 10 day);
select date_add(now(),interval 10 year);
select date_add(now(),interval 10 minute);
select date_add(now(),interval 10 second);
测试结果 :
3. date_sub() : 在原日期基础上减去参数
- interval后的数值单位也是year,month,day,hour,minute,second。
select date_sub('1949-01-01',interval -10 month);
select date_sub(now(),interval 10 hour);
测试结果:
4. datediff(date1,date2) : 返回两个日期的差,单位是天
- 注意是前者-后者
select datediff('2017-10-10','2016-09-01');
select datediff('2010-10-10','2016-09-01');
测试结果:
🧷 案例
1. 案例一:
- 创建一张表,记录生日
create table tmp(id int primary key auto_increment,birthday date
);
查看表的详细信息:
- 添加生日
insert into tmp (birthday) values('1980-01-01');
insert into tmp (birthday) values(current_date());
insert into tmp (birthday) values(current_time());
测试结果:
-
我们发现current_time也可以插入,其实所有时间获取时都有年月日时分秒,只不过不同函数显示不同。
结论:以后我们在时间插入时先看你的需求,是日期你用日期函数就可以了。
2. 案例2
- 创建一个留言表
create table msg (id int primary key auto_increment,content varchar(30) not null,sendtime datetime
);
查看表的详细信息:
- 插入数据
insert into msg(content,sendtime) values('hello1', now());
insert into msg(content,sendtime) values('hello2', now());
select * from msg;
- 显示所有留言信息,发布日期只显示日期,不用显示时间
select content,date(sendtime) from msg;
测试结果:
-
请查询在2分钟内发布的帖子
select content,sendtime from msg where sendtime > date_sub(now(),interval 2 minute);
select * from msg where date_add(sendtime, interval 2 minute) > now();
测试结果:
🏠 字符串函数
🎵 charset(str): 返回字符串字符集
select charset('abcd');
select charset('中国');
select charset(ename) from emp; //查看表中字段
测试结果:
🎵 concat(string,[...]): 连接字符串
select concat('a','b','c') as res;
select concat('a','b','c',123,3.14) as res;//即便你传的是整数也会转成字符串拼接
测试结果:
注:即便你传的是整数也会转成字符串拼接。
- 以首字母小写的方式显示所有员工的姓名
select concat(lcase(substring(ename, 1, 1)),substring(ename,2)) from EMP;
测试结果:
🎵 instr(string,substr): 返回substr在string里出现的位置,没有返回0
select instr('abcd1234efg','1234'); //下标从1开始 返回下标5
select instr('abcd1234efg','1134'); //找不到返回0
测试结果:
- 要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”
select concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from
student;
测试结果:
🎵 ucase lcase
- ucase:将小写转换成大写字母,其他不是字母的不做处理。
select ucase('abcd1234ABCD');
测试结果:
- lcase:将大写字母转换成小写字母,不是字母的不处理。
select lcase('abcd1234ABCD');
测试结果:
🎵 left right
- left(str,length): 从str左边起取length个字符,如果超出字符串长度,有多少取多少
select left('abcd1234',4);
select left('abcd1234',9);
测试结果:
- right(str,length):从str右边起,取length个字符,length过大则有多少拿多少。
select right('abcd1234',4);
select right('abcd1234',9);
测试结果:
🎵 length(str): 返回length的长度
select length('abcd1234');
select length('');
select length(' ');
测试结果:
-
求学生表中学生姓名占用的字节数
select length(name), name from student;
测试结果:
注: length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关。
说明:在msql中,length()函数返回的是字符串的字节长度,而不是字符的个数。如果字符串中包含非asci字符(如中文字符),它们的字节长度通常大于1,asci字符字节数是1;例子中每个中文字符在utf-8编码下占用3个字节,因此是9。
🎵 replace(str,search str,replace str) : 在str中用rstr替换sstr
select replace(ename, 'S', '上海') ,ename from EMP;
测试结果:
注:实际上这个只是字符串级别的替换,数据库原始数据并不替换。
🎵 substring(str,pos,[length]):从str的pos开始取length个字符,没有给length则取全部
select substring(ename, 2, 2), ename from EMP;
测试结果:
🎵 ltrim rtrim trim
- ltrim清空str左边空格。
- rtrim清空str右边空格。
- trim清空左右两边的空格。
select ltrim(' 你好 ');
select trim(' 你好 ');
select rtrim(' 你好 ');
测试结果:
注:如果字符串的字符中间有空格是无法清空的。
🏠 数学函数
🧷 进制转换
1. bin():十进制转二进制
select bin(20);
select bin(3.14); //其实是转成3
select bin(3.54);
测试结果:
注:对于浮点数其实是按照它们的整数部分来转的。
2. hex(): 十进制转换成十六进制
select hex(11);
select hex(16); //是1 0不是10
测试结果:
3. conv(num,from_base,to_base):指定进制转换
SELECT conv(10,10,16); //10进制->16进制
SELECT conv(10,10,4); //10进制->4进制
测试结果:
🧷 数值运算
1. abs(): 绝对值函数
select abs(12) ;
select abs(-12) ;
select abs(-12.3) ;
测试结果:
2. format(num,decimal_places): 格式化,指定保留小数位数
select format(3.1415926,2); //保留两位精度
select format(3.1415926,8); //保留8位精度
测试结果:
3. mod(num,denominator): 取模求余
select mod(10,3);
select mod(-10,-3);
select mod(10,-3);
测试结果:
注:这里取整方式是向0取整。
4. rand():返回随机浮点数,范围[0.0,1.0]
select rand(); //[0.0,1.0]
测试结果:
如果我想范围为[0,100]的浮点数呢?
select rand()*100; //[0.0,1.0]
select format(rand()*100,0); //只要整数部分
测试结果:
5. 取整:ceiling floor
关于取整方式:
- ceiling:向上取整。
select ceiling(3.1);
select ceiling(3.001);
select ceiling(-3.9);
测试结果:
- floor:向下取整。
select floor(4.5);
select floor(4.9);
select floor(-4.1);
测试结果:
🏠 其他函数
1.user() 查询当前用户
select user();
测试结果:
2. database()显示当前正在使用的数据库
select database();
3. md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
select md5('admin');
测试结果:
4.password()函数,MySQL数据库使用该函数对用户加密
select password('root');
测试结果:
注: 从MySQL5.7.6开始,PASSWORD()函数已经被废弃(deprecated),而从MySQL8.0 开始,它被完全移除了。你可以使用SHA2来加密。
5. ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
- 如果第一个参数不为空则用第一个;第一个参数为空,第二个参数不为空则用第二个;两个都为空,返回NULL。
select ifnull('abc', '123');
select ifnull(null, '123');
select ifnull(null, null);
测试结果:
完。