数值函数
函数 | 作用 |
ROUND(数字[,保留位数]) | 根据指定的保留位数对小数进行四舍五入,如果不指定保留位数,则小数点之后的数字全部进行全部四舍五入 |
TRUNCATE(数字[,截取位数]) | 保留指定位数的小数,如果不指定,则表示不保留 |
CEIL(数字),CEILING(数字) | 对小数向上取整 |
FLOOR(数字) | 对小数向下取整 |
RAND([n]) | 随机返回0到1.0之间的小数,如果指定n每次产生的就都是重复的 |
数值函数都是对数据的操作
-- 根据指定的保留位数对小数进行四舍五入
-- 如果不指定保留位数 则小数点之后的数字全部进行全部四舍五入
SELECT ROUND(3.643782);
-- 根据指定的保留位数对小数进行四舍五入 第二个参数指定保留几位小数
SELECT ROUND(3.643782), ROUND(3.643782, 2);
-- 对整数向上取整 -n就是把数字的几位变成0 -1就是把数字的个位变成0
SELECT ROUND(789, -1),ROUND(800, -2),ROUND(800, -3),ROUND(800, -4);
TRUNCATE 和 ROUND 类似,TRUNCATE 没有一个参数的版本,TRUNCATE 是截取,不是保留几位小数
-- 保留指定位数的小数,如果不指定,则表示不保留 截取 0 是指只保留整数部分,不会四舍五入
SELECT TRUNCATE(3.643782, 0);
-- 对整数向下取整
SELECT TRUNCATE(789, -1),TRUNCATE(789, -2),TRUNCATE(789, -3);
-- 对小数向上取整 返回第一个比小数大的整数
SELECT CEIL(1.2);
-- 对小数向下取整 返回第一个比小数小的整数
SELECT FLOOR(1.2);
RAND([n]) | 随机返回0到1.0之间的小数,如果指定n每次产生的就都是重复的 |
通过数据库的函数,生成一个六位数字的随机验证码
-- SQL表 --
-- 生成一个六位数字的随机验证码
-- 乘以100w得到六位数字
SELECT RAND() * 1000000;
-- 截断
SELECT TRUNCATE(RAND() * 1000000,0);
-- 以上步骤截取几次出现5位 由于生成的是0到1.0之间的小数 0.078380也属于这个范围内
-- 可以使用字符串填充在前面填充一个0
SELECT LPAD(TRUNCATE(RAND() * 1000000,0),6,'0');
日期和时间函数
函数 | 作用 |
CURDATE(),CURRENT_DATE() | 返回当前日期 |
CURTIME(),CURRENT_TIME() | 返回当前时间 |
NOW(),CURRENT_TIMESTAMP(),LOCALTIME(), SYSDATE(),LOCALTIMESTAMP() | 返回会当前日期和事件 |
YEAR(日期) | 返回日期中的年份 |
MONTH(日期) | 返回日期中的月份[1,12] |
DAY(日期) | 返回日期中的天[1,31] |
HOUR(时间) | 返回时间中的小时 |
MINUTE(时间) | 返回实践中的分钟 |
SECOND(时间) | 返回时间中的秒 |
DAYOFWEEK(日期) | 返回星期几,1星期日,2星期一 |
WEEKDAY(日期) | 返回星期几,0星期一,1星期二 |
DAYOFYEAR(日期) | 计算指定日期是本年第几天 |
DAYOFMONTH(日期) | 计算指定日期是本月第几天 |
QUARTER(日期) | 计算指定日期是第几季度 |
TIME_TO_SEC(time) | 将指定时间转换为秒 |
SEC_TO_TIME(sec) | 将以秒为单位的时间转换为时分秒的格式 |
DATEDIFF(d1,d2) | 计算两个日期相隔的天数 |
ADDDATE(date,n) | 计算指定日期加上n天后的日期 |
SUBDATE(date,n) | 计算指定日期减去n天后的日期 |
ADDTIME(time,n) | 计算指定时间加上n秒后的时间 |
SUBTIME(time,n) | 计算指定时间减去n秒后的时间 |
DATE_FORMAT(date,f) | 按格式返回日期 |
TIME_FORMAT(time,f) | 按格式返回时间 |
获取当前时间或者日期
SELECT CURTIME(),CURDATE();
有多种方式,任选一种即可
-- 获取当前时间或者日期
SELECT CURTIME(),CURRENT_TIME,CURRENT_TIME(),CURDATE(),CURRENT_DATE,CURRENT_DATE();
获取当前时间和日期
-- 获取当前时间和日期
SELECT NOW();
获取日期中的信息
SELECT
YEAR(CURDATE()), #获取年
MONTH(CURDATE()), #获取月
DAY(CURDATE()) #获取天
;
-- 获取日期中的信息
SELECT
DAYOFWEEK(CURDATE()), #获取指定日期是星期几
DAYOFYEAR(CURDATE()), #获取指定日期是本年的第几天
QUARTER(CURDATE()) #获取指定日期是本年的第几个季度 一年有4个季度 每3个月为1季度
;
DAYOFWEEK(CURDATE()) #获取指定日期是星期几,如果是 1 的话,代表星期日,如果是 2 的话,代表星期一,以此类推
获取时间中的信息
SELECT
HOUR('16:23:28'), #获取时
MINUTE('16:23:28'), #获取分
SECOND('16:23:28') #获取秒
;
将指定的时间转换为秒
SELECT
TIME_TO_SEC('1:05'),
TIME_TO_SEC('1:00:01')
;
将指定的秒数转为时间
SELECT
SEC_TO_TIME(3601)
;
计算时间加上、减去某个时间的结果
SELECT
ADDTIME(CURTIME(),'5:00:00'),
SUBTIME(CURTIME(),'5:00:00')
;
计算日期加上、减去 n 天后的结果
SELECT
ADDDATE(CURDATE(),2),
SUBDATE(CURDATE(),2)
;
格式化显示日期或时间
SELECT
DATE_FORMAT(CURDATE(),'%y-%m-%d'), #如果是小写显示2位数字
DATE_FORMAT(CURDATE(),'%Y-%m-%d') #如果是大写显示4位数字
;
SELECT
TIME_FORMAT(CURTIME(),'%h:%i:%s'), #如果是小写显示12小时制
TIME_FORMAT(CURTIME(),'%H:%i:%s') #如果是大写显示24小时制
;
条件判断函数
函数 | 作用 |
IF(expr,v1,v2) | 如果表达式expr成立,返回结果v1;否则,返回结果v2。 |
IFNULL(v1,v2) | 判断某一个值是不是为空,如果v1的值不为NULL,则返回v1,否则返回v2 |
CASE | 分支(详见下面) |
IF(expr,v1,v2)
SELECT IF(1>0,'true','false');
->true
IFNULL(v1,v2)
SELECT IFNULL(NULL,'maye');
->maye
CASE
语法 1
CASE
WHEN expr1 THEN V1
WHEN expr2 THEN V2
...
ELSE vn
END
SELECT CASE
WHEN 1 > 0
THEN '1 > 0'
WHEN 2 > 0
THEN '2 > 0'
ELSE '3 > 0'
END
->1 > 0
语法 2
CASE expr
WHEN e1 THEN v1
WHEN e1 THEN v1
...
ELSE vn
END
SELECT CASE 1
WHEN 1 THEN '我是1'
WHEN 2 THEN '我是2'
ELSE '你是谁'
IF
查看 emp 表中,佣金为 NULL 的员工,如果为 NULL,则显示不是销售
SELECT ename,sal,IF(comm,'销售','不是销售') AS 'IF' FROM emp;
IFNULL
SELECT ename,sal,IFNULL(comm,'不是销售') AS 'IF' FROM emp;
CASE
注意 CASE 需要闭合 END,一旦某个条件成立,下面就不会匹配了
语法 1
SELECT
CASE
WHEN 1>0 THEN '1>0'
WHEN 2>1 THEN '2>1'
ELSE '未知'
END;
语法 2
SELECT ename,sal,comm,
CASE sal
WHEN 800 THEN '低级'
WHEN 3000 THEN '中等'
WHEN 5000 THEN '高级'
ELSE '其他'
END
FROM emp;
系统信息函数
系统信息函数用来查询MySQL数据库的系统信息。
函数 | 作用 |
VERSION() | 返回数据库的版本号 |
CONNECTION_ID() | 返回数据库连接的ID、每一个用户连接数据库都有一个唯一的标识 |
DATABASE()、SCHEMA | 返回当前数据库名 |
USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()、CURRENT_USER | 返回当前登录数据库的用户 |
CHARSET(str) | 返回字符串str的字符集 |
COLLATION(str) | 返回字符串str的字符排列方式、多个字符串是根据什么规则比较的、比较准则 |
获取数据库版本号
-- 获取数据库版本号
SELECT VERSION();
获取数据库连接 ID
-- 获取数据库连接ID
SELECT CONNECTION_ID();
获取数据库名
-- 获取数据库名
SELECT DATABASE(),SCHEMA();
获取用户名称
-- 获取用户名称 @localhost表示数据库在本地登录
SELECT USER();
查看字符串字符集
-- 查看字符串字符集 随意写入一个字符串得到字符集 b4 就是 bite 4 个字节存储
SELECT CHARSET('A');
字符串排序规则
-- 字符串排序规则 随意写入一个字符串得到字符串排序规则 默认以字典序排列
SELECT COLLATION('a');
加密函数
加密函数是MySQL用来对数据进行加密的函数。一般要加密的数据就是我们的密码,例如我们要存储一些用户的信息,不可能把用户密码的明文存储在数据库里面。
函数 | 作用 |
MD5(str) | 对字符串str进行散列,可以用于一些普通的不需要解密的数据加密,如密码,相对于sha1弱 |
sha1 | 对字符串str进行散列,可以用于一些普通的不需要解密的数据加密,如密码,比MD5更安全 |
-- '12345678'叫作明文 字符串加密得到一串密文
SELECT MD5('12345678');
-- 字符串加密 SHA1 得到的密文更长更安全
SELECT SHA1('12345678');
数据库里面存储的密文,那我们怎么知道用户输入的密码对不对呢?
再对用户明文输入的密码进行加密如果和数据库里面存储的密文一样就是匹配的,对同一个字符串无论加密多少次都是一样的
其他函数
进制转换
函数 | 作用 |
BIN(x) | 返回x的二进制 |
HEX(x) | 返回x的十六进制 |
OCT(x) | 返回x的八进制 |
CONV(x,from_base,to_base) | 将from_base进制的x,转成to_base进制 |
-- 进制转换
SELECT
BIN(10), #二进制
HEX(15), #十六进制
OCT(10), #八进制
CONV(15,16,10) #把十六进制的15变成十进制的15
;
IP地址转换
函数 | 作用 |
INET_ATON(IP) | 将点分十进制的IP地址转为数字 |
INET_NTOA(number) | 将数字形式的IP转为点分十进制 |
数字形式我们看不懂,需要把它转换点分十进制,但是实际上计算机使用的是点分十进制
SELECT INET_ATON('192.168.0.1')
->3232235521
SELECT INET_NTOA(3232235521)
->192.168.0.1
-- IP地址转换
SELECT
INET_ATON('127.0.0.1'), #把点分十进制的IP转换成数字
INET_NTOA(2130706433) #将数字的IP转换成点分十进制
;