SQL 筛选出在表1但不在表2中的数据

SQL 筛选出在表1但不在表2中的数据

在SQL中,要筛选出存在于表1但不存在于表2中的数据,有几种常见的方法:

方法1:使用LEFT JOIN + WHERE IS NULL

sql 复制代码
SELECT t1.*
FROM table1 t1
LEFT JOIN table2 t2 ON t1.join_key = t2.join_key
WHERE t2.join_key IS NULL;

这种方法通过左连接表1和表2,然后筛选出表2中连接键为NULL的记录,这些记录就是表1中存在但表2中不存在的。

方法2:使用NOT EXISTS

sql 复制代码
SELECT t1.*
FROM table1 t1
WHERE NOT EXISTS (
    SELECT 1 
    FROM table2 t2 
    WHERE t1.join_key = t2.join_key
);

这种方法使用子查询检查表2中是否存在匹配记录,性能通常较好。

方法3:使用NOT IN

sql 复制代码
SELECT t1.*
FROM table1 t1
WHERE t1.join_key NOT IN (
    SELECT t2.join_key 
    FROM table2 t2
);

注意:如果表2中的join_key可能有NULL值,这种方法可能不会返回预期结果。

性能考虑

  • 对于大数据集,方法2(NOT EXISTS)通常性能最好
  • 确保连接键上有适当的索引
  • 不同数据库系统可能对这些方法的优化程度不同

示例

假设有两个表:employees(员工表)和managers(经理表),想找出非经理的员工:

sql 复制代码
-- 方法1
SELECT e.*
FROM employees e
LEFT JOIN managers m ON e.employee_id = m.employee_id
WHERE m.employee_id IS NULL;

-- 方法2
SELECT e.*
FROM employees e
WHERE NOT EXISTS (
    SELECT 1 
    FROM managers m 
    WHERE e.employee_id = m.employee_id
);
相关推荐
倔强的石头_1 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横1 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神2 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据3 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡3 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧3 天前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon3 天前
SQL学习指南——视图
数据库·sql