查詢涉及中文時,執行前設置連接字符集:
SET NAMES utf8mb4; -- 或 utf8/gbk,與表字符集一致
可加入連接初始化 SQL 或驅動配置 characterEncoding=utf8mb4。
SELECT * FROM t WHERE status IN (1,2,3); SELECT * FROM t WHERE status NOT IN (4,5);
SELECT * FROM t WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'; -- 等價於 create_time >= '2023-01-01' AND create_time <= '2023-12-31'
SELECT DISTINCT category FROM products; -- 配合 GROUP_CONCAT 顯示分組詳情 SELECT category, GROUP_CONCAT(name) FROM products GROUP BY category;
| 函數 | 說明 | 注意 |
|---|---|---|
COUNT(*) | 統計行數(含 NULL) | 無 WHERE 時 MyISAM O(1),InnoDB 掃描聚簇索引 |
COUNT(col) | 統計非 NULL 行數 | |
SUM(col) | 求和 | 忽略 NULL |
AVG(col) | 平均值 | 忽略 NULL |
SELECT o.id, u.name FROM orders o INNER JOIN users u ON o.user_id = u.id; -- 僅返回雙方匹配的行
-- 存在即返回 TRUE,不返回具體數據 SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
SELECT * FROM (SELECT user_id, COUNT(*) cnt FROM orders GROUP BY user_id) t WHERE cnt > 5;
-- UNION:去重合併 SELECT id FROM t1 UNION SELECT id FROM t2; -- UNION ALL:直接合併,性能更好,無去重 SELECT id FROM t1 UNION ALL SELECT id FROM t2;
-- 表別名 SELECT u.name FROM users AS u; -- 列別名 SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
MySQL 使用 POSIX 正則,常用元字符:
| 模式 | 含義 | 示例 |
|---|---|---|
^ | 行首 | WHERE name REGEXP '^php' 以 php 開頭 |
$ | 行尾 | WHERE name REGEXP 'module$' 以 module 結尾 |
. | 任意單字符 | WHERE name REGEXP 'P.' 含 P 及其後任意字符 |
[...] | 字符集合 | WHERE name REGEXP '[PCA]' 含 P/C/A 任一 |
[^...] | 排除集合 | WHERE name REGEXP '[^c-z]' 非 c-z 字母 |
| | 或 | WHERE name REGEXP 'php|java|go' |
* | 0 或多次 | WHERE name REGEXP 'J*A' A 前 0+ 個 J |
+ | 1 或多次 | WHERE name REGEXP 'J+A' A 前 1+ 個 J |
{n} | 恰好 n 次 | WHERE name REGEXP 'a{3}' 連續 3 個 a |
{m,n} | m~n 次 | WHERE name REGEXP 'a{2,4}' 2~4 個 a |
-- 查詢書名以 php 開頭 SELECT books FROM tb_book WHERE books REGEXP '^php'; -- 查詢包含 php、c 或 java 任一關鍵詞 SELECT books FROM tb_books WHERE books REGEXP 'php|c|java';
REGEXP 無法使用索引,大表慎用,考慮全文索引或 ES;UNION ALL 優於 UNION,除非業務要求去重;JOIN 或 EXISTS;LEFT JOIN 驅動表放小結果集側,關聯列建索引。