☘️博主介绍☘️:
✨又是一天没白过,我是奈斯,DBA一名✨
✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️
❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣️❣️❣️
哈喽各位小伙伴,大家有没有思考过一个问题,在MySQL where条件中字段与字段的连接条件,比如and、or、=、>、<、between and等这些连接条件有没有优先运算那个连接条件,后运算那个条件呢。我想有些小伙伴肯定是研究过的,但是有些小伙伴可能并没有考虑过。那么今天给大家一起探索一下在MySQL where条件中字段与字段的连接条件的优先级,说的专业一点字段与字段的连接条件就是运算符,字段与字段的连接条件的优先级就是运算符优先级。
了解运算符的优先级不仅可以帮助我们编写更加清晰、高效的SQL语句,还可以避免因为条件判断顺序不当而导致的逻辑错误。所以,无论你是MySQL的新手还是老手,相信今天的分享都会给你带来一些新的启发和收获。
官方文档中有详细描述关于运算符和运算符优先级的内容,有兴趣的小伙伴可以参考官方文档学习。不过官方文档一般晦涩难懂,所以写这篇文章的初衷就是把重要的知识点简单明了的整理出来,并且加上我的理解。
官方文档对于运算符的介绍(MySQL8.0):
MySQL :: MySQL 8.0 Reference Manual :: 14.4 Operators
目录
首先先了解一下MySQL有哪些运算符,才能更好的了解运算符的优先级。在MySQL中运算符大致分为三类比较函数和运算符、逻辑运算符、赋值运算符。
比较函数和运算符:
比较函数/运算符 | 描述 |
相等运算符 | |
大于运算符 | |
小于运算符 | |
大于或等于运算符 | |
小于或等于运算符 | |
不等运算符 | |
空安全等于运算符 | |
值是否在值的范围内 | |
值是否不在值的范围内 | |
值是否在一组值内 | |
值是否不在一组值中 | |
根据布尔值测试一个值 | |
根据布尔值测试一个值 | |
零值测试 | |
非空值测试 | |
测试参数是否为空 | |
简单模式匹配 | |
简单模式匹配的否定 | |
比较两个字符串 | |
返回第一个非空参数 | |
返回最大的参数 | |
返回小于第一个参数的参数的索引 | |
返回最小的参数 |
逻辑运算符:
运算符 | 描述 |
逻辑与 | |
否定值 | |
逻辑或 | |
逻辑异或 |
赋值运算符:
运算符 | 描述 |
赋值 | |
接下来,就来详细解析一下MySQL中这些运算符的优先级规则,并且我也会用案例的形式看看它们是如何影响我们的查询语句的。
运算符优先级:
运算符主要用于对数据进行比较或计算,并且在众多的运算符中有优先级之分。运算符优先级显示在下表中,从最高优先级到最低优先级。显示在同一行上的运算符具有相同的优先级。
INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN, MEMBER OF
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
AND, &&
XOR
OR, ||
= (assignment), :=
运算符优先级的注意事项:
1)=的优先级取决于它是用作比较运算符(=)还是用作赋值运算符(=)。当用作比较运算符时它与<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP和IN()等具有相同的优先级。当用作赋值运算符时其优先级与:=相同。
2)对于出现在表达式中同一优先级的运算符,计算从左到右进行,但赋值从右到左进行。
3)一些运算符的优先级和含义取决于SQL模式:
·默认情况下,||是一个逻辑OR运算符。启用PIPES_AS_CONCAT后,||是字符串串联,优先级在 ^ 和一元运算符之间
·默认情况下,!具有比NOT更高的优先级。启用HIGH_NOT_PRECEDENCE后!和NOT具有相同的优先级。
注意:运算符的优先级决定了表达式中项的求值顺序(一个运算符会影响运算符前后两个的条件,而不是说只影响运算符前面的条件或者只影响运算符后面的条件,参考下面案例一),如要显式覆盖此顺序并对术语进行分组,请使用括号。其实就是使用括号的先行运算,然后运行括号之后的。
案例:使用括号影响运算符的优先级
SQL> select * from jl;
SQL> select * from jl where employee_id=101 or employee_id=102 and job_id='AD_PRES'; ps运算符优先级介绍: WHERE子句中的运算符有优先级,根据运算符优先级AND运算符优先于OR运算符。所以在这个SQL语句中,AND运算符会先被执行,这意味着表达式"employee_id=102 and job_id='AD_PRES'"会率先被计算,这个表达式的结果将作为OR运算符的其中一个条件。因此,这个SQL语句的执行顺序应该是这样的: 第一步:先计算表达式"employee_id=102 and job_id='AD_PRES",即查找employee_id等于102并且job_id等于AD_PRES的记录。 第二步:再计算"employee_id=101 or (employee_id=102 and job_id='AD_PRES')",即先查找employee_id等于102并且job_id等于AD_PRES的记录,再或者employee_id等于101的数据。
如果需要先执行or运算符,那么就需要使用括号
SQL> select * from jl where (employee_id=101 or employee_id=102) and job_id='AD_PRES'; ps运算符优先级介绍: 使用了括号,那么就是使用括号的先行运算,然后运行括号之后的。因此,这个SQL语句的执行顺序应该是这样的: 第一步:先计算括号内的表达式"(employee_id=101 or employee_id=102)",即查找employee_id等于101或者employee_id等于102的记录。 第二步:再计算"(employee_id=101 or employee_id=102) and job_id='AD_PRES'",即先查找employee_id等于101或者employee_id等于102的记录,再并且job_id等于AD_PRES的记录。