EXISTS 和 IN 的替换使用

时间:2025-03-18 09:32:44

EXISTS 和 IN 的替换使用

  • 使用背景
  • IN 和 NOT IN
    • IN
    • NOT IN
  • EXISTS 和 NOT EXISTS
    • EXISTS
      • 解析
    • NOT EXISTS
      • 解析
  • 使用场景
  • 未解决问题
    • 已解决
      • 错误示范
      • 正确示范

使用背景

公司代码改造,在新的开发规范中,不允许使用IN 和 NOT IN,推荐使用EXISTS,介于第一次使用,总结一下自己的理解,以便后面复用。

IN 和 NOT IN

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况

IN

查询table中number列等于1的数据

SELECT * FRON TABLE WHERE NUMBER IN ('1');

NOT IN

查询table中number列不等于1的数据

SELECT * FRON TABLE WHERE NUMBER NOT IN ('1');

EXISTS 和 NOT EXISTS

EXISTS

查询table中number列等于1的数据

SELECT * FRON TABLE A WHERE 
	EXISTS (SELECT * FROM TABLE B WHERE NUMBER = '1' 
											AND  = );

解析

当EXISTS的SQL返回的值为真(有结果集)时,保留A表中ID等于B表中ID的行的数据。

NOT EXISTS

查询table中number列不等于1的数据

SELECT * FRON TABLE A WHERE 
	NOT EXISTS (SELECT * FROM TABLE B WHERE NUMBER = '1' 
											AND  = );

解析

将EXISTS的SQL返回结果取反,取反之后的结果为真(没查询出结果集),则保留A表中ID等于B表中ID的行的数据–(此时最后查询结果为空),取反之后的结果(查询出结果集)为假则不保留–(此时最后查询结果为空)。

使用场景

需要根据某个条件去过滤时都可以使用

未解决问题

不知道怎么根据两个参数去过滤结果,比如查询number = 1 或者number =2 的数据时,结果集为空,相当于 只能in一个值 number in (‘1’),想要number in (‘1’,‘2’)时结果为空,目前不影响业务逻辑,先记录下,后期找到了再解决。

已解决

EXISTS内的条件拼错了,想找不等于 1和2的,用的是OR,把OR换成AND就可以了;

错误示范

SELECT * FRON TABLE A WHERE 
	NOT EXISTS (SELECT * FROM TABLE B 
						WHERE NUMBER != '1' OR NUMBER != '2' 
											AND  = );

正确示范

SELECT * FRON TABLE A WHERE 
	NOT EXISTS (SELECT * FROM TABLE B 
						WHERE NUMBER  != '1' AND NUMBER != '2' 
											AND  = );

相关文章