MySQL WHERE子句實(shí)踐指南(精準(zhǔn)過(guò)濾數(shù)據(jù)的藝術(shù))
一、WHERE子句語(yǔ)法格式詳解
1.1 基礎(chǔ)語(yǔ)法結(jié)構(gòu)
WHERE子句是SELECT語(yǔ)句中的篩選條件部分,用于從表中提取滿足特定條件的記錄。
sql SELECT 列名1, 列名2, ... FROM 表名 WHERE 條件表達(dá)式;
1.2 完整的SELECT語(yǔ)句結(jié)構(gòu)
sql
SELECT
[ALL | DISTINCT | DISTINCTROW]
select_expr [, select_expr ...]
FROM
table_references
[WHERE where_condition] -- WHERE子句位置
[GROUP BY {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position} [ASC | DESC]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}];
1.3 運(yùn)算符優(yōu)先級(jí)表
優(yōu)先級(jí) 運(yùn)算符 描述 1 =, <>, !=, <, <=, >, >= 比較運(yùn)算符 2 BETWEEN, LIKE, IN, IS NULL 特殊比較 3 NOT 邏輯非 4 AND 邏輯與 5 OR 邏輯或
二、帶IN關(guān)鍵字的查詢:多值匹配
2.1 基本語(yǔ)法格式
sql SELECT 列名 FROM 表名 WHERE 列名 IN (值1, 值2, 值3, ...);
2.2 實(shí)際應(yīng)用示例
sql
-- 示例表:?jiǎn)T工表(employees)
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(30),
salary DECIMAL(10,2),
hire_date DATE
);
-- 插入示例數(shù)據(jù)
INSERT INTO employees VALUES
(1, '張三', '技術(shù)部', 8500, '2022-03-15'),
(2, '李四', '銷售部', 7500, '2021-08-22'),
(3, '王五', '技術(shù)部', 9200, '2020-11-05'),
(4, '趙六', '市場(chǎng)部', 6800, '2023-01-30'),
(5, '孫七', '人事部', 6500, '2022-06-18'),
(6, '周八', '技術(shù)部', 8800, '2021-09-10');
示例1:查詢指定部門的員工
sql
-- 查詢屬于技術(shù)部或銷售部的員工
SELECT
id AS '員工編號(hào)',
name AS '姓名',
department AS '部門',
salary AS '薪資'
FROM employees
WHERE department IN ('技術(shù)部', '銷售部');
查詢結(jié)果:
text
員工編號(hào) 姓名 部門 薪資
1 張三 技術(shù)部 8500.00
2 李四 銷售部 7500.00
3 王五 技術(shù)部 9200.00
6 周八 技術(shù)部 8800.00
示例2:IN子查詢的運(yùn)用
sql
-- 查詢薪資高于平均薪資的員工
SELECT
name AS '姓名',
salary AS '薪資'
FROM employees
WHERE salary IN (
SELECT salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
);
2.3 NOT IN的用法
sql
-- 查詢不在某些部門的員工
SELECT
name AS '姓名',
department AS '部門'
FROM employees
WHERE department NOT IN ('人事部', '市場(chǎng)部');
三、帶BETWEEN AND的范圍查詢
3.1 基礎(chǔ)語(yǔ)法格式
sql SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2; -- 等價(jià)于:WHERE 列名 >= 值1 AND 列名 <= 值2
3.2 實(shí)際應(yīng)用示例
sql
-- 示例表:學(xué)生成績(jī)表(scores)
CREATE TABLE scores (
student_id INT,
student_name VARCHAR(50),
subject VARCHAR(20),
score INT,
exam_date DATE
);
INSERT INTO scores VALUES
(101, '張三', '數(shù)學(xué)', 85, '2023-06-15'),
(102, '李四', '數(shù)學(xué)', 92, '2023-06-15'),
(103, '王五', '數(shù)學(xué)', 78, '2023-06-15'),
(104, '趙六', '數(shù)學(xué)', 65, '2023-06-15'),
(105, '孫七', '數(shù)學(xué)', 88, '2023-06-15');
示例1:查詢分?jǐn)?shù)在某個(gè)區(qū)間的學(xué)生
sql
-- 查詢數(shù)學(xué)成績(jī)?cè)?0-90分之間的學(xué)生
SELECT
student_id AS '學(xué)號(hào)',
student_name AS '姓名',
score AS '數(shù)學(xué)成績(jī)'
FROM scores
WHERE subject = '數(shù)學(xué)'
AND score BETWEEN 80 AND 90;
查詢結(jié)果:
text
學(xué)號(hào) 姓名 數(shù)學(xué)成績(jī)
101 張三 85
105 孫七 88
示例2:日期范圍查詢
sql
-- 查詢2023年上半年入職的員工
SELECT
name AS '姓名',
department AS '部門',
hire_date AS '入職日期'
FROM employees
WHERE hire_date BETWEEN '2023-01-01' AND '2023-06-30';
示例3:NOT BETWEEN的用法
sql
-- 查詢薪資不在8000-9000范圍內(nèi)的員工
SELECT
name AS '姓名',
salary AS '薪資'
FROM employees
WHERE salary NOT BETWEEN 8000 AND 9000;
3.3 注意事項(xiàng)
sql -- BETWEEN包含邊界值 WHERE score BETWEEN 80 AND 90 -- 包含80和90 -- 對(duì)于日期,注意時(shí)間部分 WHERE date_column BETWEEN '2023-01-01' AND '2023-01-31' -- 等價(jià)于:'2023-01-01 00:00:00' 到 '2023-01-31 23:59:59'
四、帶LIKE關(guān)鍵字的模糊查詢
4.1 通配符說(shuō)明
通配符 描述 示例 % 匹配任意多個(gè)字符(0個(gè)或多個(gè)) 張% 匹配"張三"、"張" _ 匹配單個(gè)字符 _三 匹配"張三"、"李三" [charlist] 匹配字符列表中的任意一個(gè) [張李]三 匹配"張三"、"李三" [^charlist] 匹配不在字符列表中的任意一個(gè) [^張李]三 匹配"王三"、"趙三"
4.2 實(shí)際應(yīng)用示例
sql
-- 示例表:圖書表(books)
CREATE TABLE books (
book_id INT,
book_name VARCHAR(100),
author VARCHAR(50),
price DECIMAL(8,2),
publish_date DATE
);
INSERT INTO books VALUES
(1, 'MySQL數(shù)據(jù)庫(kù)實(shí)戰(zhàn)', '張三', 59.80, '2023-01-15'),
(2, 'Python編程從入門到精通', '李四', 79.90, '2022-11-20'),
(3, 'Java核心技術(shù)', '王五', 89.90, '2023-03-10'),
(4, 'Web前端開(kāi)發(fā)實(shí)戰(zhàn)', '李四', 69.90, '2022-09-05'),
(5, 'MySQL優(yōu)化指南', '趙六', 49.90, '2023-05-20');
示例1:%通配符使用
sql
-- 查詢書名包含"MySQL"的圖書
SELECT
book_name AS '書名',
author AS '作者',
price AS '價(jià)格'
FROM books
WHERE book_name LIKE '%MySQL%';
-- 查詢以"實(shí)戰(zhàn)"結(jié)尾的圖書
SELECT book_name
FROM books
WHERE book_name LIKE '%實(shí)戰(zhàn)';
-- 查詢以"Python"開(kāi)頭的圖書
SELECT book_name
FROM books
WHERE book_name LIKE 'Python%';
示例2:_通配符使用
sql
-- 查詢作者姓"李"且名字為兩個(gè)字的圖書
SELECT
book_name AS '書名',
author AS '作者'
FROM books
WHERE author LIKE '李_';
-- 查詢書名第三個(gè)字是"編"的圖書
SELECT book_name
FROM books
WHERE book_name LIKE '__編%';
示例3:組合使用通配符
sql
-- 查詢書名以"實(shí)戰(zhàn)"結(jié)尾且長(zhǎng)度至少為4個(gè)字的圖書
SELECT book_name
FROM books
WHERE book_name LIKE '%實(shí)戰(zhàn)'
AND LENGTH(book_name) >= 4;
-- 查詢作者不是"張"、"李"、"王"開(kāi)頭的圖書
SELECT book_name, author
FROM books
WHERE author NOT LIKE '[張李王]%';
示例4:ESCAPE轉(zhuǎn)義字符
sql
-- 當(dāng)需要查詢包含%或_本身時(shí)
SELECT column_name
FROM table_name
WHERE column_name LIKE '%\%%' ESCAPE '\'; -- 查找包含%的內(nèi)容
SELECT column_name
FROM table_name
WHERE column_name LIKE '%\_%' ESCAPE '\'; -- 查找包含_的內(nèi)容
五、用IS NULL關(guān)鍵字查詢空值
5.1 NULL值特性說(shuō)明
NULL表示"未知"或"不存在"
NULL與任何值比較都返回NULL(包括NULL本身)
不能使用 = NULL 判斷,必須使用 IS NULL
5.2 實(shí)際應(yīng)用示例
sql
-- 示例表:客戶表(customers)
CREATE TABLE customers (
customer_id INT,
customer_name VARCHAR(50),
phone VARCHAR(20),
email VARCHAR(100),
address VARCHAR(200),
register_date DATE
);
INSERT INTO customers VALUES
(1, '張三', '13800138001', 'zhangsan@email.com', '北京市朝陽(yáng)區(qū)', '2023-01-15'),
(2, '李四', NULL, 'lisi@email.com', NULL, '2023-02-20'),
(3, '王五', '13900139002', NULL, '上海市浦東新區(qū)', '2023-03-10'),
(4, '趙六', NULL, NULL, NULL, '2023-04-05'),
(5, '孫七', '13700137003', 'sunqi@email.com', '廣州市天河區(qū)', '2023-05-12');
示例1:查詢空值
sql
-- 查詢沒(méi)有電話號(hào)碼的客戶
SELECT
customer_name AS '客戶姓名',
phone AS '聯(lián)系電話',
email AS '電子郵箱'
FROM customers
WHERE phone IS NULL;
查詢結(jié)果:
text
客戶姓名 聯(lián)系電話 電子郵箱
李四 NULL lisi@email.com
趙六 NULL NULL
示例2:查詢非空值
sql
-- 查詢有電子郵箱的客戶
SELECT
customer_name AS '客戶姓名',
email AS '電子郵箱'
FROM customers
WHERE email IS NOT NULL;
示例3:多列空值判斷
sql
-- 查詢既沒(méi)有電話也沒(méi)有地址的客戶
SELECT
customer_name AS '客戶姓名',
register_date AS '注冊(cè)日期'
FROM customers
WHERE phone IS NULL
AND address IS NULL;
5.3 空值處理函數(shù)
sql
-- 使用IFNULL處理空值顯示
SELECT
customer_name AS '姓名',
IFNULL(phone, '未登記') AS '聯(lián)系電話',
IFNULL(address, '地址不詳') AS '聯(lián)系地址'
FROM customers;
-- 使用COALESCE返回第一個(gè)非空值
SELECT
customer_name,
COALESCE(email, phone, address, '無(wú)聯(lián)系方式') AS '主要聯(lián)系方式'
FROM customers;
六、帶AND的多條件查詢
6.1 基礎(chǔ)語(yǔ)法格式
sql SELECT 列名 FROM 表名 WHERE 條件1 AND 條件2 AND 條件3 ...;
6.2 實(shí)際應(yīng)用示例
sql
-- 示例表:訂單表(orders)
CREATE TABLE orders (
order_id INT,
customer_id INT,
product_name VARCHAR(100),
quantity INT,
unit_price DECIMAL(10,2),
order_date DATE,
status VARCHAR(20)
);
INSERT INTO orders VALUES
(1001, 1, '筆記本電腦', 1, 6999.00, '2023-10-15', '已完成'),
(1002, 2, '智能手機(jī)', 2, 2999.00, '2023-10-16', '待發(fā)貨'),
(1003, 1, '平板電腦', 1, 3999.00, '2023-10-17', '已取消'),
(1004, 3, '無(wú)線耳機(jī)', 3, 399.00, '2023-10-18', '已完成'),
(1005, 2, '智能手表', 1, 1299.00, '2023-10-19', '待付款'),
(1006, 4, '顯示器', 2, 1599.00, '2023-10-20', '待發(fā)貨');
示例1:多條件組合查詢
sql
-- 查詢2023年10月訂單金額超過(guò)5000元且狀態(tài)為"已完成"的訂單
SELECT
order_id AS '訂單編號(hào)',
product_name AS '產(chǎn)品名稱',
quantity AS '數(shù)量',
unit_price AS '單價(jià)',
(quantity * unit_price) AS '總金額',
order_date AS '訂單日期',
status AS '訂單狀態(tài)'
FROM orders
WHERE order_date BETWEEN '2023-10-01' AND '2023-10-31'
AND (quantity * unit_price) > 5000
AND status = '已完成';
查詢結(jié)果:
text
訂單編號(hào) 產(chǎn)品名稱 數(shù)量 單價(jià) 總金額 訂單日期 訂單狀態(tài)
1001 筆記本電腦 1 6999.00 6999.00 2023-10-15 已完成
示例2:復(fù)雜條件組合
sql
-- 查詢數(shù)量大于1且單價(jià)在1000-5000元之間的訂單
SELECT
order_id,
product_name,
quantity,
unit_price,
status
FROM orders
WHERE quantity > 1
AND unit_price BETWEEN 1000 AND 5000
AND status IN ('待發(fā)貨', '已完成');
示例3:結(jié)合LIKE和AND
sql
-- 查詢產(chǎn)品名稱包含"電腦"且狀態(tài)不是"已取消"的訂單
SELECT
order_id AS '訂單號(hào)',
product_name AS '產(chǎn)品',
status AS '狀態(tài)'
FROM orders
WHERE product_name LIKE '%電腦%'
AND status != '已取消';
6.3 注意事項(xiàng)
sql -- 條件執(zhí)行的優(yōu)先級(jí) WHERE 條件1 OR 條件2 AND 條件3 -- 等價(jià)于:WHERE 條件1 OR (條件2 AND 條件3) -- 建議使用括號(hào)明確優(yōu)先級(jí) WHERE (條件1 OR 條件2) AND 條件3
七、帶OR的多條件查詢
7.1 基礎(chǔ)語(yǔ)法格式
sql SELECT 列名 FROM 表名 WHERE 條件1 OR 條件2 OR 條件3 ...;
7.2 實(shí)際應(yīng)用示例
sql
-- 示例表:?jiǎn)T工考勤表(attendance)
CREATE TABLE attendance (
record_id INT,
employee_id INT,
employee_name VARCHAR(50),
department VARCHAR(30),
attendance_date DATE,
status VARCHAR(20)
);
INSERT INTO attendance VALUES
(1, 101, '張三', '技術(shù)部', '2023-10-23', '正常'),
(2, 102, '李四', '銷售部', '2023-10-23', '遲到'),
(3, 103, '王五', '技術(shù)部', '2023-10-23', '請(qǐng)假'),
(4, 104, '趙六', '市場(chǎng)部', '2023-10-23', '正常'),
(5, 105, '孫七', '人事部', '2023-10-23', '早退'),
(6, 101, '張三', '技術(shù)部', '2023-10-24', '請(qǐng)假'),
(7, 102, '李四', '銷售部', '2023-10-24', '正常');
示例1:簡(jiǎn)單OR條件查詢
sql
-- 查詢狀態(tài)為"請(qǐng)假"或"遲到"的員工
SELECT
attendance_date AS '考勤日期',
employee_name AS '員工姓名',
department AS '部門',
status AS '考勤狀態(tài)'
FROM attendance
WHERE status = '請(qǐng)假' OR status = '遲到';
查詢結(jié)果:
text
考勤日期 員工姓名 部門 考勤狀態(tài)
2023-10-23 李四 銷售部 遲到
2023-10-23 王五 技術(shù)部 請(qǐng)假
2023-10-24 張三 技術(shù)部 請(qǐng)假
示例2:OR與IN的等價(jià)轉(zhuǎn)換
sql
-- 以下兩種寫法等價(jià):
SELECT * FROM attendance
WHERE status = '請(qǐng)假' OR status = '遲到' OR status = '早退';
SELECT * FROM attendance
WHERE status IN ('請(qǐng)假', '遲到', '早退');
示例3:多列OR條件查詢
sql
-- 查詢部門為"技術(shù)部"或狀態(tài)為"正常"的記錄
SELECT
attendance_date AS '日期',
employee_name AS '姓名',
department AS '部門',
status AS '狀態(tài)'
FROM attendance
WHERE department = '技術(shù)部' OR status = '正常';
7.3 AND與OR的組合使用
示例1:復(fù)雜條件組合
sql
-- 查詢(技術(shù)部且請(qǐng)假)或(銷售部且遲到)的員工
SELECT
employee_name AS '姓名',
department AS '部門',
status AS '狀態(tài)',
attendance_date AS '日期'
FROM attendance
WHERE (department = '技術(shù)部' AND status = '請(qǐng)假')
OR (department = '銷售部' AND status = '遲到');
示例2:多層條件嵌套
sql
-- 查詢(狀態(tài)為正常)或(部門為技術(shù)部且狀態(tài)不為早退)的記錄
SELECT *
FROM attendance
WHERE status = '正常'
OR (department = '技術(shù)部' AND status != '早退');
7.4 性能優(yōu)化建議
sql -- 不推薦的寫法(OR導(dǎo)致索引失效) SELECT * FROM orders WHERE customer_id = 1 OR product_name LIKE '%電腦%'; -- 推薦的改寫方式(使用UNION) SELECT * FROM orders WHERE customer_id = 1 UNION SELECT * FROM orders WHERE product_name LIKE '%電腦%';
八、綜合實(shí)戰(zhàn)案例
8.1 復(fù)雜查詢綜合應(yīng)用
sql
-- 創(chuàng)建一個(gè)綜合示例表
CREATE TABLE sales (
sale_id INT PRIMARY KEY,
product_id INT,
product_name VARCHAR(100),
category VARCHAR(50),
sale_date DATE,
quantity INT,
unit_price DECIMAL(10,2),
salesperson VARCHAR(50),
region VARCHAR(50)
);
-- 綜合查詢示例
SELECT
product_name AS '產(chǎn)品名稱',
category AS '產(chǎn)品類別',
SUM(quantity) AS '總銷量',
SUM(quantity * unit_price) AS '總銷售額',
AVG(unit_price) AS '平均單價(jià)'
FROM sales
WHERE sale_date BETWEEN '2023-01-01' AND '2023-12-31'
AND category IN ('電子產(chǎn)品', '辦公用品')
AND (region = '華東' OR region = '華南')
AND quantity > 0
AND salesperson IS NOT NULL
GROUP BY product_name, category
HAVING SUM(quantity * unit_price) > 10000
ORDER BY SUM(quantity * unit_price) DESC;
8.2 查詢優(yōu)化技巧總結(jié)

