我正在使用MySQL v5.5.27。我通常会这样写这个SELECT语句:
SELECT DISTINCT *
FROM table
WHERE something = 'this'
OR something = 'that'
OR something = 'other'
AND thingamajig = 'one'
OR thingamajig = 'two'
但是这个SELECT语句会提供完全相同的结果吗?
SELECT DISTINCT *
FROM table
WHERE something = ('this' OR 'that' OR 'other')
AND thingamajig = ('one' OR 'two')
我尝试过运行此功能,似乎正在运行。只是想确保第二种做事方式不会以某种我无法想到的方式返回错误的数据。
感谢您的任何见解和帮助!
答案 0 :(得分:6)
我建议使用括号清楚地对搜索条件的顺序进行分组。
您的第二个SELECT
声明比第一个声明要清晰得多。
SELECT DISTINCT *
FROM table
WHERE something = ('this' OR 'that' OR 'other')
AND thingamajig = ('one' OR 'two')
请记住,当您有多个值时,也可以使用IN
运算符:
SELECT DISTINCT *
FROM table
WHERE something IN ('this', 'that', 'other')
AND thingamajig IN ('one', 'two')
此外,使用IN
运算符performs much faster而非使用OR
。
答案 1 :(得分:4)
AND
takes precedence超过OR
。这意味着您的第一个查询等同于:
SELECT DISTINCT *
FROM table
WHERE something = 'this'
OR something = 'that'
OR (something = 'other' AND thingamajig = 'one')
OR thingamajig = 'two'
这显然与第二个查询的结果不同,可能不是您的预期行为。
在这种情况下,您可以使用IN
,这可能会解决您的问题,但一般情况下,了解运算符优先级以便了解各种AND和OR组合的结果是很好的。
因此,要清楚,您可以将第一个查询重写为:
SELECT DISTINCT *
FROM table
WHERE (something = 'this'
OR something = 'that'
OR something = 'other')
AND (thingamajig = 'one'
OR thingamajig = 'two')
然后将它转换为使用IN
语句将对输出没有影响,并且对性能也没有任何影响,因此更多的是编码风格和优雅而不是其他任何事情。
答案 2 :(得分:2)
使用IN
代替=
。
SELECT DISTINCT *
FROM table
WHERE something IN ('this', 'that', 'other') AND
thingamajig IN ('one', 'two')
IN
与OR
类似,因此效果相同。您的第二个查询产生语法错误。因为comma
子句中只允许IN
。
SELECT DISTINCT *
FROM table
WHERE something = ('this' OR 'that' OR 'other')
AND thingamajig = ('one' OR 'two')
答案 3 :(得分:0)
你也可以使用这样的UNION:
SELECT
DISTINCT *
FROM
table
WHERE
something = ('this', 'that', 'other')
UNION
SELECT
*
FROM
table
WHERE
thingamajig IN ('one', 'two')
使用每个SELECT的标记变量可以更加“识别”您的查询...
SELECT
'FOO_CASE_1' as case
FROM
DUAL
UNION
SELECT
'FOO_CASE_2' as case
FROM
DUAL
ORDER BY
1
这样可以让您的调试更轻松;)