首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL SELECT 語法完全指南:從基礎到進階用法

     編輯:MySQL 資料庫相關知識

SELECT 是 MySQL 最核心的查詢語句,掌握其完整語法與擴展特性,能顯著提升數據檢索效率。本文系統梳理語法結構、關鍵字用法及實戰技巧。

完整語法結構

SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
  [DISTINCT | DISTINCTROW | ALL]
  select_list
  [INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
  [FROM table_references [WHERE where_definition]]
  [GROUP BY col_name,...] [HAVING where_definition]
  [ORDER BY {col_name | expr | position} [ASC | DESC],...]
  [LIMIT [offset,] row_count] [PROCEDURE procedure_name]

核心子句詳細解析

1. 查詢修飾符(MySQL 擴展)

⚠️ 絕大多數場景無需使用,優化器通常能做出最優選擇。

2. 去重選項

  • DISTINCT / DISTINCTROW:結果集去重,NULL 視為相等值
  • ALL:默認行為,保留所有行(含重複)

3. 結果導出

  • INTO OUTFILE:導出完整結果集(含列名、換行符),文件不可存在
  • INTO DUMPFILE:僅導出單行原始數據,無格式化
  • export_options:同 LOAD DATA INFILE 的 FIELDS/LINES 子句

4. select_list 表達式

  1. *:所有列(按建表順序)
  2. 指定列清單,可用 tbl_name.col_name 避免歧義
  3. 別名:col_name AS alias 或 col_name alias
  4. 表達式:列、常量、函數、算術/位運算組合
  5. 聚合函數:COUNT/SUM/AVG/MIN/MAX 等

5. 表引用與別名

SELECT t1.name, t2.salary
FROM employee AS t1, info AS t2
WHERE t1.name = t2.name
  • 別名不可以數字開頭
  • WHERE/HAVING/ORDER BY 中引用表時必須用別名

6. WHERE 條件構建

關鍵字作用適用場景
STRAIGHT_JOIN強制按 FROM 順序聯表優化器選錯聯表順序時
SQL_SMALL_RESULT結果集較小,使用臨時表GROUP BY/DISTINCT 結果集小
SQL_BIG_RESULT結果集較大,使用磁盤排序GROUP BY/DISTINCT 結果集大
HIGH_PRIORITY提升查詢優先級高於寫操作關鍵實時查詢
操作符說明
=, >, <, >=, <=, !=, <>比較運算符
BETWEEN ... AND ...範圍查詢(含邊界)
IN (val1, val2...)集合匹配
LIKE 'pattern'模糊匹配,% 多字符,_ 單字符
IS [NOT] NULL空值判斷
AND / OR / NOT邏輯組合,AND 優先級高於 OR

字符比較規則:忽略尾部空格,大小寫敏感度取決於字符集校對規則。

日期比較建議:使用 LIKE '2024-01-%' 而非精確等值,避免時間部分干擾。

7. GROUP BY 與 HAVING

  • GROUP BY col1, col2:按列分組,配合聚合函數
  • HAVING:過濾分組結果,可引用聚合列別名
  • WITH ROLLUP:生成超級聚合行(MySQL 擴展)

8. ORDER BY 排序

  • 可引用列名、別名、位置序號(不推薦用位置)
  • ASC(默認升序)/ DESC(降序)
  • 多鍵排序:ORDER BY dept ASC, salary DESC

9. LIMIT 分頁

  • LIMIT n:前 n 行(等價 LIMIT 0, n)
  • LIMIT offset, n:跳過 offset 行取 n 行,offset 從 0 開始
  • 深分頁性能問題:LIMIT 100000, 10 需掃描 10 萬行

實戰優化技巧

  1. 覆蓋索引:SELECT id, name FROM users WHERE status=1 若有 INDEX(status, id, name) 可避免回表
  2. 避免 SELECT *:減少網絡傳輸、緩衝池佔用、解析開銷
  3. WHERE 條件下推:MySQL 5.6+ 支持將外層 WHERE 下推至派生表/視圖內部
  4. ICP (Index Condition Pushdown):存儲引擎層面過濾,減少回表次數

熟練掌握 SELECT 全語法,結合 EXPLAIN 分析執行計劃,是編寫高性能查詢的基礎。

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