sql查询中的(not in 不在某个集合中)用法

本文详细介绍了在MyBatis中如何使用foreach标签处理参数列表,实现动态SQL的构造,具体展示了如何在serviceImpl中创建CraftQO对象,设置paramList,并通过paramdao调用paramList方法获取数据。

serviceImpl中:

                CraftQO craftQO = new CraftQO();
                List<String> paramList = paramdao.getParamList();
                craftQO.setParamList(paramList);
                List<ParamVO>list= paramdao.paramList(craftQO);


MapperXml中:

SELECT * FROM PARAM_INFO WHERE PARAM_ID NOT IN
<foreach collection="paramList" item="item" index="index" separator="," open="(" close=")">
    #{item}
</foreach>
### SQL中`IN`和`NOT IN`操作符的使用方法及区别 `IN`和`NOT IN`是SQL语言中用于子句匹配的关键字,通常在`WHERE`条件中使用。它们的主要功能是对某个字段的值是否存在于一个指定的集合中进行判断。 #### `IN` 操作符 `IN`用于检查某个字段的值是否包含在指定的集合中。如果字段的值存在于集合中,则条件为真,并返回对应的记录。语法如下: ```sql SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ..., valueN); ``` 例如,查询表A中ID为1、3或5的记录: ```sql SELECT ID, NAME FROM A WHERE ID IN (1, 3, 5); ``` `IN`也可以与子查询结合使用,用来动态生成需要匹配的集合。例如,查找表A中所有ID存在于表B中的记录: ```sql SELECT ID, NAME FROM A WHERE ID IN (SELECT AID FROM B); ``` `IN`操作符等价于多个`OR`条件的组合。虽然其语法较为简洁,但在某些情况下可能会导致性能问题,尤其是当子查询无法利用索引时,效率可能不如`EXISTS` [^1]。 #### `NOT IN` 操作符 `NOT IN`的功能与`IN`相反,它用于筛选出那些字段值不在指定集合中的记录。如果字段的值不存在于集合中,则条件为真,并返回对应的记录。语法如下: ```sql SELECT column_name(s) FROM table_name WHERE column_name NOT IN (value1, value2, ..., valueN); ``` 例如,查询表A中ID不等于1、3且不等于5的记录: ```sql SELECT ID, NAME FROM A WHERE ID NOT IN (1, 3, 5); ``` 同样,`NOT IN`也可以与子查询一起使用。例如,查找表A中所有ID不在表B中的记录: ```sql SELECT ID, NAME FROM A WHERE ID NOT IN (SELECT AID FROM B); ``` 需要注意的是,当子查询结果集中包含`NULL`值时,`NOT IN`的行为会变得不可预测。例如,在引用[^3]中提到的示例中,如果表tb1中存在`NULL`值,则可能导致查询结果不符合预期。因此,在使用`NOT IN`时,应特别注意子查询结果集中的`NULL`情况。 #### `IN` 和 `NOT IN` 的区别 - **逻辑含义**:`IN`表示字段值必须存在于指定集合中,而`NOT IN`表示字段值必须不存在于指定集合中。 - **性能表现**:在处理大量数据时,`IN`可能比`EXISTS`效率低,因为`IN`子查询有时不能有效利用索引。相比之下,`EXISTS`通常通过半连接优化来提高查询性能 [^1]。 - **对`NULL`值的处理**:`IN`对于明确的值列表能够正常工作,但如果子查询返回的结果集中包含`NULL`值,`NOT IN`可能会导致意外结果。例如,当子查询返回`(NULL, 1)`时,`NOT IN (NULL, 1)`将始终返回未知状态,从而不会选择任何记录 [^3]。 #### 示例代码 以下是一些常见的使用场景示例: 1. 使用`IN`查询特定集合中的记录: ```sql SELECT * FROM Employees WHERE DepartmentID IN (101, 102, 103); ``` 2. 使用`NOT IN`排除特定集合中的记录: ```sql SELECT * FROM Customers WHERE Country NOT IN ('USA', 'Canada'); ``` 3. 结合子查询使用`IN`: ```sql SELECT * FROM Orders WHERE CustomerID IN (SELECT ID FROM Customers WHERE Country = 'Germany'); ``` 4. 结合子查询使用`NOT IN`(需注意`NULL`值): ```sql SELECT * FROM Products WHERE CategoryID NOT IN (SELECT CategoryID FROM DiscontinuedCategories); ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值