MySQL篇—揭秘运算符优先级背后的逻辑

☘️博主介绍☘️

✨又是一天没白过,我是奈斯,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中运算符大致分为三类比较函数和运算符、逻辑运算符、赋值运算符。

                     

比较函数和运算符:

比较函数/运算符

描述

=

相等运算符

>

大于运算符

<

小于运算符

>=

大于或等于运算符

<=

小于或等于运算符

<>或者!=

不等运算符

<=>

空安全等于运算符

BETWEEN ... AND ...

值是否在值的范围内

NOT BETWEEN ... AND ...

值是否不在值的范围内

IN()

值是否在一组值内

NOT IN()

值是否不在一组值中

IS

根据布尔值测试一个值

IS NOT

根据布尔值测试一个值

IS NULL

零值测试

IS NOT NULL

非空值测试

ISNULL()

测试参数是否为空

LIKE

简单模式匹配

NOT LIKE

简单模式匹配的否定

STRCMP()

比较两个字符串

COALESCE()

返回第一个非空参数

GREATEST()

返回最大的参数

INTERVAL()

返回小于第一个参数的参数的索引

LEAST()

返回最小的参数

            

逻辑运算符:

运算符

描述

AND或者&&

逻辑与

NOT或者!

否定值

OR或者||

逻辑或

XOR

逻辑异或

                

赋值运算符:

运算符

描述

:=

赋值

=

分配一个值(作为SET语句,或者作为SET中的子句UPDATE声明)

        


        

    接下来,就来详细解析一下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的记录。

  • 47
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈斯DBA

打赏到账,我飘啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值