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