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
);
相关推荐
····懂···44 分钟前
PostgreSQL 技术峰会,为您打造深度交流优质平台
数据库·postgresql
2301_802502334 小时前
哈工大计算机系统2025大作业——Hello的程序人生
数据库·程序人生·课程设计
Alan3168 小时前
Qt 中,设置事件过滤器(Event Filter)的方式
java·开发语言·数据库
TDengine (老段)8 小时前
TDengine 集群容错与灾备
大数据·运维·数据库·oracle·时序数据库·tdengine·涛思数据
Lao A(zhou liang)的菜园9 小时前
高效DBA的日常运维主题沙龙
运维·数据库·dba
迪迦不喝可乐10 小时前
mysql知识点
数据库·mysql
不太可爱的大白10 小时前
MySQL 事务的 ACID 四大特性及其实现原理
数据库·mysql
观测云11 小时前
HikariCP 可观测性最佳实践
数据库
文牧之11 小时前
PostgreSQL的扩展 dblink
运维·数据库·postgresql
趁你还年轻_12 小时前
Redis-旁路缓存策略详解
数据库·redis·缓存