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
);
相关推荐
盒马coding5 分钟前
PostgreSQL18新功能COPY命令变得更加用户友好
数据库·postgresql
️️(^~^)20 分钟前
触发器,存储过程
数据库
罗光记26 分钟前
Quantinuum 发布新型量子计算机“Helios“
数据库·经验分享·其他·百度·twitter
友友马1 小时前
『 数据库 』MySQL索引深度解析:从数据结构到B+树的完整指南
数据库·mysql
SelectDB1 小时前
替换 ClickHouse,查询并发提升 7 倍!高途教育基于阿里云 SelectDB 构建秒级实时报表
数据库·apache
JamSlade1 小时前
优化用户体验的小点:乐观更新链路 双数据库查询
数据库·ux
一 乐1 小时前
个人博客|博客app|基于Springboot+微信小程序的个人博客app系统设计与实现(源码+数据库+文档)
java·前端·数据库·spring boot·后端·小程序·论文
小二·2 小时前
用 eBPF 实现 MySQL 慢查询实时追踪(终极实战版):零侵入、毫秒级、全上下文捕获
数据库·mysql·adb
云飞云共享云桌面2 小时前
三维设计办公资源如何共享集中和安全管控?
运维·服务器·数据库·安全·自动化·制造
百锦再3 小时前
大型省级政务平台采用金仓数据库(KingbaseES)
开发语言·数据库·后端·rust·eclipse