SELECT * FROM play_list ORDER BY createtime; SELECT * FROM play_list ORDER BY bookedcount DESC, createtime ASC;
DESC 僅作用於緊前欄位,多欄位需逐個指定排序方向。
SELECT DISTINCT userid FROM play_list; SELECT DISTINCT userid, play_name FROM play_list; -- 組合去重
⚠️ 底層需排序,大表慎用,消耗 CPU。
SELECT userid, COUNT(*) AS play_num FROM play_list GROUP BY userid HAVING COUNT(*) >= 2;
HAVING 過濾分組結果,WHERE 過濾原始行| 通配符 | 含義 |
|---|---|
| % | 任意長度字符(含 0) |
| _ | 單個字符 |
| [charlist] | 字符集合中任一 |
| [^charlist] | 非字符集合中任一 |
⚠️ %xxx% 導致全表掃描,大表禁用;xxx% 可用索引。
SELECT * FROM play_list WHERE createtime BETWEEN 1427701323 AND 1430383307 LIMIT 10 OFFSET 6;
⚠️ OFFSET 過大需掃描前 N 行,深分頁效能差,建議游標式分頁(WHERE id > last_id LIMIT 10)。
SELECT play_name,
CASE WHEN trackcount IS NULL THEN 0 ELSE trackcount END AS track_cnt
FROM play_list;
-- 內連接(僅匹配行) SELECT f.userid FROM play_fav f INNER JOIN play_list l ON f.play_id = l.id WHERE l.play_name = '老男孩'; -- 左連接(保留左表所有行) SELECT l.play_name, f.userid FROM play_list l LEFT JOIN play_fav f ON l.id = f.play_id;
-- 子查詢(優化器受限) SELECT userid FROM play_fav WHERE play_id = (SELECT id FROM play_list WHERE play_name = '老男孩'); -- JOIN(優化器可選驅動表) SELECT f.userid FROM play_fav f JOIN play_list l ON f.play_id = l.id WHERE l.play_name = '老男孩';
原理:JOIN 採用 Nested Loop,優化器會自動選擇小表作驅動表;子查詢固定內外表順序,難以優化。
SELECT userid FROM play_list UNION SELECT userid FROM play_fav; -- 預設去重 SELECT userid FROM play_list UNION ALL SELECT userid FROM play_fav; -- 保留重複
| 語法 | 用途 | 範例 |
|---|---|---|
| 多值插入 | 批量寫入,減少往返 | INSERT INTO t VALUES (1),(2),(3); |
| 覆蓋插入 | 主鍵衝突則替換 | REPLACE INTO t VALUES (1,'a'); |
| 忽略插入 | 主鍵衝突則跳過 | INSERT IGNORE INTO t VALUES (1,'a'); |
| 查詢插入 | 跨表複製/導數據 | INSERT INTO a SELECT * FROM b; |
| ON DUPLICATE KEY UPDATE | 衝突則更新(Upsert) | INSERT INTO t VALUES(1,100) ON DUPLICATE KEY UPDATE age=100; |
-- 連表更新:用 B 表 age 更新 A 表 UPDATE a, b SET a.age = b.age WHERE a.id = b.id; -- 連表刪除:用 B 表條件刪 A 表 DELETE a FROM a, b WHERE a.id = b.id AND b.name = 'pw';
COUNT/SUM/AVG/MAX/MIN:多對一GROUP_CONCAT(col):分組內字符串拼接,預設 1024 字節上限(可調 group_concat_max_len)-- 錯誤:非聚合欄位未分組 SELECT song_name, MAX(playcount) FROM song_list; -- 正確:子查詢或排序取 TOP1 SELECT song_name, playcount FROM song_list ORDER BY playcount DESC LIMIT 1;
SELECT album, GROUP_CONCAT(song_name) FROM song_list GROUP BY album;
CONCAT, SUBSTRING, REPLACE, TRIM, UPPER/LOWER, LENGTHROUND, CEIL, FLOOR, ABS, MOD, RANDNOW, DATE, TIME, DATE_FORMAT, DATE_ADD/SUB, DATEDIFF, UNIX_TIMESTAMP, FROM_UNIXTIMEIF, IFNULL, NULLIF, CASE WHEN| 符號 | 含義 |
|---|---|
| %Y | 四位年份 |
| %m | 兩位月份 |
| %d | 兩位日期 |
| %H/%h | 24/12 小時制 |
| %i | 分鐘 |
| %s | 秒 |
ORDER BY/GROUP BY/HAVING/LIMIT 組合查詢UNION/UNION ALL 整合異構數據