我正在使用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')
我试过运行这个,它似乎正在工作。只是想确保第二种做事方式不会以我想不到的方式返回错误数据。
感谢您的任何见解和帮助!
我建议使用括号来清楚地分组搜索条件的顺序。
你的第二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
运算符比使用 OR
执行速度快得多。
AND
在SQL中优先于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
语句不会影响输出,当然也不会影响性能,因此更多的是编码风格和优雅的问题。
使用 IN
而不是 =
。
SELECT DISTINCT *
FROM table
WHERE something IN ('this', 'that', 'other') AND
thingamajig IN ('one', 'two')
IN
与OR
类似,因此性能相同。第二个查询会产生语法错误。因为IN
子句中只允许使用comma
。
SELECT DISTINCT *
FROM table
WHERE something = ('this' OR 'that' OR 'other')
AND thingamajig = ('one' OR 'two')
你也可以像这样使用UNIONs:
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
这样,调试就更容易;)