前言
Mysql的函数非常多,它可以进行数学运算,字符串运算等等。由于数量较多,我们今天调一部分出来与大家分享。
关于函数的完整官方文档可以参考:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
1. 常用函数
这个标题其实有点误导人,说它常用吗,其实使用频率并不高,更应该叫做基础函数。
数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下去整
SELECT RAND() -- 返回一个0~1之间的随机数
SELECT SIGN(-10) -- 判断一个数的符号 0返回0;负数返回-1;正数返回1
字符串函数
SELECT CHAR_LENGTH('即使再小的帆也能远航') -- 字符串长度
SELECT CONCAT('我','爱','你们') -- 拼接字符串
SELECT INSERT('我爱你',1,2,'超级喜欢') -- 从某个位置开始替换某个长度
SELECT LOWER('Stephen_Gs') -- 小写字母
SELECT UPPER('Stephen_Gs') -- 大写字母
SELECT INSTR('Stephen_Gs','p') -- 返回第一个出现的字符串索引
SELECT REPLACE('狂神说坚持就能成功','坚持','努力') -- 替换出现的字符串
SELECT SUBSTR('狂神说坚持就能成功',4,6) -- 返回指定的子字符串(源字符串,截取的位置,截取的长度)
SELECT REVERSE('清晨我上马') -- 反转
-- 应用实例
-- 查询姓狂的同学,并改成系
SELECT REPLACE(`name`,'狂','系') AS `name` FROM student
WHERE `name` LIKE '狂%'
时间和日期函数(应用较多)
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE() -- 获取当前日期
SELECT NOW() -- 获取当前的时间
SELECT LOCALTIME() -- 本地时间
SELECT SYSDATE() -- 系统时间
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
系统函数
SELECT SYSTEM_USER() -- 获取系统用户
SELECT USER() -- 获取用户
SELECT VERSION() -- 获取版本
2. 聚合函数(常用)
聚合函数是我们平时开发中最常使用的mysql函数
我们现在有一个学生表
我们通过count()的三种形式来获取表中的记录数
SELECT COUNT(`gradeid`) FROM student -- Count(字段),会忽略null值
SELECT COUNT(*) FROM student -- count(*),不会忽略null值,计算行数
SELECT COUNT(1) FROM student -- count(1),不会忽略null值,计算行数
1的结果为4,2和3的结果为5(对于count(1) 和 count(*) 的区别百度上有很多的解释,这里就不再强调)
我们还可以通过聚合函数算出分数的相关结果
SELECT SUM(`score`) AS 总和 FROM student
SELECT AVG(`score`) AS 平均分 FROM student
SELECT MAX(`score`) AS 最高分 FROM student
SELECT MIN(`score`) AS 最低分 FROM student
3. 数据库级别的MD5加密 (扩展)
什么是MD5?
主要是增强算法的复杂性和不可逆性。MD5虽然不可逆,但是具体值的md5却是一样的。
对于MD5破解网站的原理,其实是背后有一个字典。我们查的是MD5加密后的值,它返回的是加密前的值(不过只能破解一些简单的密码。如:123456这种)
下面我们模拟生成一个MD5加密的表
-- 创建 testmd5的表
CREATE TABLE `testmd5`(
`id` INT(4) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50),
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8、
-- 插入明文的密码
-- 明文密码
INSERT INTO testmd5(`name`,`pwd`) VALUES
('zs','123456'),
('ls','abcdef'),
('ww','12309aa')
-- 加密
UPDATE testmd5 SET pwd=MD5(pwd) -- 加密全部的密码
1.我们可以看到原来的明文密码变成了一串奇怪的数字+字母;
2.我们还可直接在插入时就对密码进行加密
INSERT INTO testmd5(`name`,`pwd`) VALUES
('小明',MD5('123456'))
3.观察上表中小明和zs的密码可以发现,他们两个的密文其实是相等的,因为他们的明文密码都是123456。
4. 那我们平时开发中又如何校验相关的数据呢,一般是将用户传进来的密码进行md5加密后,然后比对加密后的值。
SELECT * FROM testmd5 WHERE `name`='小明' AND pwd=MD5('123456')
查询的结果为: