MySQL Day05 子查询、函数、MD5加密、SELECT小结

1 MySQL子查询

WHERE 这个值是计算出来的

本质:在where语句中嵌套一个子查询语句

1、查询Customer Relations 的所有考试结果(学号,科目编号,成绩)

-- ========= WHERE ========== --
-- 1、查询Customer Relations	的所有考试结果(学号,科目编号,成绩)
-- 方式一:使用连接查询
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
FROM `result` r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
WHERE SubjectName = 'Customer Relations'
ORDER BY StudentResult DESC;


-- 方式二:使用子查询()

SELECT `StudentNo`,`SubjectNo`,`StudentResult`
FROM `result`
WHERE SubjectNo IN (
	SELECT SubjectNo FROM `subject`
	WHERE SubjectName='Customer Relations'
)
ORDER BY StudentResult DESC;

2、查询分数不小于90分的学生的学号、姓名和成绩

-- 2、查询分数不小于90分的学生的学号、姓名和成绩
SELECT s.`StudentNo`, `Name`, `StudentResult`
FROM student s
INNER JOIN result r
ON r.`StudentNo` = s.`StudentNo`
WHERE `StudentResult` >= 90;

-- 在这个基础上增加一个科目Human Resources	
-- 子查询写法
SELECT s.`StudentNo`, `Name`, `StudentResult`
FROM student s
INNER JOIN result r
ON r.`StudentNo` = s.`StudentNo`
WHERE `StudentResult` >= 90 AND `SubjectNo` IN (
	SELECT `SubjectNo` FROM `subject`
	WHERE `SubjectName` = 'Human Resources'
);

-- INNER JOIN 写法
SELECT s.`StudentNo`, `Name`, `StudentResult`
FROM student s
INNER JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
WHERE `SubjectName` = 'Human Resources' AND StudentResult >= 90;

-- 优化:由里及外查询
SELECT `StudentNo`,`Name` 
FROM `student` WHERE StudentNo IN (
	SELECT `StudentNo` FROM `result`
	WHERE `StudentResult` >=90 AND `SubjectNo` IN (
  	SELECT `SubjectNo` FROM `SUBJECT`
  	WHERE SubjectName = 'Human Resources'
  )
);

2 MySQL 函数

2.1 常用函数

-- ================ 常用函数 ================ --
-- 数学运算
SELECT ABS(-8); -- 绝对值
SELECT CEILING(9.4); -- 向上取整
SELECT FLOOR(9.4); -- 向下取整
SELECT RAND(); -- 返回一个0~1之间的随机数
SELECT SIGN(-10); -- 判断一个数的符号: 负数返回-1,正数返回1

-- 字符串函数
SELECT CHAR_LENGTH('你好世界!') -- 字符串长度
SELECT CONCAT('我','爱','JAVA') -- 拼接字符串
SELECT INSERT('OK WORLD',1,2,'HELLO') -- 查询,替换, 从某个位置开始替换某个长度
SELECT LOWER('HELLO') -- 转小写字母
SELECT UPPER('hello') -- 转大写字母

SELECT INSTR('JeverDemut','D') -- 返回第一次出现的位置
SELECT REPLACE('坚持就能成功','坚持','勤奋') -- 替换字符串

SELECT SUBSTR('JEVERDEMUT', 6,5) -- 返回指定的子字符串 (从指定位置截取指定长度)

SELECT REVERSE ('你是年少的欢喜') -- 反转字符串

-- 时间和日期函数(记住)
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 SECOND(NOW())

-- 系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()

2.2 聚合函数

函数名称 描述
COUNT() 计数
SUM() 求和
AVG() 平均值
MAX() 最大值
MIN() 最小值
-- 查询一个表中记录的个数
-- 以下三种方法均能够统计
SELECT COUNT(`Name`) FROM student -- COUNT(字段) 会忽略所有的null值
SELECT COUNT(*) FROM student -- COUNT(*) 不会忽略null值,本质:计算行数
SELECT COUNT(1) FROM result -- 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`, AVG(StudentResult) AS 平均分, MAX(StudentResult) AS 最高分, MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
GROUP BY sub.SubjectName -- 通过某个字段来分组
HAVING 平均分>60 -- 分组与过滤
ORDER BY AVG(StudentResult) DESC -- 通过平均分降序排列

在这里插入图片描述

2.3 数据库级别的MD5级别加密

MD5主要增强了算法复杂度和不可逆性。同时,MD5不可逆,具体的值对应的md5是一样的!

补充:MD5破解网站的原理,背后有一个字典,MD5加密后的值,加密的前值,所以一般这种网站是骗人的!

在测试之前我们首先需要建立一个简单的数据表:(代码如下)

-- ============ 测试MD5加密 ============= --
CREATE TABLE `testmd5`(
	`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 `testmd5` VALUES(1,'张三','123456'),(2,'李四','666666'),(3,'王五','222222')

创建完成后,查看数据表:

在这里插入图片描述

输入以下代码并运行:

-- 加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1

在这里插入图片描述

先对上述代码进行优化并交代如何校验:

-- 插入的时候就加密
INSERT INTO `testmd5` VALUES(4,'小明',MD5('222222'))

-- 如何校验:将用户传递进来的密码进行md5加密,随后比对加密后的值!
SELECT * FROM testmd5 WHERE `name` = '小明' AND pwd=md5('222222')

3 SELECT 小结

SELECT 的使用基本语法格式参照下列代码:

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[AS alias1][,table.field2[AS alias2][,...]}
FROM TABLE_NAME [AS TABLE_ALIAS]
	[LEFT | RIGHT | INNER JOIN TABLE_NAME2] -- 联表查询
	[WHERE ...] -- 指定结果需要满足的条件
	[GROUP BY ...] -- 指定结果按照哪几个字段来分组
	[HAVING ...] -- 过滤分组的记录必须满足的次要条件
	[ORDER BY ...] -- 指定查询记录按照一个或多个条件排序
	[LIMIT startindex, pagesize] -- 指定查询的记录从哪条到哪条

写在最后

if you continue in your faith, established and firm, and do not move from the hope held out in the gospel. (Colossians 1 : 23)

To Demut!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章