目录
日期函数

函数说明
日期:年月日
时间:时分秒
current_time():mysql> select vurrent_time();
current_date():mysql> select current_date();
**current_timestamp():**mysql> select current_timestamp();时间戳是在不断的递增了;在MySQL中没有展现总的秒数而是变成了日期+时间形式
now():mysql> select now();//他和时间戳类似的;
date(datetime):mysql> select date('2024-07-11 00:55:36');//可以直接输入具体时间返回日期
mysql> select date(now());//可以使用嵌套的方式返回日期
在日期的基础上加日期: date_add(date,interval d_value_type):mysql> select date_add('2025-01-01',interval 1 day);//加天数
mysql> select date_add('2025-01-01',interval 40 day);//自动前进
mysql> select date_add(now(),interval 40 day);//嵌套函数也是可以的
mysql> select date_add(now(),interval 10 minute);//加分钟
mysql> select date_add(now(),interval 10 second);//返回当前日期加10秒后的结果
mysql> select date_add(now(),interval 10 year);//返回当前日期加10年后的结果
在日期的基础上减去时间 :date_sub()跟date_add()一样的,只不过date_sub()是减的;mysql> select date_sub(now(),interval 10 year);//当前日期减去十年
mysql> select date_sub(now(),interval 20 minute);当前时间减去20分钟
计算两个日期之间相差多少天,默认前者减去后者(单位是day)mysql> select datediff('2017-09-01','2016-01-01');//前者减去后者为正数
mysql> select datediff('2017-09-01','2019-01-01');//后者减去前者为负数
案例
时间表,记录生日
建表 :mysql> create table if not exists cmp(
-> id int unsigned primary key auto_increment,
-> birstday date);
插入数据 :mysql> insert into cmp (birstday) values ('2003-01-01');
mysql> insert into cmp (birstday) values (current_date());//也行
mysql> insert into cmp (birstday) values (current_time());//最好不这样
mysql> insert into cmp (birstday) values (current_timestamp());//这样也不推荐mysql> insert into cmp (birstday) values (date(current_timestamp()));//可以这样
表中表明了是date就用date
留言表建表 :mysql> create table msg (
-> id int primary key auto_increment,
-> content varchar(30) not null,
-> sendtime datetime//既有日期也有时间
-> );
插入数据:mysql> insert into msg(content,sendtime) values('hello1', now());
mysql> insert into msg(content,sendtime) values('hello2', now());
显示所有留言信息,发布日期只显示日期,不用显示时间:mysql> select content,date(sendtime) from msg;
请查询在2分钟内发布的帖子
帖子已经在表中了,2分钟以内是以now()起点;
select * from msg where date_add(sendtime, interval 2 minute) > now();
消息很早了查不到了
字符串函数

函数说明
charset(str):返回字符串字符集
mysql> select charset('aaa');//看出他的字符集(编码格式)
mysql> select charset('中国');//英文跟中文的字符集一样
查看表的列的字符集(编码格式):
mysql> select charset(content) from msg;
mysql> select charset(id) from msg;
总之,字符集的选择取决于你存储的数据类型以及对比和处理数据的方式。在处理文本数据时通常会选择 utf8 或者 utf8mb4 ,而 binary 字符集则更适合于存储和处理不需要进行字符集转换的二进制数据。
concat(string2 [,...])连接字符串多个字符串连接:mysql> select concat('a','b','c');
mysql> select concat('abn','byy','ddc');
字符串与数字拼接:mysql> select concat('abn','byy','ddc',1213,3.025);
select concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from student;
instr(string,substring) 返回substring在string出现的位置,没有返回0mysql> select instr('asdfg123g','123');//存在返回下标
mysql> select instr('asdfg123g','123d');//不存在返回0,不是string的子串
ucase(string2)//转换成大写mysql> select ucase('asdfg123g');//碰到非字母就不转化,123就不动
lcase(string2)//转换成小写mysql> select lcase('ASDfg123g');
left(string,length)//从string的左边起取length个字符mysql> select left('ASDfg123g',2);
mysql> select left('ASDfg123g',5555);//length虽然大于string长度,但最多取string长度
right(string,length)//从string的右边起取length个字符mysql> select right('ASDfg123g',4);
mysql> select right('ASDfg123g',488);//最多取string的长度
length(string)//返回字符串的长度mysql> select length('ASDfg123g');
mysql> select length('');//空串为0
注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数; 如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数 (与字符集编码有关)在MySQL中一个数字一个字母一个汉字都叫一个字符,一个字符占多少字节看编码集
mysql> select name,length(name) from exam_result;
replace(str,search_str,replace_str)//在str中找到指定的字串然后用replace代替它mysql> select replace('ASDfg123g','123g','520wwz');//找到替换
mysql> select replace('ASDfg123g','123d','520wwz');//没找到就不替换
将EMP表中所有名字中有S的替换成'上海':mysql> select replace(ename, 'S', '上海') ,ename from emp;
strcmp(string1,string2)逐字符比较两字符串的大小,相等返回0,小于返回负数,大于返回正数mysql> select strcmp('asd','asd');每个字符都相等,返回0
mysql> select strcmp('asd','sd');字符a小于s返回负数,根据ASCLL比较
mysql> select strcmp('zsd','sd');字符z大于字符s返回正数
注意看你的字符集校验规则 :有的校验规则会不区分大小写我修改了数据库的检验规则变为区分大小写也不管用,要在数据库表字段上应用;直接改变整个数据库不管用,得在表上直接collate指定比较才可以;
mysql> select strcmp("zd","Zd");//导致大小写一样
substring(string,position,length)//从string的positon位置开始截取length个字符截取EMP表中ename字段的第二个到第三个字符,没有length就从position开始截取全部
mysql> select substring(ename, 2, 2), ename from emp;
以首字母小写的方式显示所有员工的姓名mysql> select concat(lcase(substring(ename, 1, 1)),substring(ename,2)) from emp;
ltrim(string)//去除左空格 trim(string)//去除空格 rtrim(string)//去除右空格mysql> select ltrim(' nihao ') as e;
mysql> select trim(' nihao ') as e;
mysql> select rtrim(' nihao ') as e;
数学函数

