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

Mysql语句中的逻辑表达式未给出所需结果,mysql,logical-operators,short-circuiting,Mysql,Logical Operators,Short Circuiting,好的,首先,让我先画出相关的表和虚拟数据,然后再继续(简单的表结构来重新生成问题): 下面是正在使用的mysql查询语句: SELECT * FROM `users` WHERE `ID` = 1 AND `name` LIKE '%jacky%' OR `email` LIKE '%jacky%' 预期结果:第1行 实际结果:第2行 问题: 1) 上述语句中的逻辑表达式是否进行短路计算 2) 如果是(来自问题1),为什么不将第一行作为已计算为TRUE的第一个表达式返回呢 3) 如果不是(

好的,首先,让我先画出相关的表和虚拟数据,然后再继续(简单的表结构来重新生成问题):

下面是正在使用的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中,
运算符的优先级高于
。因此,您可能希望用以下括号覆盖该值:

SELECT *
FROM `users`
WHERE `ID` = 1
AND  (   `name` LIKE '%jacky%'
     OR  `email` LIKE '%jacky%'
     )
SELECT *
FROM `users`
WHERE (     `ID` = 1
       AND  `name` LIKE '%jacky%'
      )
OR    `email` LIKE '%jacky%'
在您的版本中,最后一个条件(即,
电子邮件,如“%jacky%”
)足以获得匹配。您可以想象默认优先级如下所示:

SELECT *
FROM `users`
WHERE `ID` = 1
AND  (   `name` LIKE '%jacky%'
     OR  `email` LIKE '%jacky%'
     )
SELECT *
FROM `users`
WHERE (     `ID` = 1
       AND  `name` LIKE '%jacky%'
      )
OR    `email` LIKE '%jacky%'

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

在SQL中,
运算符的优先级高于
。因此,您可能希望用以下括号覆盖该值:

SELECT *
FROM `users`
WHERE `ID` = 1
AND  (   `name` LIKE '%jacky%'
     OR  `email` LIKE '%jacky%'
     )
SELECT *
FROM `users`
WHERE (     `ID` = 1
       AND  `name` LIKE '%jacky%'
      )
OR    `email` LIKE '%jacky%'
在您的版本中,最后一个条件(即,
电子邮件,如“%jacky%”
)足以获得匹配。您可以想象默认优先级如下所示:

SELECT *
FROM `users`
WHERE `ID` = 1
AND  (   `name` LIKE '%jacky%'
     OR  `email` LIKE '%jacky%'
     )
SELECT *
FROM `users`
WHERE (     `ID` = 1
       AND  `name` LIKE '%jacky%'
      )
OR    `email` LIKE '%jacky%'

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

您的数据中存在错误。你想要
y
jack
@trincot之后不,那是我真实的实时数据。在这种情况下,你不能期望与第一行匹配,即使你纠正了优先级问题。您的情况需要出现带有
y
jacky
。您的数据中有错误。你想要
y
jack
@trincot之后不,那是我真实的实时数据。在这种情况下,你不能期望与第一行匹配,即使你纠正了优先级问题。您的条件要求出现带有
y
jacky
。好的,当查看示例的第二个查询时,请让我清楚地了解它是如何运行的。我实际认为是什么,为什么它不返回第一行,因为ID已经等于1,如果它发生短路,为什么不返回第一行,并留下其余的操作数。像这样
(ID=1)和(名字像“%jacky%”和(电子邮件像“%jacky%”)
,但是如果这是你想要的,你不应该说“和”。如果具有正确的ID就足以进行匹配,则不希望添加另一个带有“AND”的条件。将其更改为“或”表示短路。然后,门仍然向其他行打开,这些行可能满足这些其他条件,并且没有ID 1。因此,它所做的只是比较返回FALSE的
(ID=1)和名称(如%jacky%')
,然后比较
(FALSE)或电子邮件(如“%jacky%”)
,最后的表达式看起来像是
(FALSE)或(TRUE)
,返回的结果是带有jacky措辞的电子邮件,对吗?好的,非常感谢。。现在很清楚了。还有一件事,这只是一个简单的问题。假设我在表中有10行数据,其中5行有name
john
,另外5行数据有name
phil
,如果我有sql
select*from name like%john%或name like%phil%
,sql驱动程序是否会首先搜索
(name like%john%)
所有数据(10),然后再次搜索
(名称如%phil%)
用于所有数据(10)单独?我指的是每一个表达式的一行一行。好的,当我们看一下例子中的第二个查询时,让我们弄清楚它到底是怎么回事,为什么它不返回第一行,因为ID已经等于1,如果它做了短路,为什么不返回第一行,并留下剩余的操作数。像这样
(ID=1)和(名称如“%jacky%”)和(电子邮件如“%jacky%”)
但如果这是您想要的,则不应说“AND”。如果具有正确的ID足以使您拥有匹配项,则您不希望添加另一个带有“AND”的条件。将其更改为“OR”对于短路。然后门仍然向其他行打开,这些行可能满足这些其他条件,并且没有ID 1。有意义。因此,它所做的只是比较
(ID=1,名称像%jacky%')
,返回FALSE,然后比较
(FALSE)或(电子邮件像“%jacky%”)
,最后得到的表达式看起来像是
(假)或(真)
并返回了真实的结果,即带有jacky措辞的电子邮件,对吗?好的,非常感谢..现在非常清楚。还有一件事,这只是一个简单的问题。假设我在表中有10行数据,其中5行有name
john
,另外5行有name
phil
,如果我有sql
se从名称%john%或名称%phil%
中选择*是否sql驱动程序将首先搜索所有数据(10),然后再分别搜索所有数据(10)?我是指每个表达式的行。