Mysql Precedence Logic - PullRequest
       27

Mysql Precedence Logic

1 голос
/ 22 августа 2011

Любые объяснения по следующим запросам:

Select x FROM y WHERE a = 1 OR a = 2  AND (b = 1 OR b = 2)

почему он не возвращает правильную информацию, тогда как это возвращает правильную информацию:

Select x FROM y WHERE (a = 1 OR a = 2) AND (b = 1 OR b = 2)

Я что-то здесь упускаю?

      X   Y   (X OR Y)  X OR Y   


      1   0     1         1 
      0   1     1         1
      1   1     1         1
      0   0     0         0 

Я знаю, что с точки зрения приоритета () имеет приоритет, но зачем мне добавлять их в первую часть запроса?

Поправь меня, если я ошибаюсь

Спасибо

Ответы [ 3 ]

3 голосов
/ 22 августа 2011

AND имеет более высокий приоритет, чем OR, поэтому ваш первый запрос эквивалентен этому:

Select x FROM y WHERE a = 1 OR a = 3 OR (a = 2  AND (b = 1 OR b = 2))

Что не эквивалентно

Select x FROM y WHERE (a = 1 OR a = 2 OR a = 3) AND (b = 1 OR b = 2)

Полагаю, вы забыли часть a = 3 в первом запросе.

Приоритет оператора в MySQL

1 голос
/ 22 августа 2011

Использование скобок в предложении WHERE не только влияет на приоритет, но и группирует предикаты вместе.В вашем примере разница в результатах больше связана с группировкой, чем с приоритетом.

Вы можете подумать об этом: (pN = предикатное выражение)

WHERE a = 1 OR a = 2  AND (b = 1 OR b = 2)

как:

WHERE p1 OR p2 AND p3

И это:

WHERE (a = 1 OR a = 2 OR a = 3) AND (b = 1 OR b = 2)

as:

WHERE p1 AND p2

, и поэтому становится ясно, что результаты могут быть совершенно разными.

1 голос
/ 22 августа 2011

Потому что двусмысленность является нежелательной чертой?

Кроме того, оптимизатор будет переупорядочивать условия WHERE, если он считает, что будет работать лучше. Поэтому ваша неоднозначность приведет к различным результатам в зависимости от того, как / что она оценивает первой.

Всегда будьте откровенны со своими намерениями.

...