MySQL SELECT 擴展 ANSI SQL-92,新增 STRAIGHT_JOIN、SQL_SMALL_RESULT、HIGH_PRIORITY 等優化提示。本文完整解析語法結構、各關鍵字用途、INTO OUTFILE/DUMPFILE 匯出、簡單 SELECT 運算與變數賦值技巧。
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 {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[LIMIT [offset,] rows] [PROCEDURE procedure_name]]
| 關鍵字 | 用途 | 使用場景 |
|---|---|---|
| STRAIGHT_JOIN | 強制按 FROM 順序 JOIN | 優化器選錯 JOIN 順序時 |
| SQL_SMALL_RESULT | 結果集小,用暫存表而非排序 | GROUP BY/DISTINCT 結果較少 |
| SQL_BIG_RESULT | 結果集大,用排序而非暫存表 | GROUP BY/DISTINCT 結果較多 |
| HIGH_PRIORITY | 提高查詢優先級(高於更新) | 即時查詢、報表查詢 |
⚠️ 多數情況**不需使用**,優化器通常足夠聰明。
DISTINCT / DISTINCTROW:去除重複列(NULL 視為相等)ALL:預設,保留所有列(寫不寫效果同)-- 匯出 CSV(含欄位/列結束符)
SELECT * INTO OUTFILE '/tmp/data.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'
FROM mytable;
-- 匯出單行原始資料(無結束符)
SELECT * INTO DUMPFILE '/tmp/raw.bin' FROM mytable WHERE id=1;
FILE 權限export_options 語法同 LOAD DATA INFILE-- 純運算
SELECT 1+1; -- 2
SELECT NOW(); -- 目前時間
-- 變數賦值 (MySQL 變數)
SELECT @x := 10;
SELECT @y := @x * 2; -- @y = 20
-- 結合函數運算
SELECT CONCAT('Hello, ', @name) AS greeting;
💡 PHP 中可利用此特性呼叫 MySQL 函數運算後賦值給 PHP 變數。
LIMIT 配合 ORDER BY 使用,避免非確定性結果:=,= 在 SELECT 中為比較運算子