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

MySQL SELECT 語法全解析:子句順序、選項、條件、分組、排序與分頁

     編輯:MySQL 綜合教學

標準語法骨架

SELECT [選項] 選取清單
FROM 表來源
[WHERE 條件]
[GROUP BY 分組欄位 [ASC|DESC], ...]
[HAVING 分組條件]
[ORDER BY 排序欄位 [ASC|DESC], ...]
[LIMIT [偏移量,] 行數];

子句執行順序: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

1. 選項子句

選項效果預設
ALL保留所有列(含重複)是
DISTINCT去除重複列否
DISTINCTROW同 DISTINCT(別名)-
HIGH_PRIORITY優先於寫入鎖執行-
STRAIGHT_JOIN強制按 FROM 順序連接-
SQL_SMALL_RESULT結果集小,使用臨時表-
SQL_BIG_RESULT結果集大,使用磁碟臨時表-
SQL_BUFFER_RESULT強制結果放入臨時表-
SQL_CACHE / SQL_NO_CACHE控制查詢快取-
SQL_CALC_FOUND_ROWS配合 LIMIT 計算總行數-

2. FROM 子句

  • 單表:FROM tbl_name [[AS] alias]
  • 多表(交叉連接):FROM t1, t2 → 笛卡爾積
  • 明確 JOIN:FROM t1 INNER JOIN t2 ON t1.id = t2.id
  • 衍生表:FROM (SELECT ... ) AS dt

3. WHERE 子句

列級過濾,支援運算符:

優先級(高→低): 比較 → NOT → AND → OR → XOR。
禁忌: WHERE 中不可使用選取清單別名(尚未計算)。

4. GROUP BY 子句

  • 支援多欄位:GROUP BY col1 [ASC|DESC], col2 ...
  • 搭配聚合函數:COUNT(*)(含 NULL)、COUNT(col)(排除 NULL)
  • MySQL 5.7+ 預設 ONLY_FULL_GROUP_BY,非聚合欄位必須出現在 GROUP BY 或函數中

5. HAVING 子句

  • 分組後過濾,可使用聚合函數、選取別名
  • 無 GROUP BY 時等同 WHERE(但可用聚合)
  • 不能替代 WHERE(WHERE 先於 GROUP BY 執行,效率更高)

6. ORDER BY 子句

  • ASC(預設)遞增,DESC 遞減
  • 多欄位排序:先按第一欄,相同才按第二欄
  • 隱含主鍵作為最終 tie-breaker(InnoDB 聚簇索引順序)
  • 可使用選取別名、聚合函數、任意運算式

7. LIMIT 子句(分頁利器)

LIMIT 行數                    -- 等同 LIMIT 0, 行數
LIMIT 偏移量, 行數            -- 從偏移量開始取行數行(偏移量從 0 起算)

-- 分頁公式:第 page 頁,每頁 size 條
LIMIT (page - 1) * size, size

大偏移量效能陷阱: LIMIT 1000000, 10 需掃描 100 萬行再丟棄。優化:
→ 使用覆蓋索引 WHERE id > last_seen_id ORDER BY id LIMIT 10(游標式分頁)
→ 或延遲關聯:SELECT * FROM t JOIN (SELECT id FROM t ORDER BY id LIMIT 1000000, 10) d USING (id)

完整範例

-- 查詢 2023 年每月訂單金額前 3 高的客戶
SELECT
  DATE_FORMAT(o.created_at, '%Y-%m') AS month,
  c.name AS customer,
  SUM(o.amount) AS total_amount
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.created_at >= '2023-01-01' AND o.created_at < '2024-01-01'
GROUP BY month, c.id
HAVING total_amount > 10000
ORDER BY month ASC, total_amount DESC
LIMIT 3;

常見錯誤速查

類別運算符
比較=, <>, !=, <, <=, >, >=, <=>, BETWEEN, IN, LIKE, REGEXP, IS NULL
邏輯AND / &&, OR / ||, NOT / !, XOR
錯誤原因修正
Unknown column 'alias' in 'where clause'WHERE 用了 SELECT 別名改用原欄位名或移至 HAVING
Mixing of GROUP columns ...ONLY_FULL_GROUP_BY 違規補全 GROUP BY 或用 ANY_VALUE()
LIMIT offset 巨大導致慢查詢掃描大量行再丟棄改用游標式分頁
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved