You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL查询两表列差异及MySQL获取仅存于表1的名称

两表数据对比的SQL解决方案

表结构与示例数据

表1(假设表名为table1)

NameAddressHeightWeight
X.yz.p
G.H.IJ
QW.E.R

表2(假设表名为table2)

NameIncomeTax
X.yz.

问题1:如何使用SQL查询获取两个SQL表中两列的差异?

针对两列差异的查询,分两种常见场景实现:

场景1:匹配关联键后对比列值差异

以Name为关联键,对比两表中对应列的不一致记录,示例如下:

SELECT 
    t1.Name,
    t1.Address AS table1_address,
    t2.Income AS table2_income,
    -- 自定义差异标识
    CASE 
        WHEN t1.Address != t2.Income THEN '地址与收入值不匹配'
        ELSE '匹配'
    END AS diff_note
FROM table1 t1
INNER JOIN table2 t2 ON t1.Name = t2.Name
WHERE t1.Address != t2.Income; -- 筛选列值不等的记录

场景2:获取某列的全集差异(存在于A不存在于B,反之亦然)

如果要获取Name列在两表中的独有值集合,用UNION ALL结合NOT EXISTS实现:

-- 仅在table1存在的Name
SELECT Name, '仅存在于table1' AS source FROM table1
WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE table2.Name = table1.Name)
UNION ALL
-- 仅在table2存在的Name(本题中无此数据,语法通用)
SELECT Name, '仅存在于table2' AS source FROM table2
WHERE NOT EXISTS (SELECT 1 FROM table1 WHERE table1.Name = table2.Name);

问题2:在MySQL中,能否对比两表的行数据,获取仅出现在表1而不在表2中的名称?

完全可以,以下三种常用方法:

方法1:使用NOT EXISTS(推荐,性能稳定)

SELECT Name FROM table1
WHERE NOT EXISTS (
    SELECT 1 FROM table2 
    WHERE table2.Name = table1.Name
);

根据示例数据,查询结果为G.和Q。

方法2:使用LEFT JOIN筛选空值

SELECT t1.Name FROM table1 t1
LEFT JOIN table2 t2 ON t1.Name = t2.Name
WHERE t2.Name IS NULL;

LEFT JOIN保留table1所有记录,未匹配到table2的记录会返回NULL,筛选这些记录即可得到目标结果。

方法3:使用NOT IN(注意空值陷阱)

SELECT Name FROM table1
WHERE Name NOT IN (SELECT Name FROM table2);

⚠️ 注意:如果table2的Name列包含NULL值,此查询会返回空结果,因为NULL参与比较时逻辑特殊,此时优先用前两种方法。


内容的提问来源于stack exchange,提问作者winterlyrock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 05:41:14