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!