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 = );