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