萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL SELECT 語句從入門到精通:子句、運算子、排序、分頁、變量與統計完整教學

基本語法骨架

SELECT [選項] select_list
FROM table_references
[WHERE where_condition]
[GROUP BY ... [HAVING ...]]
[ORDER BY ...]
[LIMIT ...]

1. 選取列表

  • *:所有欄位(生產環境禁用)。
  • 指定欄位、別名 col AS alias。
  • 運算式:算術 + - * / %、字串連接 CONCAT、函數呼叫。
  • 常數值:SELECT 1, 'const', NOW();

2. WHERE 條件過濾

比較運算子

邏輯運算子優先序

NOT > AND > OR,善用括號明確優先序。

3. 排序 ORDER BY

SELECT col1, col2 FROM t ORDER BY col1 ASC, col2 DESC;
-- 可用別名、位置編號 (不建議)

NULL 值預設排在最前 (ASC) 或最後 (DESC),可用 ORDER BY IS NULL, col 控制。

4. 分頁 LIMIT

LIMIT 10              -- 前 10 筆
LIMIT 10 OFFSET 20    -- 跳過 20 筆取 10 筆 (第 3 頁)
LIMIT 20, 10          -- 同義寫法

深分頁優化:WHERE id > last_id ORDER BY id LIMIT 10。

5. 聚合與分組 GROUP BY / HAVING

SELECT dept, COUNT(*) AS cnt, AVG(salary) AS avg_sal
FROM emp
GROUP BY dept
HAVING cnt > 5
ORDER BY avg_sal DESC;
  • HAVING 可用聚合別名,WHERE 不可。
  • GROUP BY 隱含排序 (MySQL 5.7 前),8.0+ 需顯式 ORDER BY。

6. 去重 DISTINCT

SELECT DISTINCT dept FROM emp;
SELECT COUNT(DISTINCT dept) FROM emp;

7. 多表查詢 JOIN

  • INNER JOIN:交集。
  • LEFT/RIGHT JOIN:左/右表全保留。
  • CROSS JOIN:笛卡兒積。
  • 條件寫在 ON,篩選寫在 WHERE。

8. 子查詢與 CTE (8.0+)

-- 子查詢
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2 WHERE status=1);

-- CTE 更易讀
WITH active AS (SELECT id FROM t2 WHERE status=1)
SELECT * FROM t1 WHERE id IN (SELECT id FROM active);

9. 使用者變量

SELECT @max_id := MAX(id) FROM t1;
SELECT * FROM t1 WHERE id = @max_id;

會話級、連線隔離,適合簡單狀態傳遞。

10. 統計分析實戰

-- 各部門人數、平均薪資、最高薪資
SELECT dept,
       COUNT(*) AS cnt,
       AVG(salary) AS avg_sal,
       MAX(salary) AS max_sal
FROM emp
GROUP BY dept
ORDER BY cnt DESC
LIMIT 5;

避坑清單

  • 避免 SELECT *。
  • 索引欄位不加函數、不隱含轉換。
  • NOT IN 子查詢含 NULL 會回空集,改用 NOT EXISTS。
  • OR 條件跨欄位導致索引失效,改用 UNION ALL。
  • 大表 COUNT(*) 慢,用 EXPLAIN 估算或維護計數表。
copyright © 萬盛學電腦網 all rights reserved
運算子說明
=, <>, !=等於、不等於
>, <, >=, <=大小比較
IS NULL / IS NOT NULLNULL 判斷
BETWEEN ... AND ...區間含邊界
IN (val1, val2...)集合包含
LIKE 'pattern'模糊比對,% 多字元、_ 單字元