MySQL 中的 NOT
逻辑运算符
NOT
是 MySQL 的 逻辑运算符,用于对布尔值取反,通常用于 WHERE
子句中,与其他逻辑条件结合使用。
1. NOT
的基本用法
NOT
用于否定一个条件,常见的形式有:
SELECT * FROM users WHERE NOT age = 18;
等价于
SELECT * FROM users WHERE age <> 18;
解释:
- 查询
age
不是18
的用户。 NOT
作用在age = 18
之上,使其取反。
2. NOT
与 IS NULL
在 MySQL 中,判断 NULL
值不能使用 =
,必须用 IS NULL
,NOT
也适用于 IS NULL
:
SELECT * FROM users WHERE NOT name IS NULL;
等价于
SELECT * FROM users WHERE name IS NOT NULL;
解释:
NOT name IS NULL
表示name
不为NULL
。
3. NOT
与 LIKE
用于字符串匹配的取反:
SELECT * FROM users WHERE NOT name LIKE 'A%';
等价于
SELECT * FROM users WHERE name NOT LIKE 'A%';
解释:
NOT name LIKE 'A%'
代表查找名字不以 ‘A’ 开头的用户。
4. NOT
与 IN
NOT
也可用于 IN
,表示不属于某个集合:
SELECT * FROM users WHERE NOT age IN (18, 20, 22);
等价于
SELECT * FROM users WHERE age NOT IN (18, 20, 22);
解释:
NOT age IN (18, 20, 22)
表示age
不等于 18、20 或 22。
5. NOT
与 BETWEEN
NOT
可用于 BETWEEN
,表示不在某个范围内:
SELECT * FROM users WHERE NOT age BETWEEN 18 AND 25;
等价于
SELECT * FROM users WHERE age < 18 OR age > 25;
解释:
- 查找年龄不在 18 到 25 之间的用户。
6. NOT
与 EXISTS
NOT EXISTS
用于子查询,表示当子查询结果为空时返回 TRUE:
SELECT * FROM users u WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);
解释:
- 查找没有下过订单的用户。
7. NOT
影响 NULL
NOT
遇到 NULL
时,结果可能变成 UNKNOWN
(不确定),因为:
NULL
代表未知值,NOT NULL = 1
仍然是 NULL。
示例
SELECT NOT NULL;
结果:NULL
示例
SELECT * FROM users WHERE NOT age = NULL;
不会返回任何结果,因为 NULL
不能用 =
比较。
解决方案:使用
IS NOT NULL
SELECT * FROM users WHERE age IS NOT NULL;
8. NOT
与 AND
、OR
结合
NOT
可以和 AND
、OR
组合使用:
SELECT * FROM users WHERE NOT (age = 18 OR city = 'New York');
等价于
SELECT * FROM users WHERE age <> 18 AND city <> 'New York';
解释:
NOT (A OR B)
等价于NOT A AND NOT B
(德摩根定律)。NOT (A AND B)
等价于NOT A OR NOT B
。
9. 总结
语法 | 作用 | 说明 |
---|---|---|
NOT condition | 取反 | NOT (age = 18) → age <> 18 |
NOT IS NULL | 判断非空 | NOT name IS NULL → name IS NOT NULL |
NOT LIKE | 模糊匹配取反 | NOT name LIKE 'A%' → 名字不以 ‘A’ 开头 |
NOT IN | 集合取反 | NOT age IN (18, 20, 22) → age 不是 18/20/22 |
NOT BETWEEN | 范围取反 | NOT age BETWEEN 18 AND 25 → age < 18 OR age > 25 |
NOT EXISTS | 子查询取反 | NOT EXISTS (子查询) → 子查询为空时返回 TRUE |
✅ 重点
NOT
主要用于取反逻辑,但要小心NULL
影响。- 避免
NOT
直接作用于索引列,可能导致索引失效(如NOT age = 18
)。 NOT
与AND
、OR
结合时,遵循 德摩根定律 进行逻辑转换。
如果查询性能受影响,可以考虑优化查询方式,如 索引优化、避免 NOT
作用于索引列!🚀