函数名称 | 描述 |
---|---|
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) | 获取两个日期的差,单位是天 |
mysql> select current_date();
mysql> select current_time();
mysql> select current_timestamp();
连续几次获取时间戳,发现时间戳一直在变化
mysql> select now();
可以看出当前时间也是像时间戳一样不断变化的
mysql> select date('1949-10-01 00:00:00');
也可以像函数一样嵌套使用
mysql> select date(now());
mysql> select date_add('2050-01-01', interval 40 day);
mysql> select date_add(now(), interval 10 minute);
mysql> select date_sub('2050-01-01', interval 10 day);
mysql> select date_sub(now(), interval 10 minute);
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则两数相减会出现负值
创建一张表,用于记录生日
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()));
创建一个留言表
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();
函数名称 | 描述 |
---|---|
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) | 去除字符串的前空格、后空格、前后空格 |
函数用法很简单,我只演示instr和ltrim、rtrim、trim,剩下的在案例部分
mysql> select instr('abcd1234efg', '1234');
mysql> select instr('abcd1234efg', '1234a');
这3个函数都不会去掉字符与字符之间的空格
mysql> select ltrim(' 你好 ') as res;
mysql> select rtrim(' 你好 ') as res;
mysql> select trim(' 你好 ') as res;
用的是之前oracle 9i的经典测试表
mysql> select charset(ename) from emp;
charset函数在实际中的用途:处理表中关于乱码信息确认的问题
用的是之前的exam_result
mysql> select concat('考生姓名: ', name,', 总分: ', chinese+math+english, ', 语文成绩: ',
-> chinese, ', 数学成绩: ', math, ', 英语成绩: ', english) asmsg from exam_result;
mysql> select name,length(name) from exam_result;
注:在mysql里面,一个UTF-8中文字符占用3字节,gbk中一个字符占用2个字节
注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)
mysql> select ename, replace(ename, 'S', '上海') from emp;
mysql> select substring(ename, 2, 2), ename from emp;
mysql> select ename, concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) from emp;
函数名称 | 描述 |
---|---|
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) | 求余 |
mysql> select abs(12);
mysql> select abs(-12);
mysql> select bin(10);
mysql> select bin(3.14);
mysql> select bin(7.14);
观察小数的十进制转二进制并没有按照小数真正的二进制转换,而是只对整数部分转换
mysql> select hex(10);
mysql> select hex(16);
这里hex(16)转化出来并不是十,而是一零
mysql> select conv (10, 10, 4);
mysql> select conv (10, 10, 2);
mysql> select format(3.1415926, 3);
mysql> select format(3.1415926, 4);
mysql> select mod(10, 3);
mysql> select rand();
mysql> select rand()*100;
也可以与format函数配合使用
mysql> select format(rand()*100, 1);
mysql> select format(rand()*100, 0); #可以得到一个随机整数
总结:向上取整的数都大于等于原数,向下取整的数都小于等于原数
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);
mysql> select user();
mysql> select database();
mysql> select md5('a');
注: 一般公司内部数据库不会存储用户的明文密码,而会将用户密码形成摘要后存储对应的摘要,当用户登录账号时,将用户输入的的密码形成摘要后与数据库中存储的摘要做对比,如果对比成功则允许登录
比如这样一张表,一个用户密码按照明文存储,另一个用户密码md5加密后存储
查找’李四’这个用户时,要这样查找
mysql> select name from user where name='李四' and password=md5('hello1234');
mysql> select password('asgfABC123@,');
mysql> select ifnull(null,10) as result;
mysql> select ifnull(20,10) as result;
mysql> select ifnull(20,null) as result;