逻辑运算符是 SQL 中用于组合或修改条件表达式的关键工具,它们返回布尔值(TRUE=1,FALSE=0)或 NULL。以下是 MySQL 中四种逻辑运算符的详细说明和使用方法。
一、逻辑非运算符(NOT / !)
基本规则
反转操作数的逻辑值
`NOT 0` 返回 1
`NOT 非零值` 返回 0
`NOT NULL` 返回 NULL
使用示例
SELECT NOT 10, NOT(1-1), NOT -5, NOT NULL, NOT 1+1;
NOT 10 | NOT(1-1) | NOT -5 | NOT NULL | NOT 1+1 |
---|---|---|---|---|
0 | 1 | 0 | NULL | 0 |
优先级差异
`NOT` 优先级低于 `+`:`NOT 1+1` = `NOT(1+1)` = `NOT 2` = 0
`!` 优先级高于 `+`:`!1+1` = `(!1)+1` = `0+1` = 1
二、逻辑与运算符(AND / &&)
基本规则
所有操作数为真时返回真
真值表:
A | B | A AND B |
---|---|---|
非零 | 非零 | 1 |
非零 | 0 | 0 |
非零 | NULL | NULL |
0 | 任何 | 0 |
NULL | 0 | 0 |
NULL | 非零 | NULL |
使用示例
SELECT 1 AND -1, 1 AND 0, 1 AND NULL, 0 AND NULL;
1 AND -1 | 1 AND 0 | 1 AND NULL | 0 AND NULL |
---|---|---|---|
1 | 0 | NULL | 0 |
三、逻辑或运算符(OR / ||)
基本规则
任一操作数为真时返回真
真值表:
A | B | A OR B |
---|---|---|
非零 | 任何 | 1 |
0 | 非零 | 1 |
0 | 0 | 0 |
NULL | 非零 | 1 |
NULL | 0 | NULL |
NULL | NULL | NULL |
使用示例
SELECT 1 OR -1 OR 0, 1 OR 2, 1 OR NULL, 0 OR NULL, NULL OR NULL;
1 OR -1 OR 0 | 1 OR 2 | 1 OR NULL | 0 OR NULL | NULL OR NULL |
---|---|---|---|---|
1 | 1 | 1 | NULL | NULL |
四、逻辑异或运算符(XOR)
基本规则
当操作数不同时为真/假时返回真
真值表:
A | B | A XOR B |
---|---|---|
非零 | 非零 | 0 |
非零 | 0 | 1 |
非零 | NULL | NULL |
0 | 非零 | 1 |
0 | 0 | 0 |
0 | NULL | NULL |
NULL | 任何 | NULL |
使用示例
SELECT 1 XOR 1, 0 XOR 0, 1 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1;
1 XOR 1 | 0 XOR 0 | 1 XOR 0 | 1 XOR NULL | 1 XOR 1 XOR 1 |
---|---|---|---|---|
0 | 0 | 1 | NULL | 1 |
五、实际应用场景
1. 复杂条件筛选:
SELECT * FROM products WHERE (price > 100 OR stock > 50) AND NOT discontinued;
2. 权限控制:
SELECT * FROM users WHERE (admin = 1 XOR moderator = 1) AND active = 1;
3. 状态查询:
SELECT * FROM orders WHERE (status = 'shipped' OR status = 'delivered') AND NOT payment_pending;
六、重要注意事项
1. 运算符优先级(从高到低):
SQL 逻辑运算符 |
---|
! |
NOT |
AND / && |
XOR |
OR / || |
2. NULL 处理规则:
任何包含 NULL 的逻辑运算都可能返回 NULL
使用 `IS NULL` 或 `IS NOT NULL` 明确检查 NULL 值
3. 最佳实践:
使用括号明确运算顺序
保持一致的运算符风格(全部用符号或全部用单词)
复杂逻辑表达式分行书写提高可读性
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程