MySQL WHERE子句實踐指南(精準過濾數(shù)據(jù)的藝術)
一、WHERE子句語法格式詳解
1.1 基礎語法結(jié)構(gòu)
WHERE子句是SELECT語句中的篩選條件部分,用于從表中提取滿足特定條件的記錄。
sql SELECT 列名1, 列名2, ... FROM 表名 WHERE 條件表達式;
1.2 完整的SELECT語句結(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ōu)先級表
優(yōu)先級 運算符 描述 1 =, <>, !=, <, <=, >, >= 比較運算符 2 BETWEEN, LIKE, IN, IS NULL 特殊比較 3 NOT 邏輯非 4 AND 邏輯與 5 OR 邏輯或
二、帶IN關鍵字的查詢:多值匹配
2.1 基本語法格式
sql SELECT 列名 FROM 表名 WHERE 列名 IN (值1, 值2, 值3, ...);
2.2 實際應用示例
sql
-- 示例表:員工表(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, '張三', '技術部', 8500, '2022-03-15'),
(2, '李四', '銷售部', 7500, '2021-08-22'),
(3, '王五', '技術部', 9200, '2020-11-05'),
(4, '趙六', '市場部', 6800, '2023-01-30'),
(5, '孫七', '人事部', 6500, '2022-06-18'),
(6, '周八', '技術部', 8800, '2021-09-10');
示例1:查詢指定部門的員工
sql
-- 查詢屬于技術部或銷售部的員工
SELECT
id AS '員工編號',
name AS '姓名',
department AS '部門',
salary AS '薪資'
FROM employees
WHERE department IN ('技術部', '銷售部');
查詢結(jié)果:
text
員工編號 姓名 部門 薪資
1 張三 技術部 8500.00
2 李四 銷售部 7500.00
3 王五 技術部 9200.00
6 周八 技術部 8800.00
示例2:IN子查詢的運用
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 ('人事部', '市場部');
三、帶BETWEEN AND的范圍查詢
3.1 基礎語法格式
sql SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2; -- 等價于:WHERE 列名 >= 值1 AND 列名 <= 值2
3.2 實際應用示例
sql
-- 示例表:學生成績表(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ù)學', 85, '2023-06-15'),
(102, '李四', '數(shù)學', 92, '2023-06-15'),
(103, '王五', '數(shù)學', 78, '2023-06-15'),
(104, '趙六', '數(shù)學', 65, '2023-06-15'),
(105, '孫七', '數(shù)學', 88, '2023-06-15');
示例1:查詢分數(shù)在某個區(qū)間的學生
sql
-- 查詢數(shù)學成績在80-90分之間的學生
SELECT
student_id AS '學號',
student_name AS '姓名',
score AS '數(shù)學成績'
FROM scores
WHERE subject = '數(shù)學'
AND score BETWEEN 80 AND 90;
查詢結(jié)果:
text
學號 姓名 數(shù)學成績
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 注意事項
sql -- BETWEEN包含邊界值 WHERE score BETWEEN 80 AND 90 -- 包含80和90 -- 對于日期,注意時間部分 WHERE date_column BETWEEN '2023-01-01' AND '2023-01-31' -- 等價于:'2023-01-01 00:00:00' 到 '2023-01-31 23:59:59'
四、帶LIKE關鍵字的模糊查詢
4.1 通配符說明
通配符 描述 示例 % 匹配任意多個字符(0個或多個) 張% 匹配"張三"、"張" _ 匹配單個字符 _三 匹配"張三"、"李三" [charlist] 匹配字符列表中的任意一個 [張李]三 匹配"張三"、"李三" [^charlist] 匹配不在字符列表中的任意一個 [^張李]三 匹配"王三"、"趙三"
4.2 實際應用示例
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ù)庫實戰(zhàn)', '張三', 59.80, '2023-01-15'),
(2, 'Python編程從入門到精通', '李四', 79.90, '2022-11-20'),
(3, 'Java核心技術', '王五', 89.90, '2023-03-10'),
(4, 'Web前端開發(fā)實戰(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 '價格'
FROM books
WHERE book_name LIKE '%MySQL%';
-- 查詢以"實戰(zhàn)"結(jié)尾的圖書
SELECT book_name
FROM books
WHERE book_name LIKE '%實戰(zhàn)';
-- 查詢以"Python"開頭的圖書
SELECT book_name
FROM books
WHERE book_name LIKE 'Python%';
示例2:_通配符使用
sql
-- 查詢作者姓"李"且名字為兩個字的圖書
SELECT
book_name AS '書名',
author AS '作者'
FROM books
WHERE author LIKE '李_';
-- 查詢書名第三個字是"編"的圖書
SELECT book_name
FROM books
WHERE book_name LIKE '__編%';
示例3:組合使用通配符
sql
-- 查詢書名以"實戰(zhàn)"結(jié)尾且長度至少為4個字的圖書
SELECT book_name
FROM books
WHERE book_name LIKE '%實戰(zhàn)'
AND LENGTH(book_name) >= 4;
-- 查詢作者不是"張"、"李"、"王"開頭的圖書
SELECT book_name, author
FROM books
WHERE author NOT LIKE '[張李王]%';
示例4:ESCAPE轉(zhuǎn)義字符
sql
-- 當需要查詢包含%或_本身時
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關鍵字查詢空值
5.1 NULL值特性說明
NULL表示"未知"或"不存在"
NULL與任何值比較都返回NULL(包括NULL本身)
不能使用 = NULL 判斷,必須使用 IS NULL
5.2 實際應用示例
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', '北京市朝陽區(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
-- 查詢沒有電話號碼的客戶
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
-- 查詢既沒有電話也沒有地址的客戶
SELECT
customer_name AS '客戶姓名',
register_date AS '注冊日期'
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返回第一個非空值
SELECT
customer_name,
COALESCE(email, phone, address, '無聯(lián)系方式') AS '主要聯(lián)系方式'
FROM customers;
六、帶AND的多條件查詢
6.1 基礎語法格式
sql SELECT 列名 FROM 表名 WHERE 條件1 AND 條件2 AND 條件3 ...;
6.2 實際應用示例
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, '智能手機', 2, 2999.00, '2023-10-16', '待發(fā)貨'),
(1003, 1, '平板電腦', 1, 3999.00, '2023-10-17', '已取消'),
(1004, 3, '無線耳機', 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月訂單金額超過5000元且狀態(tài)為"已完成"的訂單
SELECT
order_id AS '訂單編號',
product_name AS '產(chǎn)品名稱',
quantity AS '數(shù)量',
unit_price AS '單價',
(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
訂單編號 產(chǎn)品名稱 數(shù)量 單價 總金額 訂單日期 訂單狀態(tài)
1001 筆記本電腦 1 6999.00 6999.00 2023-10-15 已完成
示例2:復雜條件組合
sql
-- 查詢數(shù)量大于1且單價在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 '訂單號',
product_name AS '產(chǎn)品',
status AS '狀態(tài)'
FROM orders
WHERE product_name LIKE '%電腦%'
AND status != '已取消';
6.3 注意事項
sql -- 條件執(zhí)行的優(yōu)先級 WHERE 條件1 OR 條件2 AND 條件3 -- 等價于:WHERE 條件1 OR (條件2 AND 條件3) -- 建議使用括號明確優(yōu)先級 WHERE (條件1 OR 條件2) AND 條件3
七、帶OR的多條件查詢
7.1 基礎語法格式
sql SELECT 列名 FROM 表名 WHERE 條件1 OR 條件2 OR 條件3 ...;
7.2 實際應用示例
sql
-- 示例表:員工考勤表(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, '張三', '技術部', '2023-10-23', '正常'),
(2, 102, '李四', '銷售部', '2023-10-23', '遲到'),
(3, 103, '王五', '技術部', '2023-10-23', '請假'),
(4, 104, '趙六', '市場部', '2023-10-23', '正常'),
(5, 105, '孫七', '人事部', '2023-10-23', '早退'),
(6, 101, '張三', '技術部', '2023-10-24', '請假'),
(7, 102, '李四', '銷售部', '2023-10-24', '正常');
示例1:簡單OR條件查詢
sql
-- 查詢狀態(tài)為"請假"或"遲到"的員工
SELECT
attendance_date AS '考勤日期',
employee_name AS '員工姓名',
department AS '部門',
status AS '考勤狀態(tài)'
FROM attendance
WHERE status = '請假' OR status = '遲到';
查詢結(jié)果:
text
考勤日期 員工姓名 部門 考勤狀態(tài)
2023-10-23 李四 銷售部 遲到
2023-10-23 王五 技術部 請假
2023-10-24 張三 技術部 請假
示例2:OR與IN的等價轉(zhuǎn)換
sql
-- 以下兩種寫法等價:
SELECT * FROM attendance
WHERE status = '請假' OR status = '遲到' OR status = '早退';
SELECT * FROM attendance
WHERE status IN ('請假', '遲到', '早退');
示例3:多列OR條件查詢
sql
-- 查詢部門為"技術部"或狀態(tài)為"正常"的記錄
SELECT
attendance_date AS '日期',
employee_name AS '姓名',
department AS '部門',
status AS '狀態(tài)'
FROM attendance
WHERE department = '技術部' OR status = '正常';
7.3 AND與OR的組合使用
示例1:復雜條件組合
sql
-- 查詢(技術部且請假)或(銷售部且遲到)的員工
SELECT
employee_name AS '姓名',
department AS '部門',
status AS '狀態(tài)',
attendance_date AS '日期'
FROM attendance
WHERE (department = '技術部' AND status = '請假')
OR (department = '銷售部' AND status = '遲到');
示例2:多層條件嵌套
sql
-- 查詢(狀態(tài)為正常)或(部門為技術部且狀態(tài)不為早退)的記錄
SELECT *
FROM attendance
WHERE status = '正常'
OR (department = '技術部' AND status != '早退');
7.4 性能優(yōu)化建議
sql -- 不推薦的寫法(OR導致索引失效) 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 '%電腦%';
八、綜合實戰(zhàn)案例
8.1 復雜查詢綜合應用
sql
-- 創(chuàng)建一個綜合示例表
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 '平均單價'
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é)

到此這篇關于MySQL WHERE子句實踐指南(精準過濾數(shù)據(jù)的藝術)的文章就介紹到這了,更多相關mysql where字句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談SQLite時間函數(shù)的使用說明與總結(jié)分析
本篇文章是對SQLite時間函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下2013-05-05
Mysql數(shù)據(jù)庫delete操作沒報錯卻刪除不了數(shù)據(jù)的解決
本文主要介紹了Mysql數(shù)據(jù)庫delete操作沒報錯卻刪除不了數(shù)據(jù)的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
mysql性能優(yōu)化腳本mysqltuner.pl使用介紹
無意中發(fā)現(xiàn)了,major哥們開發(fā)的一個性能分析腳本,很有意思,可以通過這個腳本學學他的思想2013-02-02
MySQL頻繁更新熱點數(shù)據(jù)高并發(fā)場景下的具體解決方案
本文詳細介紹了MySQL高頻更新熱點數(shù)據(jù)在高并發(fā)場景下的解決方案,包括應用層緩存、數(shù)據(jù)分片、隊列削峰、數(shù)據(jù)庫層面優(yōu)化(如CAS、調(diào)整事務隔離級別)、讀寫分離、請求合并、參數(shù)調(diào)優(yōu)、分布式計數(shù)器等方法,需要的朋友可以參考下2025-10-10
mysql部分字符存儲報錯 Incorrect string value問題解決
MySQL中的utf-8字符集并不完全支持utf-8,本文這要介紹了mysql部分字符存儲報錯 Incorrect string value問題解決,具有一定的參考價值,感興趣的可以了解一下2023-07-07

