文章目录
- MySQL内置函数
- 1. 日期函数
- 1.1 用法演示
- (1) 获得年月日 - current_date()
- (2) 获得时分秒 - current_time()
- (3) 获得时间戳 - current_timestamp()
- (4) 获得当前时间- now()
- (5) 获取datetime参数的日期部分 - date(datetime)
- (6) 在日期的基础上加时间 - date_add(date, interval d_value_type)
- (7) 在日期的基础上减去时间 - date_sub(date, interval d_value_type)
- (8) 计算两个日期之间相差多少天 - datediff(date1, date2)
- 1.2 案例讲解
- (1) 案例1:生日表
- (2) 案例2:留言表
- 2. 字符串函数
- 2.1 用法演示
- (1) instr(str, substr)
- (2) ltrim(str)、rtrim(str)、trim(str)
- 2.2 案例讲解
- (1) 获取emp表的ename列的字符集
- (2) 要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”
- (3) 求学生表中学生姓名占用的字节数
- (4) 将EMP表中所有名字中有S的替换成'上海'
- (5) 截取EMP表中ename字段的第二个到第三个字符
- (6) 以首字母小写的方式显示所有员工的姓名
- 3. 数学函数
- 3.1 用法演示
- (1) 绝对值 - abs(number)
- (2) 十进制转换成二进制 - bin(decimal_number)
- (3) 十进制转换成十六进制 - hex(decimal_number)
- (4) 任意进制转换 - conv(number, from_base, to_base)
- (5) 格式化数字, 保留decimal_places位小数 - format(number, decimal_places)
- (6) 求余 - mod(number, denominator)
- (7) 生成随机浮点数 - rand()
- (8) 上下取整 - ceiling(number),floor(number)
- 4. 其它函数
- (1) user() 查询当前用户
- (2) database()显示当前正在使用的数据库
- (3)md5(str)对一个字符串进行md5摘要
- (4) password()函数,MySQL数据库使用该函数对用户加密
- (5) ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
MySQL内置函数
1. 日期函数
函数名称 | 描述 |
---|---|
current_date() | 获取当前日期 |
current_time() | 获取当前时间 |
current_timestamp() | 获取当前时间戳 |
now() | 获取当前日期时间 |
date(datetime) | 获取datetime参数的日期部分 |
date_add(date, interval d_value_type) | 在date中添加日期或时间,interval后的数值单位可以是:year、month、day、hour、minute、second |
date_sub(date, interval d_value_type) | 在date中减去日期或时间,interval后的数值单位可以是:year、month、day、hour、minute、second |
datediff(date1, date2) | 获取两个日期的差,单位是天 |
1.1 用法演示
(1) 获得年月日 - current_date()
mysql> select current_date();
(2) 获得时分秒 - current_time()
mysql> select current_time();
(3) 获得时间戳 - current_timestamp()
mysql> select current_timestamp();
连续几次获取时间戳,发现时间戳一直在变化
(4) 获得当前时间- now()
mysql> select now();
可以看出当前时间也是像时间戳一样不断变化的
(5) 获取datetime参数的日期部分 - date(datetime)
mysql> select date('1949-10-01 00:00:00');
也可以像函数一样嵌套使用
mysql> select date(now());
(6) 在日期的基础上加时间 - date_add(date, interval d_value_type)
mysql> select date_add('2050-01-01', interval 40 day);
mysql> select date_add(now(), interval 10 minute);
(7) 在日期的基础上减去时间 - date_sub(date, interval d_value_type)
mysql> select date_sub('2050-01-01', interval 10 day);
mysql> select date_sub(now(), interval 10 minute);
(8) 计算两个日期之间相差多少天 - datediff(date1, date2)
mysql> select datediff('2017-10-10', '2016-09-01');
mysql> select datediff('2010-10-10', '2016-09-01');
mysql> select datediff(date(now()), '1949-10-01');
注意:这里的相差天数是:date1 - date2,如果date1 < date2则两数相减会出现负值
1.2 案例讲解
(1) 案例1:生日表
创建一张表,用于记录生日
mysql> create table tmp(-> id bigint primary key auto_increment,-> birthday date not null-> );
插入数据:
插入当前日期:
mysql> insert into tmp (birthday) values (current_date());
可以通过函数插入,插入时间,mysql也会得到日期;同时也能插入时间戳,表会拿走日期部分(两种写法不建议)
想要这样插入,最好用date函数,获取时间的日期部分再插入
mysql> insert into tmp (birthday) values (date(current_timestamp()));
(2) 案例2:留言表
创建一个留言表
mysql> create table msg (-> id bigint primary key auto_increment,-> content varchar(100) not null,-> sendtime datetime-> );
插入一些数据后:
显示所有留言信息,发布日期只显示日期,不用显示时间
mysql> select content, date(sendtime) from msg;
请查询在2分钟内发布的帖子
mysql> select content, sendtime from msg where sendtime > date_sub(now(), interval 2 -> minute);mysql> select content, sendtime from msg where date_add(sendtime, interval 2 minute) > -> now();
2. 字符串函数
函数名称 | 描述 |
---|---|
charset(str) | 获取字符串使用的字符集 |
concat(str1, str2 [, …]) | 获取连接后的字符串 |
instr(str, substr) | 获取substr在str中首次出现的位置,没有出现返回0 |
ucase(str) | 获取转换成大写后的字符串 |
lcase(str) | 获取转换成小写后的字符串 |
left(str, length) | 从字符串的左边开始,向后截取length个字符 |
length(str) | 获取字符串占用的字节数 |
replace(str, search_str, replace_str) | 将字符串中的search_str替换成replace_str |
strcmp(str1, str2) | 逐字符比较两个字符串的大小 |
substring(str, position [, length]) | 从字符串的position开始,向后截取length个字符 |
ltrim(str)、rtrim(str)、trim(str) | 去除字符串的前空格、后空格、前后空格 |
2.1 用法演示
函数用法很简单,我只演示instr和ltrim、rtrim、trim,剩下的在案例部分
(1) instr(str, substr)
mysql> select instr('abcd1234efg', '1234');
mysql> select instr('abcd1234efg', '1234a');
(2) ltrim(str)、rtrim(str)、trim(str)
这3个函数都不会去掉字符与字符之间的空格
- ltrim(str) — 去除字符串的前空格
mysql> select ltrim(' 你好 ') as res;
- rtrim(str) — 去除字符串的后空格
mysql> select rtrim(' 你好 ') as res;
- trim(str) — 去除字符串的前后空格
mysql> select trim(' 你好 ') as res;
2.2 案例讲解
(1) 获取emp表的ename列的字符集
用的是之前oracle 9i的经典测试表
mysql> select charset(ename) from emp;
charset函数在实际中的用途:处理表中关于乱码信息确认的问题
(2) 要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”
用的是之前的exam_result
mysql> select concat('考生姓名: ', name,', 总分: ', chinese+math+english, ', 语文成绩: ', -> chinese, ', 数学成绩: ', math, ', 英语成绩: ', english) asmsg from exam_result;
(3) 求学生表中学生姓名占用的字节数
mysql> select name,length(name) from exam_result;
注:在mysql里面,一个UTF-8中文字符占用3字节,gbk中一个字符占用2个字节
注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)
(4) 将EMP表中所有名字中有S的替换成’上海’
mysql> select ename, replace(ename, 'S', '上海') from emp;
(5) 截取EMP表中ename字段的第二个到第三个字符
mysql> select substring(ename, 2, 2), ename from emp;
(6) 以首字母小写的方式显示所有员工的姓名
- substring截取员工姓名首字母后使用lcase将其转换成小写
- substring截取员工姓名第二个字符及其后续字符
- 使用contact连接上面两处
mysql> select ename, concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) from emp;
3. 数学函数
函数名称 | 描述 |
---|---|
abs(number) | 绝对值函数 |
bin(decimal_number) | 十进制转换成二进制 |
hex(decimal_number) | 十进制转换成十六进制 |
conv(number, from_base, to_base) | conv(number, from_base, to_base) |
ceiling(number) | 向上取整 |
floor(number) | 向下取整 |
format(number, decimal_places) | 格式化,保留decimal_places位小数 |
rand() | 生成随机浮点数,范围 [0.0, 1.0) |
mod(number, denominator) | 求余 |
3.1 用法演示
(1) 绝对值 - abs(number)
mysql> select abs(12);
mysql> select abs(-12);
(2) 十进制转换成二进制 - bin(decimal_number)
mysql> select bin(10);
mysql> select bin(3.14);
mysql> select bin(7.14);
观察小数的十进制转二进制并没有按照小数真正的二进制转换,而是只对整数部分转换
(3) 十进制转换成十六进制 - hex(decimal_number)
mysql> select hex(10);
mysql> select hex(16);
这里hex(16)转化出来并不是十,而是一零
(4) 任意进制转换 - conv(number, from_base, to_base)
mysql> select conv (10, 10, 4);
mysql> select conv (10, 10, 2);
(5) 格式化数字, 保留decimal_places位小数 - format(number, decimal_places)
mysql> select format(3.1415926, 3);
mysql> select format(3.1415926, 4);
(6) 求余 - mod(number, denominator)
mysql> select mod(10, 3);
(7) 生成随机浮点数 - rand()
mysql> select rand();
mysql> select rand()*100;
也可以与format函数配合使用
mysql> select format(rand()*100, 1);
mysql> select format(rand()*100, 0); #可以得到一个随机整数
(8) 上下取整 - ceiling(number),floor(number)
总结:向上取整的数都大于等于原数,向下取整的数都小于等于原数
mysql> select ceiling(3.1);
mysql> select ceiling(3.01);
mysql> select ceiling(-3.1);
mysql> select ceiling(-3.9);
mysql> select floor(4.5);
mysql> select floor(4.9);
mysql> select floor(-4.1);
mysql> select floor(-4.9);
4. 其它函数
(1) user() 查询当前用户
mysql> select user();
(2) database()显示当前正在使用的数据库
mysql> select database();
(3)md5(str)对一个字符串进行md5摘要
mysql> select md5('a');
注: 一般公司内部数据库不会存储用户的明文密码,而会将用户密码形成摘要后存储对应的摘要,当用户登录账号时,将用户输入的的密码形成摘要后与数据库中存储的摘要做对比,如果对比成功则允许登录
比如这样一张表,一个用户密码按照明文存储,另一个用户密码md5加密后存储
查找’李四’这个用户时,要这样查找
mysql> select name from user where name='李四' and password=md5('hello1234');
(4) password()函数,MySQL数据库使用该函数对用户加密
mysql> select password('asgfABC123@,');
(5) ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
mysql> select ifnull(null,10) as result;
mysql> select ifnull(20,10) as result;
mysql> select ifnull(20,null) as result;