Mysql语句中的逻辑表达式没有给出期望的结果

时间:2017-04-15 16:46:44

标签: mysql logical-operators short-circuiting

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语句。真的很感激,如果有人能够深入解释这一点。

1 个答案:

答案 0 :(得分:2)

在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,也没有电子邮件 field。