Sql 中 不等于'<>'与 NULL

在写SQL 条件语句是经常用到 不等于‘<>’的筛选条件,此时要注意此条件会将字段为null的数据也当做满足不等于的条件而将数据筛选掉。

例:表A

A1B1
10
21
3NULL

用 select * from A where B1<>1查询时得到的结果为:

A1B1
10
第三列 B1为空的也是会筛选掉的。

要查出第三列只需将SQL 改为 :select * from A where B1<>1 or B1 is null 即可。


开发中遇到该问题记录下

<think>好的,我现在需要回答用户关于SQL中<>运算符的用法和含义的问题。用户已经提供了一些引用内容,我需要仔细分析这些内容,并结合自己的知识来给出准确且清晰的回答。 首先,根据引用[1]和引用[2],<>运算符在SQL中的作用是“不等于”,!=相同,但可读性较差。例如,查询非汉族用户时,nation != "汉族"和nation <> "汉族"效果一样。这说明<>和!=是等价的,但用户可能更习惯使用!=。 接下来,引用[3]中提到,使用<>时只会匹配非空的记录。例如,当flag字段包含null、空和'1'时,flag <> '1'只会返回空的记录,而null会被包含。这是因为在SQL中,任何null的比较结果都是未知的(即NULL),所以null会满足<> '1'的条件。因此,用户需要注意处理NULL的情况,可能需要使用IS NULL或<=>运算符。 然后,用户提到的<=>运算符(安全等于)在引用[2]中有解释,它结合了=和IS的功能,可以处理NULL和普通。例如,sex <=> NULL或sex <=> '男'都能正确判断。过<=>的可读性较差,通常只在需要同时处理NULL和普通的情况下使用。 现在,我需要将这些信息组织成一个结构清晰的回答。首先解释<>的基本作用,然后对比!=的区别,接着讨论使用时的注意事项,特别是涉及NULL的情况,最后介绍<=>作为补充。此外,用户可能还想知道实际应用中的使用场景和示例,需要给出具体的例子,比如查询非汉族用户或处理包含NULL的字段时的情况。 用户可能存在的疑问点包括:为什么<>包含NULL?如何处理NULL?什么时候使用<>和!=?以及<=>的使用场景。因此,在回答中需要明确说明这些点,并给出解决方案,比如使用IS NULL或COALESCE函数来处理NULL。 最后,根据用户的要求生成相关问题,这些问题应该覆盖运算符的区别、NULL处理、实际应用和替代方法等方面,帮助用户进一步理解相关知识点。</think>### SQL中`<>`运算符的详解 #### 一、基本定义作用 1. **运算符功能** `<>`是SQL中的**不等于运算符**,用于判断两个表达式是否相等。其功能`!=`完全等价,但可读性较差[^1][^2]。 ```sql -- 示例:查询非汉族用户 SELECT * FROM user WHERE nation <> '汉族'; SELECT * FROM user WHERE nation != '汉族'; -- 作用相同 ``` 2. **`=`运算符的对比** - `=`用于判断相等:`WHERE age = 18` - `<>`用于判断相等:`WHERE age <> 18` --- #### 二、使用注意事项 1. **NULL的特殊性** SQL中`<>`**仅匹配非空记录**,会包含`NULL`字段。因为任何`NULL`的比较(包括`=`、`<>`)都会返回`UNKNOWN`,而非`TRUE`或`FALSE`[^3]。 ```sql -- 示例:假设flag字段有NULL、空、'1' SELECT * FROM table WHERE flag <> '1'; -- 结果仅包含空记录,包含NULL ``` 2. **处理NULL的替代方案** 若需要包含`NULL`,需显式使用`IS NULL`或`COALESCE`函数: ```sql -- 查询flag非'1'或为NULL的记录 SELECT * FROM table WHERE flag <> '1' OR flag IS NULL; -- 或使用COALESCE转为默认 SELECT * FROM table WHERE COALESCE(flag, '') <> '1'; ``` --- #### 三、`<=>`运算符的区别 1. **安全等于运算符`<=>`** - 可同时处理普通和`NULL`,相当于整合了`=`和`IS`[^2]。 - 示例: ```sql -- 查询性别为NULL或'男' SELECT * FROM user WHERE sex <=> NULL; -- 等效于sex IS NULL SELECT * FROM user WHERE sex <=> '男'; -- 等效于sex = '男' ``` 2. **适用场景对比** | 运算符 | 可处理NULL | 典型场景 | |---|---|---| | `<>` | 否 | 明确排除特定非空 | | `<=>` | 是 | 需同时判断NULL和普通 | --- #### 四、实际应用场景 1. **数据过滤** 筛选出符合条件的记录,如过滤黑名单用户: ```sql SELECT * FROM orders WHERE status <> 'cancelled'; ``` 2. **数据清洗** 排除异常或占位符(如`'N/A'`): ```sql DELETE FROM logs WHERE error_code <> 200; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值