官网:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
5.1常用函数
数学运算
-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING (9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT RAND() -- 生成0-1之间的随机数
SELECT SIGN(-5) -- 判断一个数的符号,整数返回1,负数返回-1.0返回0
字符串函数
-- 字符串函数
SELECT CHAR_LENGTH('即使再小的帆也能远航') -- 返回字符串长度
SELECT CONCAT('我','爱','你们') -- 拼接字符串
SELECT INSERT('我爱编程HelloWorld',1,2,'超级热爱') -- 从某个位置开始替换某个长度
-- 超级热爱编程HelloWorld 相当于把从第一个位置开始的2个字符替换成新的字符串
SELECT INSERT('我爱编程HelloWorld',1,2,'超级11111') -- 超级11111编程HelloWorld
SELECT INSERT('我爱编程HelloWorld',1,4,'超级11111') -- 超级11111HelloWorld
SELECT LOWER('ABDGcscdsDAS') -- 全部变成小写字母
SELECT UPPER('ABDGcscdsDAS') -- 全部变成大写字母
SELECT INSTR('abdhsghfhjs','sg') -- 返回字符串第一次出现的索引,感觉mysql是从1开始计数的
SELECT REPLACE('世上无难事,只要肯攀登','攀登','放弃') -- 替换指定字符串
SELECT SUBSTR('世上无难事,只要肯攀登',1,5) -- 从第一个字符开始,截取5个字符
SELECT REVERSE('世上无难事,只要肯攀登') -- 反转字符串 登攀肯要只,事难无上世
-- 把所有姓刘的同学改成姓牛
SELECT REPLACE(`studentname`,'刘','牛')FROM `student` WHERE `studentname` LIKE '刘%'
时间和日期函数(记住)
-- 时间和日期函数(记住)
SELECT CURRENT_DATE() -- 获取当前日期 2021-03-23
SELECT CURDATE() -- 获取当前日期 2021-03-23
SELECT NOW() -- 获取当前时间 2021-03-23 15:51:25
SELECT LOCALTIME() -- 获取当前时间 2021-03-23 15:52:09
SELECT SYSDATE() -- 获取系统时间 2021-03-23 15:53:29
SELECT YEAR(NOW()) -- 返回当前年 2021
SELECT MONTH(NOW()) -- 返回当前y月3
SELECT DAY(NOW()) -- 返回当前日 23
SELECT HOUR(NOW()) -- 返回当前时 15
SELECT MINUTE(NOW()) -- 返回当前分 56
SELECT SECOND(NOW()) -- 返回当前秒 32
系统
-- 系统
SELECT SYSTEM_USER() -- root@localhost
SELECT USER()-- root@localhost
SELECT VERSION() -- 5.5.40
5.2聚合函数(常用)
计算平均值,最大值,最小值
-- count() 查询表中有多少个记录
SELECT COUNT( `studentname`) FROM `student` -- 查询有多少个学生 返回10 COUNT( 字段)
SELECT COUNT( *) FROM `student` -- COUNT( *) 返回10
SELECT COUNT(1) FROM `student` -- COUNT(1) 返回10
-- 区别 COUNT( 字段)会忽略所有的null值 COUNT( *)和COUNT( 1)不会忽略null值
-- 求学生总分和
SELECT SUM(`studentresult`)AS 总和 FROM `result`
-- 求平均分
SELECT AVG(`studentresult`) AS 平均分 FROM `result`
-- 求最高分
SELECT MAX(`studentresult`) AS 最高分 FROM `result`
-- 求最低分
SELECT MIN(`studentresult`) AS 最高分 FROM `result`
查询不同课程的平均分,最高分,最低分
核心:根据不同的课程分组
SELECT `subjectname` AS 课程名称 ,AVG(`studentresult`)AS 平均分 ,MAX(`studentresult`)AS 最高分 ,MIN(`studentresult`)AS 最低分 -- as 课程编号, 平均分,最高分,最低分
FROM `result` r
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno` -- 不分组只能查出来一条记录是因为最高最低只有一个
分组过滤
SELECT `subjectname` AS 课程名称 ,AVG(`studentresult`)AS 平均分 ,MAX(`studentresult`)AS 最高分 ,MIN(`studentresult`)AS 最低分 -- as 课程编号, 平均分,最高分,最低分
FROM `result` r
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno` -- 不分组只能查出来一条记录是因为最高最低只有一个
GROUP BY r.`subjectno` -- 通过某一字段分组
挑选平均分大于80分的数据
我的第一想法
WHERE AVG(`studentresult`)>80
SELECT `subjectname` AS 课程名称 ,AVG(`studentresult`)AS 平均分 ,MAX(`studentresult`)AS 最高分 ,MIN(`studentresult`)AS 最低分 -- as 课程编号, 平均分,最高分,最低分
FROM `result` r
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno` -- 不分组只能查出来一条记录是因为最高最低只有一个
WHERE AVG(`studentresult`)>80
GROUP BY r.`subjectno` -- 通过某一字段分组
having —过滤分组的记录必须满足的次要条件
而且having在group by 的下面
对函数进行过滤用having ,where不能和group by 连用
where是判断每一条记录,having二次过滤可以判断组
SELECT `subjectname` AS 课程名称 ,AVG(`studentresult`)AS 平均分 ,MAX(`studentresult`)AS 最高分 ,MIN(`studentresult`)AS 最低分 -- as 课程编号, 平均分,最高分,最低分
FROM `result` r
INNER JOIN `subject` sub
ON r.`subjectno`=sub.`subjectno` -- 不分组只能查出来一条记录是因为最高最低只有一个
GROUP BY r.`subjectno` -- 通过某一字段分组
HAVING AVG(`studentresult`)>80
5.3 数据库级别的MD5加密(扩展)
什么是MD5?
主要增强算法复杂度和不可逆性。
MD5不可逆
MD5破解网站的原理,背后有一个字典,MD5加密后的值﹐加密的慎
测试MD5加密
-- 测试MD5加密
CREATE TABLE `testnd5`(
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
-- 明文
INSERT INTO `testnd5` VALUES(1,'此生辽阔','123456')
INSERT INTO `testnd5` VALUES(2,'满天星火','55221'),(3,'七步成诗','62158')
加密
-- 加密
UPDATE `testnd5` SET `pwd`=MD5(`pwd`)
指定加密
UPDATE `testnd5` SET `pwd`=MD5(`pwd`) WHERE `id`=1
插入的时候加密
INSERT INTO `testnd5` VALUES(4,'天方夜谭',MD5('9991314'))
校验
-- 如何校验 将用户传进来的密码进行MD5加密 然后比对加密后的值
SELECT * FROM `testnd5` WHERE `name`='此生辽阔' AND `pwd`=MD5('123456')