MySQL内置函数

文章目录

  • 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();

MySQL内置函数_第1张图片

(2) 获得时分秒 - current_time()

mysql> select current_time();

MySQL内置函数_第2张图片

(3) 获得时间戳 - current_timestamp()

mysql> select current_timestamp();

连续几次获取时间戳,发现时间戳一直在变化

MySQL内置函数_第3张图片

(4) 获得当前时间- now()

mysql> select now();

可以看出当前时间也是像时间戳一样不断变化的

MySQL内置函数_第4张图片

(5) 获取datetime参数的日期部分 - date(datetime)

mysql> select date('1949-10-01 00:00:00');

MySQL内置函数_第5张图片

也可以像函数一样嵌套使用

mysql> select date(now());

MySQL内置函数_第6张图片

(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);

MySQL内置函数_第7张图片

(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);

MySQL内置函数_第8张图片

(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则两数相减会出现负值

MySQL内置函数_第9张图片

1.2 案例讲解

(1) 案例1:生日表

创建一张表,用于记录生日

mysql> create table tmp(
    -> id bigint primary key auto_increment,
    -> birthday date not null
    -> );

MySQL内置函数_第10张图片

插入数据:

MySQL内置函数_第11张图片

插入当前日期:

mysql> insert into tmp (birthday) values (current_date());

MySQL内置函数_第12张图片

可以通过函数插入,插入时间,mysql也会得到日期;同时也能插入时间戳,表会拿走日期部分(两种写法不建议)

MySQL内置函数_第13张图片

想要这样插入,最好用date函数,获取时间的日期部分再插入

mysql> insert into tmp (birthday) values (date(current_timestamp()));

MySQL内置函数_第14张图片

(2) 案例2:留言表

创建一个留言表

mysql> create table msg (
    -> id bigint primary key auto_increment,
    -> content varchar(100) not null,
    -> sendtime datetime
    -> );

MySQL内置函数_第15张图片

插入一些数据后:

MySQL内置函数_第16张图片

显示所有留言信息,发布日期只显示日期,不用显示时间

mysql> select content, date(sendtime) from msg;

MySQL内置函数_第17张图片

请查询在2分钟内发布的帖子

MySQL内置函数_第18张图片

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();

MySQL内置函数_第19张图片

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');

MySQL内置函数_第20张图片

(2) ltrim(str)、rtrim(str)、trim(str)

这3个函数都不会去掉字符与字符之间的空格

MySQL内置函数_第21张图片

  • ltrim(str) — 去除字符串的前空格
mysql> select ltrim('    你好   ') as res;

MySQL内置函数_第22张图片

  • rtrim(str) — 去除字符串的后空格
mysql> select rtrim('    你好   ') as res;

MySQL内置函数_第23张图片

  • trim(str) — 去除字符串的前后空格
mysql> select trim('    你好   ') as res;

MySQL内置函数_第24张图片

2.2 案例讲解

(1) 获取emp表的ename列的字符集

用的是之前oracle 9i的经典测试表

MySQL内置函数_第25张图片

mysql> select charset(ename) from emp;

charset函数在实际中的用途:处理表中关于乱码信息确认的问题

MySQL内置函数_第26张图片

(2) 要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”

用的是之前的exam_result

MySQL内置函数_第27张图片

mysql> select concat('考生姓名: ', name,', 总分: ',  chinese+math+english, ', 语文成绩: ',       
   -> chinese, ', 数学成绩: ',  math, ', 英语成绩: ',  english) asmsg from exam_result;

MySQL内置函数_第28张图片

(3) 求学生表中学生姓名占用的字节数

mysql> select name,length(name) from exam_result;

MySQL内置函数_第29张图片

注:在mysql里面,一个UTF-8中文字符占用3字节,gbk中一个字符占用2个字节

注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

(4) 将EMP表中所有名字中有S的替换成’上海’

mysql> select ename, replace(ename, 'S', '上海') from emp;

MySQL内置函数_第30张图片

(5) 截取EMP表中ename字段的第二个到第三个字符

mysql> select substring(ename, 2, 2), ename from emp;

MySQL内置函数_第31张图片

(6) 以首字母小写的方式显示所有员工的姓名

  • substring截取员工姓名首字母后使用lcase将其转换成小写
  • substring截取员工姓名第二个字符及其后续字符
  • 使用contact连接上面两处
mysql> select ename, concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) from emp;

MySQL内置函数_第32张图片

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);

MySQL内置函数_第33张图片

(2) 十进制转换成二进制 - bin(decimal_number)

mysql> select bin(10);
mysql> select bin(3.14);
mysql> select bin(7.14);

观察小数的十进制转二进制并没有按照小数真正的二进制转换,而是只对整数部分转换

MySQL内置函数_第34张图片

(3) 十进制转换成十六进制 - hex(decimal_number)

mysql> select hex(10);
mysql> select hex(16);

这里hex(16)转化出来并不是十,而是一零

MySQL内置函数_第35张图片

(4) 任意进制转换 - conv(number, from_base, to_base)

mysql> select conv (10, 10, 4);
mysql> select conv (10, 10, 2);

MySQL内置函数_第36张图片

(5) 格式化数字, 保留decimal_places位小数 - format(number, decimal_places)

mysql> select format(3.1415926, 3);
mysql> select format(3.1415926, 4);

MySQL内置函数_第37张图片

(6) 求余 - mod(number, denominator)

mysql> select mod(10, 3);

MySQL内置函数_第38张图片

(7) 生成随机浮点数 - rand()

mysql> select rand();
mysql> select rand()*100;

MySQL内置函数_第39张图片

也可以与format函数配合使用

mysql> select format(rand()*100, 1);
mysql> select format(rand()*100, 0);   #可以得到一个随机整数

MySQL内置函数_第40张图片

(8) 上下取整 - ceiling(number),floor(number)

总结:向上取整的数都大于等于原数,向下取整的数都小于等于原数

MySQL内置函数_第41张图片

mysql> select ceiling(3.1);
mysql> select ceiling(3.01);
mysql> select ceiling(-3.1);
mysql> select ceiling(-3.9);

MySQL内置函数_第42张图片

mysql> select floor(4.5);
mysql> select floor(4.9);
mysql> select floor(-4.1);
mysql> select floor(-4.9);

MySQL内置函数_第43张图片

4. 其它函数

(1) user() 查询当前用户

mysql> select user();

MySQL内置函数_第44张图片

(2) database()显示当前正在使用的数据库

mysql> select database();  

MySQL内置函数_第45张图片

(3)md5(str)对一个字符串进行md5摘要

mysql> select md5('a');

MySQL内置函数_第46张图片

注: 一般公司内部数据库不会存储用户的明文密码,而会将用户密码形成摘要后存储对应的摘要,当用户登录账号时,将用户输入的的密码形成摘要后与数据库中存储的摘要做对比,如果对比成功则允许登录

比如这样一张表,一个用户密码按照明文存储,另一个用户密码md5加密后存储

MySQL内置函数_第47张图片

查找’李四’这个用户时,要这样查找

mysql> select name from user where name='李四' and password=md5('hello1234');

MySQL内置函数_第48张图片

(4) password()函数,MySQL数据库使用该函数对用户加密

mysql> select password('asgfABC123@,');

MySQL内置函数_第49张图片

(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;

MySQL内置函数_第50张图片

你可能感兴趣的:(MySQL,mysql,数据库)