萬盛學電腦網

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

MySQL 常用 SQL 語句速查:差集、清空、跨表插入實戰

一、 求差集:A 表有而 B 表無

單欄位比對

SELECT aurl FROM atab 
WHERE aurl NOT IN (SELECT DISTINCT burl FROM btab);

注意:MySQL 5.0+ 才支援子查詢;NOT IN 遇 NULL 會導致空結果集,若 B 表欄位含 NULL,改用 NOT EXISTS。

多欄位組合比對

SELECT aurl, aclass FROM atab
WHERE CONCAT(aurl, aclass) NOT IN (
    SELECT DISTINCT CONCAT(burl, bclass) FROM btab
);

或使用 NOT EXISTS 避免 NULL 陷阱且效能更佳:

SELECT a.* FROM atab a
WHERE NOT EXISTS (
    SELECT 1 FROM btab b 
    WHERE b.burl = a.aurl AND b.bclass = a.aclass
);

二、 清空資料表:DELETE vs TRUNCATE

特性DELETE FROM tabTRUNCATE TABLE tab
可帶 WHERE是否
觸發 Trigger是否
回傳影響列數實際刪除筆數永遠為 0
自增計數器保留 (除非無 WHERE)重置為 1
執行速度逐行刪除,較慢釋放頁面,極快
事務安全可回滾隱式提交,不可回滾

保留自增值的刪除技巧

DELETE FROM atab WHERE 1;  -- 永真條件,不重置 AUTO_INCREMENT

三、 跨表插入指定欄位

INSERT INTO atab (aurl)
SELECT burl FROM btab;

欄位順序、型別必須一一對應;若目標表有 NOT NULL 無預設值欄位,需在 SELECT 列出或確保來源表有值。

四、 進階補充:批量去重插入

INSERT IGNORE INTO target (id, name)
SELECT id, name FROM source;

IGNORE 會跳過主鍵/唯一鍵衝突行,適合增量同步。

copyright © 萬盛學電腦網 all rights reserved