到此這篇關(guān)于MySQL WHERE子句實(shí)踐指南(精準(zhǔn)過(guò)濾數(shù)據(jù)的藝術(shù))的文章就介紹到這了,更多相關(guān)mysql where字句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)備份與恢復(fù)實(shí)現(xiàn)方法分析
這篇文章主要介紹了mysql數(shù)據(jù)備份與恢復(fù)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了mysql數(shù)據(jù)備份與恢復(fù)常見(jiàn)實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
MySQL數(shù)據(jù)庫(kù)索引及底層數(shù)據(jù)結(jié)構(gòu)詳解
MySQL默認(rèn)使用B+樹(shù)索引和InnoDB引擎,索引通過(guò)有序結(jié)構(gòu)加速數(shù)據(jù)檢索,但增加存儲(chǔ)與維護(hù)成本,B+樹(shù)優(yōu)化了磁盤讀寫與范圍查詢效率,成為主流選擇,本文介紹MySQL數(shù)據(jù)庫(kù)索引及底層數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),感興趣的朋友一起看看吧2025-08-08
Mysql存在則修改不存在則新增的兩種實(shí)現(xiàn)方法實(shí)例
mysql語(yǔ)法支持如果數(shù)據(jù)存在則更新,不存在則插入,下面這篇文章主要給大家介紹了關(guān)于Mysql存在則修改不存在則新增的兩種實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能
這篇文章主要介紹了MySQL如何基于Explain關(guān)鍵字優(yōu)化索引功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
windows下mysql 8.0.13 解壓版安裝圖文教程
這篇文章主要為大家詳細(xì)介紹了windows下mysql 8.0.13 解壓版安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

