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

Logical expression in Mysql statement not giving desired result

好的,首先,让我画出相关的table和正在使用的虚拟数据,然后再进一步(简单的table结构来重现问题):

|----------------------------------------------|
|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 个问题),为什么不 return 第一行作为第一个表达式已经计算为 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%'

对于更正后的版本,实际上将不再匹配,因为第一行的 name 字段中没有 jacky,其 电子邮件 字段。