條件查詢基礎:用WHERE子句篩選數據
在第三天學習的基礎查詢中,我們獲取的是表中的所有記錄。但實際工作中,我們往往只需要符合特定條件的數據。比如從員工表中篩選"工資大於5000的員工",從商品表中查找"庫存小於10件的商品"。這就需要使用WHERE子句來實現條件篩選。
WHERE子句的基本語法結構如下:
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 條件表達式;
注意事項:WHERE子句必須緊跟在FROM子句之後,在ORDER BY等其他子句之前。
比較運算符:構建基礎篩選條件
MySQL提供了多種比較運算符,用於構建簡單的篩選條件:
表格
|
運算符 |
描述 |
示例 |
|
= |
等於 |
salary = 5000 |
|
<> 或 != |
不等於 |
department <> 'IT' |
|
> |
大於 |
age > 30 |
|
< |
小於 |
price < 100 |
|
>= |
大於等於 |
score >= 90 |
|
<= |
小於等於 |
stock <= 50 |
示例1:查詢學生表中年齡大於20歲的學生信息
-- 創建測試數據(請先執行此代碼)
CREATE TABLE IF NOT EXISTS students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
score DECIMAL(5,2),
major VARCHAR(30)
);
INSERT INTO students (name, age, score, major) VALUES
('張三', 19, 85.5, '計算機科學'),
('李四', 21, 92.0, '軟件工程'),
('王五', 20, 78.5, '計算機科學'),
('趙六', 22, 88.0, '數據科學'),
('錢七', 19, 95.5, '人工智能');
-- 查詢年齡大於20歲的學生
SELECT id, name, age, major
FROM students
WHERE age > 20;
執行結果將返回李四(21歲)和趙六(22歲)兩條記錄。
邏輯運算符:組合多個篩選條件
當需要同時滿足多個條件時,就需要使用邏輯運算符。MySQL支持三種基本邏輯運算符:
- AND:同時滿足所有條件
- OR:滿足任意一個條件
- NOT:否定條件
示例2:查詢計算機科學專業且分數大於80分的學生
-- 多條件組合查詢
SELECT name, age, score, major
FROM students
WHERE major = '計算機科學' AND score > 80;
示例3:查詢年齡小於20歲或分數大於90分的學生
-- OR條件查詢
SELECT name, age, score
FROM students
WHERE age < 20 OR score > 90;
注意:當組合使用AND和OR時,建議使用括號明確優先級,避免邏輯錯誤。
-- 帶括號的優先級查詢
SELECT name, age, score, major
FROM students
WHERE (major = '計算機科學' AND score > 85) OR (major = '人工智能' AND age < 20);
高級條件篩選:BETWEEN、IN與模糊查詢
BETWEEN:範圍查詢
當需要查詢某個範圍內的數據時,使用BETWEEN...AND...運算符比連續使用>=和<=更簡潔。
語法:列名 BETWEEN 最小值 AND 最大值(包含邊界值)
示例4:查詢分數在80到90之間的學生
-- 範圍查詢
SELECT name, score
FROM students
WHERE score BETWEEN 80 AND 90;
-- 等效於
SELECT name, score
FROM students
WHERE score >= 80 AND score <= 90;
如果要排除邊界值,可以使用NOT BETWEEN:
-- 排除邊界值的範圍查詢
SELECT name, score
FROM students
WHERE score NOT BETWEEN 80 AND 90;
IN:多值匹配
當需要匹配多個可能的值時,IN運算符比多個OR條件更高效。
語法:列名 IN (值1, 值2, ..., 值n)
示例5:查詢專業為計算機科學或人工智能的學生
-- 多值匹配查詢
SELECT name, major
FROM students
WHERE major IN ('計算機科學', '人工智能');
-- 等效於
SELECT name, major
FROM students
WHERE major = '計算機科學' OR major = '人工智能';
同樣可以使用NOT IN排除指定值:
-- 排除指定值的查詢
SELECT name, major
FROM students
WHERE major NOT IN ('計算機科學', '人工智能');
LIKE:模糊查詢
當需要根據部分字符匹配數據時(如搜索姓名中包含"張"的學生),可以使用LIKE進行模糊查詢,配合通配符使用:
- %:匹配任意長度的字符串(包括0個字符)
- _:匹配單個字符
示例6:模糊查詢練習
-- 查詢姓"張"的學生(張開頭,後面任意字符)
SELECT name
FROM students
WHERE name LIKE '張%';
-- 查詢名字第二個字是"四"的學生(任意字符開頭,第二個是四,後面任意)
SELECT name
FROM students
WHERE name LIKE '_四%';
-- 查詢名字中包含"五"的學生(任意位置有五)
SELECT name
FROM students
WHERE name LIKE '%五%';
-- 查詢名字正好是兩個字的學生(兩個任意字符)
SELECT name
FROM students
WHERE name LIKE '__';
注意:如果要查詢包含%或_的特殊字符,需要使用ESCAPE關鍵字定義轉義符:
-- 查詢包含%符號的記錄(假設存在這樣的數據)
SELECT * FROM 表名 WHERE 列名 LIKE '%\%%' ESCAPE '\';
結果排序:用ORDER BY排列數據
默認情況下,查詢結果的順序是不確定的。使用ORDER BY子句可以對結果集按一個或多個列進行排序。
語法:ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC]...
- ASC:升序(默認,可省略)
- DESC:降序
單列排序
示例7:按分數升序排列學生
-- 升序排序(默認)
SELECT name, score
FROM students
ORDER BY score;
-- 等效於
SELECT name, score
FROM students
ORDER BY score ASC;
示例8:按分數降序排列學生
-- 降序排序
SELECT name, score
FROM students
ORDER BY score DESC;
多列排序
當第一列有相同值時,會按第二列排序,以此類推。
示例9:先按專業升序,再按分數降序排列
-- 多列排序
SELECT name, major, score
FROM students
ORDER BY major ASC, score DESC;
結合條件查詢的排序
ORDER BY通常與WHERE子句結合使用,先篩選後排序。
示例10:查詢計算機科學專業學生,按分數降序排列
-- 條件篩選後排序
SELECT name, score
FROM students
WHERE major = '計算機科學'
ORDER BY score DESC;
實踐任務:從基礎到綜合的查詢練習
任務1:基礎條件查詢練習(難度:★☆☆)
目標:使用基本條件篩選和簡單排序獲取指定數據
操作步驟:
- 創建測試數據表:
CREATE TABLE IF NOT EXISTS products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
category VARCHAR(30),
price DECIMAL(10,2),
stock INT,
production_date DATE
);
INSERT INTO products (name, category, price, stock, production_date) VALUES
('筆記本電腦', '電子產品', 4999.00, 25, '2023-01-15'),
('機械鍵盤', '電子產品', 299.00, 50, '2023-03-20'),
('連衣裙', '服裝', 199.00, 30, '2023-04-10'),
('運動鞋', '服裝', 399.00, 45, '2023-02-28'),
('無線耳機', '電子產品', 799.00, 15, '2023-01-30'),
('牛仔褲', '服裝', 149.00, 60, '2023-03-05'),
('智能手錶', '電子產品', 1299.00, 20, '2023-02-18'),
('T恤衫', '服裝', 89.00, 100, '2023-04-22');
- 完成以下查詢:
- 查詢價格大於500元的商品
- 查詢庫存小於30的電子產品
- 查詢2023年3月之後生產的服裝類商品
- 查詢名稱中包含"手錶"或"耳機"的商品
任務2:條件組合應用(難度:★★☆)
目標:綜合運用多種條件運算符解決複雜查詢需求
需求説明:基於任務1創建的products表,編寫SQL語句完成以下查詢:
- 查詢價格在200-1000元之間,且庫存大於30的商品
- 查詢不屬於電子產品類別,且價格小於200元或庫存大於50的商品
- 查詢名稱以"鞋"結尾,或者價格大於1000元且庫存小於25的商品
- 查詢2023年2月份生產的電子產品,按價格從高到低排序
任務3:綜合排序查詢(難度:★★★)
目標:結合所有條件查詢和排序知識,完成綜合查詢任務
需求説明:基於前面的students表和products表,完成以下任務:
- 創建學生成績表:
CREATE TABLE IF NOT EXISTS student_scores (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT,
course VARCHAR(50),
score INT,
exam_date DATE,
FOREIGN KEY (student_id) REFERENCES students(id)
);
INSERT INTO student_scores (student_id, course, score, exam_date) VALUES
(1, '數據庫', 85, '2023-06-10'),
(1, 'Python', 92, '2023-06-12'),
(2, '數據庫', 90, '2023-06-10'),
(2, 'Python', 88, '2023-06-12'),
(3, '數據庫', 78, '2023-06-10'),
(3, 'Python', 80, '2023-06-12'),
(4, '數據庫', 95, '2023-06-10'),
(4, 'Python', 98, '2023-06-12'),
(5, '數據庫', 82, '2023-06-10'),
(5, 'Python', 86, '2023-06-12');
- 完成綜合查詢:
- 查詢數據庫課程分數在85-95之間的學生ID、姓名和分數
- 查詢所有學生的Python成績,按分數降序排列,分數相同的按學生ID升序排列
- 查詢名字為三個字的學生的數據庫成績,要求顯示學生姓名、課程和分數
- 統計每個學生的總分(所有課程),並按總分從高到低排序(提示:使用SUM()函數和GROUP BY子句,這兩個知識點將在後續課程詳細講解,此處可先嚐試或跳過)
總結與下一步學習預告
今天我們學習了MySQL中最常用的條件查詢和結果排序技術,包括:
- 使用WHERE子句進行基本條件篩選
- 比較運算符(=、>、<、>=、<=、<>)和邏輯運算符(AND、OR、NOT)的組合使用
- 高級條件查詢:BETWEEN範圍查詢、IN多值匹配、LIKE模糊查詢
- 使用ORDER BY對結果進行單列或多列排序
這些技能是SQL查詢的核心基礎,幾乎所有實際的數據獲取操作都離不開條件篩選和排序。明天我們將學習更高級的查詢技術:聚合函數與分組查詢,讓你能夠對數據進行統計分析,比如"計算每個部門的平均工資"、"統計各商品類別的銷售總量"等。
明日預告:MySQL第五天 - 聚合函數與分組查詢(COUNT、SUM、AVG、GROUP BY、HAVING)