Какая разница, если я использую операторы OR вместо IN в SQL - PullRequest
0 голосов
/ 30 июня 2018

Какая разница, если я использую, winner IN ('Subject1','Subject2'); & winner='Subject1' OR winner='Subject2';

Запросы для таблицы 17 по ссылке ниже:

https://www.w3resource.com/sql-exercises/sql-retrieve-from-table.php#SQLEDITOR

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Если в рассматриваемом столбце есть индекс, IN значительно превосходит OR. Опыт показывает, что БД постоянно не использует индекс, когда в столбце есть OR.

Если в рассматриваемом столбце есть индекс нет , IN превосходит OR, если список длиннее примерно 5 (несколько последовательных сравнений быстрее выполнить, чем обход небольшого BTree) значений, в которые БД превращает список для выполнения).

IN также предпочтительнее для удобочитаемости и избегания ловушки приоритета оператора SQL, если скобки опущены, то есть x = a or x = b and c = d анализируется как x = a or (x = b and c = d) вместо (возможно) ожидаемого (x = a or x = b) and c = d.

0 голосов
/ 01 июля 2018

Осторожно при использовании НЕ:

select col1 from
(
select 1 as col1
union all
select 2 as col1
union all
select 3 as col1
union all
select 4 as col1
)x
where x.col1 NOT IN (2,3,4) ;
----------
col1
1

Тем не менее

select col1 from
(
select 1 as col1
union all
select 2 as col1
union all
select 3 as col1
union all
select 4 as col1
)x
where x.col1 != 2 OR x.col1 != 3 OR x.col1 != 4 ;

---
col1
1
2
3
4
0 голосов
/ 30 июня 2018

Для списков с двумя элементами это не имеет значения.

Однако MySQL оптимизирует IN, когда список состоит из константных выражений. Он в основном сортирует их и выполняет двоичный поиск по списку. Это может быть значительной экономией с более длинными списками. Как объясняет документация :

Если все значения являются константами, они оцениваются в соответствии с типом из expr и отсортировано. Поиск элемента затем выполняется с помощью бинарный поиск. Это означает, что IN очень быстрый, если список значений IN состоит полностью из констант.

Как правило, IN безопаснее и лучше выполняет захват нужного столбца. Очень легко принять такие условия:

where winner = 'Subject1' OR winner = 'Subject2'

и добавить еще одно условие:

where winner = 'Subject1' or winner = 'Subject2' and
      foo = 'bar'

и эта логика, вероятно, уже не та, которую вы действительно хотите - потому что она действительно означает:

where winner = 'Subject1' or
      (winner = 'Subject2' and foo = 'bar')

Этого не происходит с IN:

where winner in ('Subject1', 'Subject2') and
      foo = 'bar'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...