当前位置: 首页 > news >正文

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

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

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

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

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

SELECT t1.*
FROM table1 t1
WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t1.join_key = t2.join_key
);

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

方法3:使用NOT IN

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(经理表),想找出非经理的员工:

-- 方法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
);
http://www.lqws.cn/news/98803.html

相关文章:

  • Express 集成Sequelize+Sqlite3 默认开启WAL 进程间通信 Conf 打包成可执行 exe 文件
  • 【Redis】set 类型
  • qt控制台程序与qt窗口程序在读取数据库中文字段的差异!!巨坑
  • MySQL 如何判断某个表中是否存在某个字段
  • 基于PostGIS的GeoTools执行原生SQL查询制图实践-以贵州省行政区划及地级市驻地为例
  • React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术
  • 结构性设计模式之Composite(组合)
  • Spring AI 项目实战(一):Spring AI 核心模块入门
  • MongoDB数据库学习
  • 宇树科技更名“股份有限公司”深度解析:机器人企业IPO前奏与资本化路径
  • 业态即战场:零售平台的生意模型与系统设计解构
  • EtherCAT背板方案:方芯半导体工业自动化领域的高速、高精度的通信解决方案
  • 定时器时钟来源可以从输入捕获引脚输入
  • RK3568-移植codesys-runtime
  • 【RabbitMQ】- Channel和Delivery Tag机制
  • 『React』组件副作用,useEffect讲解
  • 灵活运用 NextJS 服务端组件与客户端组件
  • Dify:启动 Web 服务的详细指南
  • CSS 平铺+自动换行效果
  • IT运维工具推荐
  • Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发?
  • 统信 UOS 服务器版离线部署 DeepSeek 攻略
  • vue-14(使用 ‘router.push‘ 和 ‘router.replace‘ 进行编程导航)
  • 芒果深度学习检测:开启农业新视界(猫脸码客第230期)
  • CentOS Stream 8 Unit network.service not found
  • 美尔斯通携手北京康复辅具技术中心开展公益活动,科技赋能助力银龄健康管理
  • dvwa5——File Upload
  • 智能氮气柜的发展历程和前景展望
  • 星野录(博客系统)测试报告
  • 从“Bucharest”谈起:词语翻译的音译与意译之路