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
,其 电子邮件 字段。
好的,首先,让我画出相关的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
,其 电子邮件 字段。