Mysql 语句中的逻辑表达式未给出所需的结果



Okey,首先,让我在继续之前绘制正在使用的相关表和虚拟数据(简单的表结构来重现问题(:

|----------------------------------------------|
|users                                         |
|----------------------------------------------|
|ID | name            | email                  | 
|----------------------------------------------| 
|1  | jack jill       | jackjill@gmail.com     |
|----------------------------------------------|                  
|2  | jack jacky      | jackjacky@gmail.com    |
|----------------------------------------------|

这是正在使用的mysql查询语句:

SELECT *
FROM `users`
WHERE `ID` = 1
AND  `name` LIKE '%jacky%'
OR  `email` LIKE '%jacky%'

预期结果:第 1 行

实际结果:第 2 行

问题:

1(上述语句中的逻辑表达式是否进行短路评估?

2( 如果是(来自问题 1 (,为什么它不返回第一行作为已经计算为 TRUE 的第一个表达式。

3( 如果不是(来自问题 1(,它的计算表达式是什么,运算符优先级以什么顺序出现?

所有这些现在都在我脑海中播放,我真的很困惑它是如何评估的。即使它只是一个简单的SQL语句。如果有人能在内心深处解释这一点,真的很感激。

在 SQL 中,AND运算符优先于 OR 。因此,您可能希望用这样的括号覆盖它:

SELECT *
FROM `users`
WHERE `ID` = 1
AND  (   `name` LIKE '%jacky%'
     OR  `email` LIKE '%jacky%'
     )

在您的版本中,最后一个条件(即 email LIKE '%jacky%'(足以得到一场比赛。您可以像这样想象默认优先级:

SELECT *
FROM `users`
WHERE (     `ID` = 1
       AND  `name` LIKE '%jacky%'
      )
OR    `email` LIKE '%jacky%'

使用更正后的版本,实际上将不再匹配,因为第一行的名称字段中没有jacky,也没有电子邮件字段。

相关内容

  • 没有找到相关文章

最新更新