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!

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