首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL SELECT 查詢全語法詳解:從基礎檢索到條件篩選、排序分頁實戰

     編輯:MySQL 綜合教學

SELECT 是 SQL 查詢的核心,掌握完整語法順序與各子句語義,能寫出高效、可讀、可維護的查詢。本文系統梳理標準語法、常用模式、性能陷阱。

標準語法順序(寫入順序 ≠ 執行順序)


SELECT [DISTINCT] select_list
FROM table_list
[WHERE where_condition]
[GROUP BY group_by_list]
[HAVING having_condition]
[ORDER BY order_by_list]
[LIMIT [offset,] row_count]

執行順序:FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT。理解此順序可解釋為何 WHERE 不能用別名、HAVING 可用聚合別名。

基礎檢索模式

需求SQL 範例說明
全表掃描SELECT * FROM pet;生產禁用,必加 WHERE/LIMIT
指定列SELECT name, birth FROM pet;減少網路傳輸、利用覆蓋索引
條件篩選SELECT * FROM pet WHERE owner='Gwen';字符串用單引號,日期 '2024-01-01'
多條件 AND/ORWHERE age>=5 AND sex='f' / OR括號控制優先級:(a AND b) OR c
模糊匹配WHERE name LIKE 'Tom%'% 任意長度,_ 單字符;前導 % 無法用索引
範圍查詢WHERE birth BETWEEN '2020-01-01' AND '2020-12-31'等價 >= AND <=,含邊界
集合查詢WHERE owner IN ('Gwen','Tom')優於多個 OR,優化器可優化
空值判斷WHERE death IS NULL / IS NOT NULL不能用 = NULL

排序與分頁


-- 多欄位排序:先按 birth 升序,同 birth 再按 name 降序
SELECT name, birth FROM pet ORDER BY birth ASC, name DESC;

-- 分頁:LIMIT offset, rows(offset 從 0 開始)
SELECT * FROM pet ORDER BY birth LIMIT 0, 10;  -- 第 1 頁
SELECT * FROM pet ORDER BY birth LIMIT 10, 10; -- 第 2 頁

-- 深分頁優化(offset 1000000 會掃描 100 萬行再丟棄)
-- 方案:游標分頁 / 覆蓋索引 + 子查詢
SELECT * FROM pet WHERE id > 1000000 ORDER BY id LIMIT 10;

進階:聚合與分組


-- 每個 owner 的寵物數量、最早/最晚出生
SELECT owner, COUNT(*) AS cnt, MIN(birth), MAX(birth)
FROM pet
GROUP BY owner
HAVING cnt > 1;  -- 過濾聚合後結果

只出現在 SELECT/ORDER BY/HAVING 中的列,必須出現在 GROUP BY 中(ONLY_FULL_GROUP_BY 模式,5.7+ 默認開啟)。

性能陷阱與優化口訣

  • SELECT * → 列出具體欄位,利用覆蓋索引避免回表。
  • WHERE 函數列 → WHERE DATE(created_at) = '2024-01-01' 導致全表掃描,改 WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02'。
  • LIKE '%keyword%' → 前導通配符不可用索引,全文檢索用 MATCH...AGAINST 或 Elasticsearch。
  • OR 跨列 → WHERE a=1 OR b=2 通常不走索引,改 UNION ALL 或建立複合索引。
  • 隱式轉換 → WHERE varchar_col = 123 觸發全表隱式 CAST,嚴重拖慢,統一參數類型。

EXPLAIN 關鍵欄位速查

欄位優秀值警示值
typeref / eq_ref / rangeALL (全表掃描) / index (全索引掃描)
key實際用到的索引名NULL (無索引可用)
rows預估掃描行數少遠大於實際返回行數
ExtraUsing index / Using whereUsing filesort / Using temporary

寫好 SELECT,始於理解語法順序,精於 EXPLAIN 讀懂執行計劃,成於持續重構慢查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved