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

MySQL 進階 SELECT 語法深度解析:優化器提示、結果導出、分組排序與 LIMIT 精髓

     編輯:MySQL 資料庫相關知識

MySQL SELECT 完整語法與進階特性權威指南

MySQL 在 ANSI SQL92 基礎上擴展了優化器提示、結果導出、分組過濾等強大功能。本文系統拆解每個子句的語法、語義與實戰陷阱。

完整語法骨架

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,... [WITH ROLLUP]]
         [HAVING where_definition]
         [ORDER BY {col_name | expr | position} [ASC | DESC],...]
         [LIMIT [offset,] rows]
         [PROCEDURE procedure_name]]

MySQL 專有優化器提示(四大關鍵字)

關鍵字作用適用場景風險
STRAIGHT_JOIN強制按 FROM 順序連表優化器選錯連接順序導致慢查詢可能阻礙更優計劃,慎用
SQL_SMALL_RESULT結果集小,用臨時表而非排序GROUP BY/DISTINCT 結果確定很小估算錯誤反而拖慢
SQL_BIG_RESULT結果集大,用排序而非臨時表大結果集 GROUP BY/DISTINCT同左
HIGH_PRIORITY提升 SELECT 優先級超過 UPDATE關鍵報表查詢插隊可能阻塞寫入,影響業務

實戰建議:絕大多數場景不需要這四個提示。優化器足夠智能,僅在 EXPLAIN 確認計劃確有問題且無索引優化空間時,作為最後手段嘗試。

去重關鍵字:DISTINCT / DISTINCTROW / ALL

  • DISTINCT / DISTINCTROW:結果集去重,**NULL 視為相等**(多個 NULL 只保留一行)
  • ALL:默認行為,保留所有行,無任何效果,純兼容性保留

結果導出:INTO OUTFILE / DUMPFILE

  • 文件在服務端創建,不能預存在
  • export_options 語法同 LOAD DATA INFILE 的 FIELDS/LINES 子句
  • OUTFILE:正常導出,含列/行結束符
  • DUMPFILE:僅寫入單行原始數據,無任何分隔符(適合導出二進制/BLOB)

SELECT 列表 表達式

  1. *:按 CREATE TABLE 順序所有列
  2. 指定列名列表,可調整順序
  3. col_name AS alias:別名
  4. 表達式:列、常量、函數、算術/位運算組合
  5. 聚合/窗口函數
  6. 以上任意組合

FROM 子句與表別名

SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name
-- 等價於
SELECT t1.name, t2.salary FROM employee t1, info t2 WHERE t1.name = t2.name
  • 多表用逗號分隔,順序不影響結果
  • 別名一旦定義,**後續所有引用(WHERE/HAVING/ORDER BY)必須用別名**
  • 別名不能以數字開頭

WHERE 子句:搜索條件完整語法

[NOT] expression comparison_operator expression
[NOT] expression [NOT] LIKE "pattern"
[NOT] expression IS [NOT] NULL
[NOT] expression [NOT] BETWEEN expr AND expr
[NOT] column_name join_operator column_name
[NOT] boolean_expression

邏輯運算符優先級

  1. AND(最高)
  2. OR
  3. 可用括號改變順序

比較運算符

符號含義
=等於
> / <大於 / 小於
>= / <=大於等於 / 小於等於
!= / <>不等於
  • 字符串比較:按字典序,< 更接近字母表頭,**小寫 > 大寫 > 數字**(依賴校對規則)
  • 末尾空格被忽略:'Dirk' = 'Dirk '
  • 日期比較:< 早於,> 晚於
  • 字符/日期類型比較**必須加引號**

LIKE 通配符

符號含義
%任意長度字符串(含空串)
_任意單字符

DATETIME 查詢技巧:完整時間含秒/毫秒,精確等值難命中。用 WHERE arrival_time LIKE '%9:20%' 模糊匹配時分。

GROUP BY / HAVING 進階

GROUP BY [ALL] aggregate_free_expression [, ...]
[HAVING search_conditions]
  • GROUP BY:按表達式分組,SELECT 列表可用聚合函數
  • ALL:包含 WHERE 過濾掉的組(Transact-SQL 擴展),與 HAVING 共用時失效
  • aggregate_free_expression:不含聚合函數的表達式(擴展允許)
  • HAVING:分組後過濾,**可引用聚合函數**,語法同 WHERE

ORDER BY 排序

  • 可用列名、別名、位置(不推薦用位置,降低可讀性)
  • ASC(默認升序)、DESC(降序)
  • SELECT id AS myid FROM t GROUP BY myid 等價於 GROUP BY id / GROUP BY 1

LIMIT 子句:分頁核心

  • LIMIT n ≡ LIMIT 0, n:前 n 行
  • LIMIT offset, n:跳過 offset 行,取 n 行(**offset 從 0 開始**)
  • 深分頁性能陷阱:LIMIT 1000000, 10 需掃描 100 萬行。優化:WHERE id > last_max_id LIMIT 10(游標分頁)

PROCEDURE 子句

歷史遺留擴展,用於結果集後處理(如 ANALYSE() 建議優化列類型)。MySQL 8.0 移除,現代版本不建議使用。

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