一、运算符优先级金字塔(从高到低)
1. 最高优先级运算符
运算符 | 描述 |
---|---|
! | 逻辑非 |
~ | 位取反 |
-(负号) | 单目负号 |
2. 算术运算符
运算符 | 描述 |
---|---|
^ | 幂运算(MySQL特有) |
* / / / % | 乘 / 除 / 取模 |
+ / - | 加 / 减 |
3. 位移动运算符
运算符 | 描述 |
---|---|
<< | 位左移 |
>> | 位右移 |
4. 位运算符
运算符 | 描述 |
---|---|
& | 位与 |
| | 位或 |
运算符 | 描述 |
---|---|
= , <=> , >= , > , <= , < , <> , != | 各种比较 |
IS , LIKE , REGEXP , IN | 特殊比较 |
BETWEEN , CASE , WHEN , THEN , ELSE | 范围判断和条件表达式 |
6. 逻辑运算符
运算符 | 描述 |
---|---|
NOT | 逻辑非 |
AND , && | 逻辑与 |
XOR | 逻辑异或 |
OR , || | 逻辑或 |
7. 最低优先级运算符
运算符 | 描述 |
---|---|
= | 赋值运算 |
:= | 赋值运算 |
二、常见优先级问题示例
示例1:算术与比较运算
SELECT 5 + 2 * 3 > 10; --先算2*3=6,再5+6=11,最后11>10返回1
示例2:逻辑运算顺序
SELECT NOT 1 = 0 AND 1 = 1; --等价于(NOT (1=0)) AND (1=1)
示例3:位运算优先级
SELECT 1 | 2 & 3; --先算2&3=2,再1|2=3
三、优先级黄金法则
1. 括号最优先:任何时候不确定优先级,就用括号明确
SELECT (1 + 2) * 3; --明确先加后乘
2. 同级别从左到右:
SELECT 10 / 2 * 5; --先除后乘,结果为25
3. 特殊注意点:
`NOT`优先级高于`AND`
`AND`优先级高于`OR`
比较运算符优先级高于逻辑运算符
四、实际应用建议
1. 条件查询中的优先级:
查找价格>100且库存<10,或者折扣>0.5的商品
SELECT * FROM products WHERE (price > 100 AND stock < 10) OR discount > 0.5;
2. 计算表达式中的优先级:
正确计算加权分数
SELECT (test1 * 0.3) + (test2 * 0.7) AS total_score FROM grades;
3. 权限检查中的优先级:
检查管理员或具有特定权限的用户
SELECT * FROM users WHERE is_admin = 1 OR (permissions & 7) = 7;
五、易混淆点提醒
1. `=`的不同含义:
在最高优先级作为比较运算符
在最低优先级作为赋值运算符
2. `NOT`与`!`的区别:
`NOT`是逻辑运算符(优先级中等)
`!`是位取反(优先级最高)
3. `BETWEEN`的优先级:
高于比较运算符但低于算术运算符
SELECT * FROM table WHERE col1 + 10 BETWEEN 20 AND 30;
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程