选择语法 - 是“something =('this'或'that'或'other')”可以吗?

时间:2012-09-26 15:06:46

标签: mysql select syntax

我正在使用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')

我尝试过运行此功能,似乎正在运行。只是想确保第二种做事方式不会以某种我无法想到的方式返回错误的数据。

感谢您的任何见解和帮助!

4 个答案:

答案 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)

在SQL中,{p> 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')

INOR类似,因此效果相同。您的第二个查询产生语法错误。因为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

这样可以让您的调试更轻松;)