引言
了不起最近在定位一个bug的时候,发现本应该过滤出15355条数据的,但其实只过滤出了12891条数据。
然后我就把sql找出来,根据debug调试的参数取到,一执行,果然结果只有12891。
代码大概就像这样的:
List<OrderAllotPackage> orderAllotPackageList = orderAllotPackageService.lambdaQuery() .ne(OrderAllotPackage::getTrackingNumber, "") .ne(OrderAllotPackage::getFulfillmentStatus, PackageFulfillStatus.DELETED.getValue()) .ne(OrderAllotPackage::getFulfillmentStatus, PackageFulfillStatus.CANCELLED.getValue()) .ne(OrderAllotPackage::getFulfillmentStatus, PackageFulfillStatus.EXCEPTION.getValue()) .ne(OrderAllotPackage::getPackageNo, "") .ne(OrderAllotPackage::getNStatus, "EXCEPTION") .ne(OrderAllotPackage::getNStatus, "FULFILLED") .ne(OrderAllotPackage::getNStatus, "SHIPPED") // .eq(OrderAllotPackage::getNStatus, "") .list();
更多细节我也不贴了,主要就是这个sql。
于是乎开始了sql一扒拉过滤条件分析,逐个删除和增加条件,排查是哪个过滤条件造成的问题。
我这里就先卖个关子,你们想一下 <> 能过滤到某个字段值为空的情况吗。
MySQL中不等于
我们在做业务筛选时,比如条件特别多的,我们只要排查某一种情况就可以用不等于。
在MySQL中,不等于的操作符是 <>或 !=,可以用于比较两个值是否不相等。
以下是使用这些操作符进行不等于比较的示例:
SELECT*FROM table_name WHERE column_name <>'value'; SELECT*FROM table_name WHERE column_name !='value';
在上述示例中,table_name是表名,column_name是要比较的列名,value是要与该列进行比较的值。
这将返回满足不等于条件的行。
建表实操
创建数据库表
CREATE TABLE test_user ( id INT PRIMARY KEY, name VARCHAR(255), age INT, hobby VARCHAR(255) );
插入数据
INSERT INTO test_user (id, name, age, hobby) VALUES (1, 'John', 25, 'Reading'), (2, 'Jane', 30, 'Sports'), (3, 'Jake', 35, NULL);
注意我这里故意插入了一个字段值为null的数据。
执行结果
我们来查询一下:
SELECT * from test_user where hobby <> ' '
SELECT * from test_user where hobby <> 'Sports'
问题反思
想必大家看了,心里都有了答案,MySQL中的不等于会排除掉字段值为null的情况。
1. 什么场景下使用不等于
- 过滤掉特定值:当我们需要排除某些特定值时,例如,筛选出不是特定分类条件下的数据
- 比较范围之外的值:如果我们要查找某个范围之外的数据,不等于操作符可以用于排除该范围内的值。
2. 使用不等于有没有什么必要条件
使用不等于操作符的必要条件取决于具体的查询需求。
如果我们需要排除特定值或比较范围之外的值,那么使用不等于操作符是有必要的。
然而,在某些情况下,可以使用其他操作符或条件语句来实现相同的效果,这取决于查询的逻辑和数据的特点。
一句话:视情况而定,没有什么是必要的。
3. 为了代码简单使用不等于未考虑字段值为Null的情况带来的影响
在MySQL中使用不等于操作符(<>)会排除掉字段值为 NULL的情况。
这是因为在MySQL中,NULL代表缺失或未知的值,与其他值的比较结果通常是未知的。
因此,使用不等于操作符时,我们需要注意是否希望包含或排除 NULL值,确保查询的准确性,而这一点在数据库设计初期和编码的时候都要去看下这个字段值的范围。
4. 可以少使用不等于
为了避免不等于操作符可能带来的问题,可以考虑以下建议,尽量减少使用不等于操作符:
- 使用其他操作符:根据具体需求,考虑使用等于操作符、范围操作符(例如 BETWEEN)、IN操作符等来替代不等于操作符。
- 使用 IS NULL或 IS NOT NULL:如果需要针对 NULL值进行比较,可以使用 IS NULL或 IS NOT NULL来明确处理 NULL值的情况。
- 使用逻辑操作符:在复杂的查询中,使用逻辑操作符(例如 AND、OR)可以更灵活地组合多个条件,避免过度依赖不等于操作符。
总结
今天了不起带着大家看了一个MySQL中不等于的实际使用,相信没用过的你也学会了,即将要用到的也希望后面能注意到这个问题。
具体使用还是不使用不等于根据业务情况来做取舍,没有什么是绝对的。