MySQL Day03 DQL查詢數據、WHERE子句、聯表查詢

MySQL DQL查詢數據、WHERE子句、聯表查詢

前言:本文采用的數據庫是我之前博客中發表的測試數據庫,可以戳鏈接查看:https://blog.csdn.net/qq_44958172/article/details/105362696

1 DQL概述

(Date Query Language: 數據查詢語言)

  • 所有的查詢操作都用到Select
  • 簡單的查詢,複雜的查詢它都能做
  • 數據庫中過最核心的語言,最重要的語言
  • 使用頻率最高的語句

2 指定查詢字段

2.1 簡單查詢測試代碼:

-- 查詢全部學生 SELECT 字段 FROM 表
SELECT * FROM `student`;

-- 查詢指定字段
SELECT `StudentNo`, `Name` FROM `student`;

-- 別名,給結果起一個名字 AS :可以給字段起別名,也可以給表起別名
SELECT `StudentNo` AS 學號, `Name` AS 學生姓名 FROM `student` AS s;

-- 函數 CONCAT(a,b) 拼接字符串
SELECT CONCAT('姓名:',Name) AS 新名字 FROM `student`;

語法:SELECT 字段... FROM 表

在列名字並不容易見名知意時,我們可以使用字段名 AS 別名 表名 AS 別名來進行“起別名”操作。

2.2 去重 (DISTINCT)

作用:去除SELECT查詢結果中重複的數據,重複的數據只顯示一條。

-- 查詢有哪些同學參加了考試,並展示成績
SELECT * FROM `result` -- 查詢全部考試成績

SELECT `StudentNo` FROM result -- 查詢有哪些同學參加了考試
-- 以上語句中發現了重複數據,所以需要去重操作

SELECT DISTINCT `StudentNo` FROM result

2.3 數據庫的列(表達式)

SELECT VERSION() -- 查詢系統版本(函數)
SELECT 100*3-1 AS 計算結果 -- 用來計算(表達式)
SELECT @@auto_increment_increment -- 查詢自增的步長(變量)

數據庫中的表達式:文本值,列,NULL,函數,計算表達式,系統變量…

格式:SELECT 表達式 FROM 表名

2.4 “所有成績+1”小案例

測試代碼:

-- 學生原考試成績查看
SELECT `StudentNo`,`StudentResult` AS '提分前' FROM result;

-- 學生考試成績 + 1分查看
SELECT `StudentNo` ,`StudentResult`+1 AS '提分後' FROM result;

原考試成績:

在這裏插入圖片描述

更改後考試成績:

在這裏插入圖片描述

3 WHERE 條件字句

作用:檢索數據中符合條件的值

搜索的條件由一個或多個表達式組成,結果爲布爾值!

3.1 邏輯運算符

運算符 語法 描述
AND && a AND b a&&b 邏輯與
OR || a OR b a||b 邏輯或
NOT ! NOT a !a 邏輯非

儘量使用英文字母!

測試代碼:

-- ==================== WHERE ==================== --
SELECT `StudentNo`,`StudentResult` FROM result

-- 查詢成績在95~100之間,使用AND或&&均可!
SELECT `StudentNo`,`StudentResult` FROM result 
WHERE `StudentResult`>=95 AND `StudentResult`<=100

-- 模糊查詢(區間)
SELECT `StudentNo`,`StudentResult` FROM result 
WHERE `StudentResult` BETWEEN 95 AND 100


-- 除了10001號學生之外的同學的成績 NOT 或 !=均可!
SELECT `StudentNo`, `StudentResult` FROM `result`
WHERE `StudentNo` != 10001

SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE NOT `StudentNo` = 10001

3.2 模糊查詢

模糊查詢的本質是比較運算符。

運算符 語法 描述
IS NULL a IS NULL 如果操作符爲NULL,結果爲真
IS NOT NULL a IS NOT NULL 如果操作符不爲NULL,結果爲真
BETWEEN a BETWEEN b AND c 若a在[b, c]之間,則結果爲真
LIKE a LIKE b SQL匹配,如果a匹配到b,則結果爲真
IN a IN (a1, a2, a3…) 假設a在a1|a2|…中,結果爲真

測試代碼:

-- ==================== 模糊查詢 ==================== --

-- LIKE結合 %(代表0到任意個字符) _(一個字符)
-- 查詢姓名爲C開頭的同學
SELECT `StudentNo`,`Name` FROM `student`
WHERE Name LIKE 'C%'

