目錄
引言
一、條件查詢:精準篩選數據
1.1 基本語法
1.2 比較運算符
1.3 邏輯運算符
1.4 特殊條件查詢
1.4.1 模糊查詢(LIKE)
1.4.2 IN和NOT IN
1.4.3 BETWEEN AND
1.4.4 IS NULL和IS NOT NULL
二、聚合函數:數據統計與分析
2.1 常用聚合函數
2.2 COUNT()的使用
2.3 SUM()和AVG()
2.4 MAX()和MIN()
2.5 聚合函數與DISTINCT
三、分組查詢:GROUP BY與HAVING
3.1 GROUP BY基礎
3.2 HAVING子句
3.3 GROUP BY與多個列
四、排序:ORDER BY
4.1 基本排序
4.2 多列排序
4.3 排序與聚合函數
五、分頁查詢:LIMIT
5.1 基本語法
5.2 實際應用
5.3 分頁公式
六、去重:DISTINCT
6.1 基本用法
6.2 多列去重
6.3 DISTINCT與聚合函數
七、綜合應用:多操作組合
7.1 示例1:復雜條件查詢
7.2 示例2:分組統計與排序
7.3 示例3:分頁查詢熱門城市
八、最佳實踐與性能優化
8.1 索引優化
8.2 查詢優化
8.3 分組和聚合優化
8.4 分頁優化
九、常見問題與解決方案
9.1 NULL值處理
9.2 數據類型不匹配
9.3 分組與排序的順序
十、總結
附錄:常用查詢示例
引言
MySQL作為一款開源的關系型數據庫管理系統,憑借其高效、穩定、易用的特性,成為Web開發領域中最受歡迎的數據庫之一。無論是小型網站還是大型企業應用,MySQL都扮演著至關重要的角色。本文將詳細介紹MySQL中條件查詢、聚合函數、分頁、排序、分組和去重等核心操作,幫助讀者從基礎到進階,全面掌握MySQL的查詢技巧。
一、條件查詢:精準篩選數據
條件查詢是MySQL中最常用的操作之一,通過WHERE子句可以實現對數據的精準篩選。
1.1 基本語法
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 條件表達式;
1.2 比較運算符
運算符 | 描述 | 示例 |
---|---|---|
= | 等于 | WHERE age = 18 |
<> | 不等于 | WHERE age <> 18 |
> | 大于 | WHERE salary > 5000 |
< | 小于 | WHERE score < 60 |
>= | 大于等于 | WHERE quantity >= 100 |
<= | 小于等于 | WHERE price <= 99.99 |
1.3 邏輯運算符
-
AND:同時滿足多個條件
SELECT * FROM students WHERE age > 18 AND gender = '男';
-
OR:滿足任意一個條件
SELECT * FROM products WHERE price < 50 OR category = '電子產品';
-
NOT:取反
SELECT * FROM orders WHERE NOT status = '已取消';
1.4 特殊條件查詢
1.4.1 模糊查詢(LIKE)
%
:匹配任意字符(包括零個)_
:匹配單個字符
-- 查詢姓張的學生
SELECT * FROM students WHERE name LIKE '張%';-- 查詢第二個字是"小"的學生
SELECT * FROM students WHERE name LIKE '_小%';
1.4.2 IN和NOT IN
-- 查詢id為1、3、5的學生
SELECT * FROM students WHERE id IN (1, 3, 5);-- 查詢不在北京、上海的學生
SELECT * FROM students WHERE city NOT IN ('北京', '上海');
1.4.3 BETWEEN AND
-- 查詢成績在80到90之間的學生
SELECT * FROM students WHERE score BETWEEN 80 AND 90;
1.4.4 IS NULL和IS NOT NULL
-- 查詢沒有填寫郵箱的學生
SELECT * FROM students WHERE email IS NULL;-- 查詢填寫了電話的學生
SELECT * FROM students WHERE phone IS NOT NULL;
二、聚合函數:數據統計與分析
聚合函數用于對數據進行統計和計算,返回單個結果值。
2.1 常用聚合函數
函數 | 描述 |
---|---|
COUNT() | 統計記錄數 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
2.2 COUNT()的使用
-- 統計學生總數
SELECT COUNT(*) AS student_count FROM students;-- 統計有郵箱的學生數
SELECT COUNT(email) AS email_count FROM students;
2.3 SUM()和AVG()
-- 計算所有學生的總分
SELECT SUM(score) AS total_score FROM students;-- 計算平均分
SELECT AVG(score) AS avg_score FROM students;
2.4 MAX()和MIN()
-- 查詢最高和最低分
SELECT MAX(score) AS max_score, MIN(score) AS min_score FROM students;
2.5 聚合函數與DISTINCT
-- 統計不同城市的數量
SELECT COUNT(DISTINCT city) AS city_count FROM students;
三、分組查詢:GROUP BY與HAVING
3.1 GROUP BY基礎
GROUP BY用于將數據按照指定列進行分組,通常與聚合函數一起使用。
-- 按性別分組統計學生數量
SELECT gender, COUNT(*) AS count FROM students GROUP BY gender;-- 按城市分組計算平均分
SELECT city, AVG(score) AS avg_score FROM students GROUP BY city;
3.2 HAVING子句
HAVING用于過濾分組后的結果,類似于WHERE,但WHERE用于分組前過濾,HAVING用于分組后過濾。
-- 找出平均分大于85的城市
SELECT city, AVG(score) AS avg_score
FROM students
GROUP BY city
HAVING avg_score > 85;-- 找出學生數量大于10人的城市
SELECT city, COUNT(*) AS count
FROM students
GROUP BY city
HAVING count > 10;
3.3 GROUP BY與多個列
-- 按城市和性別分組統計
SELECT city, gender, COUNT(*) AS count
FROM students
GROUP BY city, gender;
四、排序:ORDER BY
4.1 基本排序
-- 按分數升序排列
SELECT * FROM students ORDER BY score ASC;-- 按分數降序排列
SELECT * FROM students ORDER BY score DESC;
4.2 多列排序
-- 先按城市升序,再按分數降序
SELECT * FROM students ORDER BY city ASC, score DESC;
4.3 排序與聚合函數
-- 按城市分組計算平均分并排序
SELECT city, AVG(score) AS avg_score
FROM students
GROUP BY city
ORDER BY avg_score DESC;
五、分頁查詢:LIMIT
在處理大量數據時,分頁查詢非常重要,可以提高查詢效率和用戶體驗。
5.1 基本語法
SELECT * FROM 表名 LIMIT [offset,] rows;
offset
:起始位置(可選,默認為0)rows
:返回行數
5.2 實際應用
-- 獲取前10條數據
SELECT * FROM students LIMIT 10;-- 獲取第11-20條數據
SELECT * FROM students LIMIT 10, 10;-- 按分數降序,獲取前5名學生
SELECT * FROM students ORDER BY score DESC LIMIT 5;
5.3 分頁公式
對于第n頁,每頁顯示m條數據:
SELECT * FROM students LIMIT (n-1)*m, m;
-- 第3頁,每頁10條
SELECT * FROM students LIMIT 20, 10;
六、去重:DISTINCT
DISTINCT用于返回唯一不同的值。
6.1 基本用法
-- 查詢所有不同的城市
SELECT DISTINCT city FROM students;
6.2 多列去重
-- 查詢不同城市和性別的組合
SELECT DISTINCT city, gender FROM students;
6.3 DISTINCT與聚合函數
-- 統計不同城市的數量
SELECT COUNT(DISTINCT city) AS city_count FROM students;
七、綜合應用:多操作組合
在實際應用中,通常需要將多個操作組合使用。
7.1 示例1:復雜條件查詢
-- 查詢北京或上海的女生,分數在80-90之間,按分數降序排列
SELECT * FROM students
WHERE (city = '北京' OR city = '上海')
AND gender = '女'
AND score BETWEEN 80 AND 90
ORDER BY score DESC;
7.2 示例2:分組統計與排序
-- 按城市分組,統計每個城市的男生人數和平均分,只顯示平均分大于80的,按平均分降序排列
SELECT city,
COUNT(*) AS male_count,
AVG(score) AS avg_score
FROM students
WHERE gender = '男'
GROUP BY city
HAVING avg_score > 80
ORDER BY avg_score DESC;
7.3 示例3:分頁查詢熱門城市
-- 查詢學生數量最多的前5個城市,按數量降序排列
SELECT city, COUNT(*) AS count
FROM students
GROUP BY city
ORDER BY count DESC
LIMIT 5;
八、最佳實踐與性能優化
8.1 索引優化
- 為WHERE、JOIN、ORDER BY等子句中的列創建索引
- 避免在索引列上使用函數或表達式
- 合理設計復合索引
8.2 查詢優化
- 只查詢需要的列,避免使用SELECT *
- 使用EXPLAIN分析查詢執行計劃
- 避免在WHERE子句中使用!=、<>、NOT IN等操作符
- 合理使用連接查詢代替子查詢
8.3 分組和聚合優化
- 盡量縮小分組前的數據量
- 避免在HAVING中使用復雜條件,可先通過WHERE過濾
8.4 分頁優化
- 對于大數據量分頁,使用"延遲關聯"或"書簽"技術
- 避免使用LIMIT offset過大的值
九、常見問題與解決方案
9.1 NULL值處理
- NULL與任何值比較都返回NULL
- 使用IS NULL/IS NOT NULL判斷NULL值
- 聚合函數通常忽略NULL值
9.2 數據類型不匹配
- 確保比較和計算的數據類型一致
- 使用CAST()或CONVERT()進行類型轉換
9.3 分組與排序的順序
- GROUP BY子句在WHERE之后,ORDER BY之前
- 聚合函數不能直接用于WHERE子句
十、總結
本文詳細介紹了MySQL中的條件查詢、聚合函數、分組、排序、分頁和去重等核心操作。這些操作是MySQL查詢的基礎,也是進行數據分析和業務開發的必備技能。通過靈活組合這些操作,可以實現復雜的查詢需求,高效地處理和分析數據。
在實際應用中,除了掌握基本語法外,還需要關注查詢性能優化,合理設計索引,編寫高效的SQL語句。同時,要注意處理特殊情況如NULL值、數據類型轉換等,確保查詢結果的準確性。
希望本文能幫助讀者全面理解MySQL的查詢操作,為后續的數據庫開發和優化打下堅實基礎。在實際使用中,建議多練習、多總結,不斷提升SQL編寫能力。
附錄:常用查詢示例
- 查詢每個城市的男生和女生數量及平均分
SELECT
city,
gender,
COUNT(*) AS count,
AVG(score) AS avg_score
FROM students
GROUP BY city, gender
ORDER BY city ASC, gender ASC;
- 查詢成績排名前10%的學生
SELECT * FROM students
WHERE score >= (SELECT AVG(score) FROM students)
ORDER BY score DESC
LIMIT (SELECT COUNT(*) * 0.1 FROM students);
- 查詢連續三個月沒有訂單的用戶
SELECT user_id, username
FROM users
WHERE user_id NOT IN (
SELECT DISTINCT user_id
FROM orders
WHERE order_date >= DATE_SUB(NOW(), INTERVAL 3 MONTH)
);
通過不斷實踐這些查詢技巧,結合具體業務場景進行靈活運用,相信你一定能成為MySQL查詢的高手。