MySQL SQL 基礎查詢語句核心語法速查手冊
掌握 MySQL 基礎查詢語法是資料庫開發與分析的入門必修課。本文系統整理 SELECT 語句的核心子句、運算符、通配符、排序分頁、條件過濾等實戰語法,附帶範例與注意事項,適合初學者快速上手與資深工程師查漏補缺。
一、SELECT 基礎結構
SELECT [DISTINCT] 選擇列表
FROM 表來源
[WHERE 條件]
[GROUP BY 分組列表]
[HAVING 分組條件]
[ORDER BY 排序列表 [ASC|DESC]]
[LIMIT [偏移量,] 行數]
二、去重與限制結果集
1. DISTINCT 去重
-- 單列去重
SELECT DISTINCT vend_id FROM products;
-- 多列組合去重(以所有指定列組合為準)
SELECT DISTINCT vend_id, prod_price FROM products;
2. LIMIT 分頁與限制
-- 取前 5 行
SELECT prod_name FROM products LIMIT 5;
-- 偏移量 + 行數:從第 6 行開始取 5 行(即第 6-10 行)
SELECT prod_name FROM products LIMIT 5, 5;
-- 等價標準語法
SELECT prod_name FROM products LIMIT 5 OFFSET 5;
-- 注意:MySQL 索引從 0 開始,LIMIT 0,5 為前 5 行
三、排序 ORDER BY
-- 單列升序(預設)
SELECT prod_name FROM products ORDER BY prod_name;
-- 單列降序
SELECT prod_name FROM products ORDER BY prod_name DESC;
-- 多列排序:先按價格降序,再按名稱升序
SELECT prod_name, prod_price FROM products
ORDER BY prod_price DESC, prod_name ASC;
-- 可使用非 SELECT 列排序
SELECT prod_name FROM products ORDER BY prod_price DESC;
-- ORDER BY 必須在 WHERE 之後,LIMIT 之前
四、條件過濾 WHERE
1. 比較運算符
| 運算符 | 含義 | 範例 |
| = | 等於 | prod_price = 10 |
| <> 或 != | 不等於 | prod_price <> 10 |
| <, <=, >, >= | 大小比較 | prod_price > 10 |
| BETWEEN ... AND ... | 範圍(含邊界) | prod_price BETWEEN 5 AND 10 |
| IS NULL / IS NOT NULL | 空值判斷 | prod_price IS NULL |
2. 邏輯運算符
-- AND:交集(優先級高於 OR)
SELECT prod_id, prod_price, prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10;
-- OR:並集
SELECT prod_name, prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;
-- IN:簡化多個 OR 等值條件
SELECT prod_name, prod_price
FROM products
WHERE vend_id IN (1002, 1003)
ORDER BY prod_name;
-- NOT IN:排除指定值
SELECT prod_name, prod_price
FROM products
WHERE vend_id NOT IN (1002, 1003)
ORDER BY prod_name;
-- 括號控制優先級
SELECT * FROM products
WHERE (vend_id = 1001 OR vend_id = 1002) AND prod_price > 5;
五、通配符模糊查詢 LIKE
| 通配符 | 匹配規則 | 範例 | 匹配結果 |
| % | 任意長度字符(含 0 個) | LIKE 'jet%' | 以 jet 開頭 |
| % | 任意長度字符 | LIKE '%anvil' | 以 anvil 結尾 |
| % | 任意長度字符 | LIKE '%jet%' | 包含 jet |
| _ | 單個任意字符 | LIKE '_ ton anvil' | 第 1 位任意,後接 " ton anvil" |
| _ | 單個任意字符 | LIKE 'J__' | J 開頭的 3 字符 |
通配符使用最佳實踐:
- 不要過度使用: 能用 =、IN、BETWEEN 解決的不用 LIKE
- 避免前置 %:
LIKE '%abc' 無法使用索引,全表掃描
- 後置 % 可用索引:
LIKE 'abc%' 可走索引範圍掃描
- 精確匹配優先: 明確值用 =,不要用 LIKE
六、常用字符串與數值函數
-- 字符串
CONCAT(str1, str2, ...) -- 拼接
UPPER/LOWER(str) -- 大小寫轉換
TRIM(str) -- 去首尾空格
SUBSTRING(str, pos, len) -- 截取
LENGTH(str) -- 字節長度
CHAR_LENGTH(str) -- 字符長度
-- 數值
ROUND(num, decimals) -- 四捨五入
FLOOR/CEIL(num) -- 向下/向上取整
ABS(num) -- 絕對值
MOD(n, m) -- 取模
-- 日期
NOW() -- 當前日期時間
CURDATE() -- 當前日期
DATE_ADD(date, INTERVAL n UNIT) -- 日期加減
DATEDIFF(date1, date2) -- 日期差天數
DATE_FORMAT(date, format) -- 格式化輸出
七、聚合查詢與分組
-- 基礎聚合
SELECT COUNT(*), AVG(prod_price), MAX(prod_price), MIN(prod_price), SUM(quantity)
FROM products;
-- 分組聚合
SELECT vend_id, COUNT(*) AS prod_count, AVG(prod_price) AS avg_price
FROM products
GROUP BY vend_id;
-- 分組過濾(HAVING 針對聚合結果,WHERE 針對原始行)
SELECT vend_id, COUNT(*) AS cnt
FROM products
GROUP BY vend_id
HAVING COUNT(*) >= 3;
-- 多列分組
SELECT vend_id, category, COUNT(*)
FROM products
GROUP BY vend_id, category;
八、多表連接 JOIN
| 連接類型 | 語法 | 結果集 | 適用場景 |
| 內連接 | INNER JOIN / JOIN | 兩表匹配的行 | 核心業務關聯 |
| 左連接 | LEFT JOIN | 左表全量 + 右表匹配 | 主表帶從表(如訂單+明細) |
| 右連接 | RIGHT JOIN | 右表全量 + 左表匹配 | 較少用,可轉 LEFT JOIN |
| 全連接 | FULL JOIN (MySQL 不支援) | 兩表全量 | UNION 模擬 |
-- 內連接範例
SELECT c.cust_name, o.order_num
FROM customers c
INNER JOIN orders o ON c.cust_id = o.cust_id;
-- 左連接:所有客戶(含無訂單)
SELECT c.cust_name, o.order_num
FROM customers c
LEFT JOIN orders o ON c.cust_id = o.cust_id;
九、子查詢
-- 標量子查詢(返回單值)
SELECT prod_name, prod_price
FROM products
WHERE prod_price > (SELECT AVG(prod_price) FROM products);
-- 列子查詢(IN/NOT IN)
SELECT cust_name
FROM customers
WHERE cust_id IN (SELECT cust_id FROM orders);
-- 存在性子查詢(EXISTS,通常效能優於 IN)
SELECT cust_name
FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.cust_id = c.cust_id);
-- 從表子查詢(派生表)
SELECT dt.cust_name, dt.order_count
FROM (
SELECT cust_id, COUNT(*) AS order_count
FROM orders
GROUP BY cust_id
) dt
JOIN customers c ON c.cust_id = dt.cust_id;
十、實戰避坑指南
- SELECT * 禁用: 明確列出需要欄位,減少網路傳輸、利用覆蓋索引
- 隱式轉換: WHERE 條件類型與欄位類型保持一致,避免索引失效
- NULL 值陷阱:
col = NULL 永遠為假,必須用 IS NULL;NOT IN 子查詢含 NULL 會導致空結果
- 分頁深度問題:
LIMIT 1000000, 10 效能極差,改用游標/ID 範圍分頁
- 字符集匹配: 連接、表、欄位字符集一致,避免亂碼與索引失效
熟練掌握上述核心語法,覆蓋 90% 日常查詢開發場景。進階學習建議深入:CTE (WITH 子句)、窗口函數 (ROW_NUMBER/OVER)、JSON 函數、準備語句與綁定變量、優化器提示。