函数说明
abs(number)//绝对值函数
select abs(-100.2);
bin(decimal_number)//将十进制转化为2进制mysql> select bin(4);
mysql> select bin(4.2); //只能转整数
mysql> select bin(-4);//转负数,补码形式展现
hex(decimal_number)//将十进制转化为十六进制mysql> select hex(118);
mysql> select hex(-4);
可以看到还是以补码形式展现,
conv(number,from_base,to_base) 把一个数字从一个进制转化为另一个进制mysql> select conv(10,10,2);//将十进制转化为二进制
mysql> select conv(10,10,16);十进制转十六进制
mysql> select conv(10,10,5);十进制转五进制
ceiling(number)//向上取整(向大的数取整)mysql> select ceiling(3.6);mysql> select ceiling(3.1);
mysql> select ceiling(-3.1);mysql> select ceiling(-3.8);
floor(number)//向下取整 (向小的数取整)mysql> select floor(3.8);mysql> select floor(3.1);
mysql> select floor(-3.1);mysql> select floor(-3.8);
format(number,decimal_places)//格式化,保留小数位数,精度保留mysql> select format(3.1415926,2);
mod(number,denominator)//取模,求余mysql> select mod(10,3);mysql> select mod(-10,3);mysql> select mod(-10,-3); //数模3
mysql> select mod(-10.3,3);mysql> select mod(0.3,3);
rand()//返回随机浮点数,范围:[0.0,1.0);mysql> select rand();mysql> select rand();//连续两次返回值不一样
mysql> select format(rand()*100,0);mysql> select format(rand()*100,0);//自己设定返回随机数范围
其他函数
user() 查询当前用户
database()显示当前正在使用的数据库
md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串建表:mysql> create table user(
-> id bigint primary key auto_increment,
-> name varchar(32) not null,
-> password char(32) not null
-> );
mysql> insert into user (name,password) values ('张三','abcd123');//插入密码在MySQL中有password的话就不会在命令行中历史上下翻找到,为了安全;
如果密码用明文保存在数据库中那么万一被盗用了密码就直接被看到了,所以可以用md5(),也可以用其他的加密函数;mysql> insert into user (name,password) values ('李四',md5('qwer123'));
md5()是一个哈希函数,用于生成输入数据的消息摘要,但现在由于其已被证明存在严重的安全漏洞和碰撞攻击,不再建议用于安全相关的用途。然而,它仍然可以用于非安全相关的用途,如简单的数据校验或哈希映射。所以怎么登录呢?where name=xxx and password=xxx;判别用户登录并提取信息
password()函数,MySQL数据库使用该函数对用户加密,比md5()好,推荐password()
ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值mysql> select ifnull('abc','123');mysql> select ifnull(null,'123');
mysql> select ifnull(123,null);//他只判断第一个是不是null,不管你第二个是不是null
