22

我想知道或/和如何工作?

例如,如果我想获取 display = 1 的所有行

我只能做WHERE tablename.display = 1

如果我想要 display = 1 或 2 的所有行

我只能做WHERE tablename.display = 1 or tablename.display = 2

但是,如果我想获取 display = 1 或 2 以及任何内容、标签或标题包含的所有行怎么办?hello world

逻辑将如何发挥作用?

Select * from tablename 
where display = 1 or display = 2 and content like "%hello world%" or tags like "%hello world%" or title = "%hello world%"

会是我的猜测。但是我可以通过几种方式阅读它。

它是否读出为:

 (display = 1 or display = 2) and (content like "%hello world%" or tags like "%hello world%" or title = "%hello world%")

或作为

((display = 1 or display = 2) and (content like "%hello world%")) or (tags like "%hello world%" or title = "%hello world%")

等等

4

4 回答 4

51

MySQL 文档有一个很好的页面,其中包含有关哪些运算符优先的信息。

从那个页面,

12.3.1. 运算符优先级

运算符优先级显示在以下列表中,从最高优先级到最低优先级。在一行中一起显示的运算符具有相同的优先级。

INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
&&, AND
XOR
||, OR
= (assignment), :=

所以你原来的查询

Select
    *
from tablename 
where
    display = 1
    or display = 2
    and content like "%hello world%"
    or tags like "%hello world%"
    or title = "%hello world%"

将被解释为

Select
    *
from tablename 
where 
    (display = 1)
    or (
        (display = 2)
        and (content like "%hello world%")
    )
    or (tags like "%hello world%")
    or (title = "%hello world%")

如有疑问,请使用括号明确您的意图。虽然 MySQL 页面上的信息很有帮助,但如果查询被重新访问,它可能不会立即显而易见。

您可能会考虑以下内容。请注意,我已将 更改title = "%hello world%"title like "%hello world%",因为这更符合您所描述的目标。

Select
    *
from tablename 
where
    (
        (display = 1)
        or (display = 2)
    ) and (
        (content like "%hello world%")
        or (tags like "%hello world%")
        or (title like "%hello world%")
    )
于 2012-09-10T05:15:34.947 回答
12

运行此查询:

select 1 or 1 and 0

如果输出为1,则表示优先级为:

select 1 or (1 and 0)

如果出来了0,那么优先级是:

select (1 or 1) and 0

剧透:它出来了1

也就是说,ANDs 在 s 之前被评估OR,或者正如我喜欢说的,AND 更粘。

于 2017-09-01T00:17:10.370 回答
3

您需要为多个OR条件使用括号。并且display = 1 OR display = 2您可以使用display IN(1,2). 试试这个:

SELECT * FROM tableName
WHERE display IN (1,2)
AND (content LIKE "%hello world%" 
OR tags LIKE "%hello world%" 
OR title LIKE "%hello world%")

有关更多信息,请查看MySQL:运算符优先级

于 2012-09-10T05:04:41.377 回答
0

在所有 SQL 服务器中,AND优先于OR,因此请记住在 s 周围加上方括号OR

select * from tablename 
where (display = 1 or display = 2)
 and (content like "%hello world%" 
      or tags like "%hello world%" 
      or title = "%hello world%")


顺便说一句(display = 1 or display = 2),相当于display in (1, 2).

于 2012-09-10T05:04:16.657 回答