-- 查詢姓名C開頭的同學,且C後只有3個字符的
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Name` LIKE 'C___'

-- 查詢姓名中有包含ai的同學
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Name` LIKE '%ai%'

-- ===== IN(具體的一個或多個值) ===== --
-- 查詢10157,10111,10090號學生
SELECT `StudentNo`,`Name` FROM `student`
WHERE `StudentNo` IN (10157,10111,10090)

-- ====== NULL 和 NOT NULL====== --
-- 查詢地址爲空的學生 NULL ''
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Address`='' OR `Address` IS NULL

-- 查詢出生日期不爲空的同學
SELECT `StudentNo`,`Name` FROM `student`
WHERE `Birth` IS NOT NULL

4 聯表查詢

4.1 JOIN ON 語句

JOIN ON語句: INNER JOIN…ON…、LEFT JOIN…ON…、RIGHT JOIN…ON…

操作 描述
INNER JOIN 如果表中至少有一個匹配,就返回
LEFT JOIN 從左表返回所有的值,即使右表中沒有匹配,
RIGHT JOIN 會從右表中返回所有的值,即使左表中沒有匹配

先使用案例對該語句進行測試:

測試代碼:

-- ============ 聯表查詢 join ============ --
-- 查詢參加了考試的同學(學號,姓名,科目編號,分數)

/*思路
1. 分析需求,分析查詢的字段來自哪種表(連接查詢)
2. 確定使用哪種連接查詢? 7種
確定交叉點(幾個表中相同的數據)
判斷條件:學生表中的StudentNo = 成績表中的StudentNo
*/
-- JOIN ON (連接的表)ON (判斷的條件) 連接查詢
-- WHERE 等值查詢

-- INNER JOIN
SELECT s.`StudentNo`,`Name`,`SubjectNo`,`StudentResult`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`StudentNo`=r.`StudentNo`

-- RIGHT JOIN
SELECT s.`StudentNo`,`Name`,`SubjectNo`,`StudentResult`
FROM `student` s
RIGHT JOIN result r
ON s.`StudentNo`=r.`StudentNo`

-- LEFT JOIN
SELECT s.`StudentNo`,`Name`,`SubjectNo`,`StudentResult`
FROM `student` s
LEFT JOIN result r
ON s.`StudentNo`=r.`StudentNo`

測試結果:

– INNER JOIN:

在這裏插入圖片描述

– RIGHT JOIN:

在這裏插入圖片描述

– LEFT JOIN:

在這裏插入圖片描述

4.2 思考題

1 思考題(查詢參加考試的同學信息:學號,姓名,科目名稱,成績)

解題思路:

  1. 所要查詢字段來自於 student、subject、result
  2. 確定以result表爲基準 查詢
  3. 交叉點爲:student與result表中StudentNo相同,subject與result表中SubjectNo相同;

代碼:

SELECT s.`StudentNo`, `Name`,`SubjectName`,`StudentResult`
FROM `student` s
RIGHT JOIN `result` r
ON r.`StudentNo` = s.`StudentNo`
INNER JOIN `subject` sub
ON r.`SujectNo` = sub.`SubjectNo`

結果:

在這裏插入圖片描述

2 查詢學生學號、姓名、年級名稱

代碼:

-- 學生學號、姓名、年級名稱
SELECT `studentno`, `name`,`gradename`
FROM student s
INNER JOIN `grade` g
ON s.`gradeid` = g.`gradeid`

結果:

在這裏插入圖片描述

3 查詢參加了Finances考試的同學信息:學號、學生姓名、科目名、分數

代碼:

-- 查詢參加了Finances考試的同學信息:學號、學生姓名、科目名、分數
SELECT s.`studentno`, `name`, `subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
ON r.`subjectno` = sub.`subjectno`
WHERE `subjectname` = 'Finances'

結果:

在這裏插入圖片描述

4.3 聯表查詢解題思路

解題思路

  • 首先明確要查詢哪些數據SELECT…
  • 從哪幾個表中查找 FROM 表 XXX JOIN 連接的表 ON 交叉條件
  • 假設需要多張表查詢,慢慢來,先查詢兩張表然後慢慢增加

– FROM a LEFT JOIN b ON… 以a表爲基準
– FROM a RIGHT JOIN b ON… 以b表爲基準

寫在最後

And this is my prayer: that your love may abound more and more in knowledge and depth of insight, so that you may be able to discern what is best and may be pure and blameless for the day of Christ, filled with the fruit of righteousness that comes through Jesus Christ—to the glory and praise of God. (Philippians 1: 9-11)
To Demut!

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