INSERT INTO target_table (col1, col2)
SELECT col1, col2 FROM source_table WHERE status = 'active';
避免應用層循環插入的網絡往返與事務開銷。
INSERT INTO logs (level, message) VALUES
('INFO', 'Service started'),
('WARN', 'Queue length > 100'),
('ERROR', 'Connection timeout');
單次提交,解析器僅優化一次,批量導入場景效能提升 10x+。
SELECT LAST_INSERT_ID();
無論並發多少插入,每個連線只見自己的 ID,無需鎖表。
SELECT COALESCE(nickname, real_name, 'Guest') AS display_name FROM users;
-- 等價 SQL Server: ISNULL(nickname, ISNULL(real_name, 'Guest'))
標準 SQL,跨庫遷移無痛。
REPAIR TABLE corrupted_table;
-- 或帶參數
REPAIR TABLE corrupted_table USE_FRM; -- 僅用 .frm 重建索引
適用於斷電、磁碟壞塊導致的 MyISAM 索引損壞。InnoDB 有自動崩潰恢復,無需手動。
-- 秒級
SELECT FROM_UNIXTIME(1700000000); -- 2023-11-14 21:33:20
-- 毫秒級 (13 位) 需除以 1000
SELECT FROM_UNIXTIME(1700000000123 / 1000);
-- 或保留毫秒
SELECT FROM_UNIXTIME(1700000000123 / 1000, '%Y-%m-%d %H:%i:%s.%f');
直接傳 13 位數字會溢出導致錯誤日期,務必先除 1000。
-- 當前時間減 7 天
SELECT DATE_SUB(NOW(), INTERVAL 7 DAY);
SELECT ADDDATE(NOW(), INTERVAL -7 DAY);
-- 字段比較
SELECT * FROM orders WHERE created_at > DATE_SUB(NOW(), INTERVAL 30 DAY);
MySQL 推薦 INTERVAL 語法,可讀性強、跨版本穩定。
-- 低效:外層 WHERE 無法下推
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2 WHERE status=1);
-- 高效:JOIN + 派生表 (MySQL 5.6+ 優化器自動轉換)
SELECT t1.* FROM t1 JOIN (SELECT id FROM t2 WHERE status=1) t2 USING (id);
-- 或 EXIST (半連接優化)
SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.id = t1.id AND t2.status=1);
關鍵原則:**子查詢內部必須帶 WHERE 過濾**,否則產生巨大派生表拖垮性能。
這 8 條技巧覆蓋 **寫入優化、ID 獲取、空值處理、修復、時間轉換、日期運算、子查詢優化** 七大高頻場景。熟練內化為肌肉記憶,日常開發即能寫出高效、可移植、抗併發的 SQL。