Какая разница, если я использую, winner IN ('Subject1','Subject2');
& winner='Subject1' OR winner='Subject2';
Запросы для таблицы 17 в приведенной ниже ссылке:
https://www.w3resource.com/sql-exercises/sql-retrieve-from-table.php#SQLEDITOR
Для списков с двумя элементами это не имеет значения.
Однако MySQL оптимизирует IN
когда список состоит из постоянных выражений. Он в основном сортирует их и выполняет двоичный поиск по списку. Это может быть значительная экономия при использовании более длинных списков. Как поясняется в документации:
Если все значения являются константами, они вычисляются в соответствии с типом выражения и сортируются. Затем поиск объекта осуществляется с помощью двоичного поиска. Это означает, что 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'
and the logic is not longer what you really want.
очень ясно. Пришлось пару раз прочитать его самому, чтобы понять, о чем ты говоришь.
Если есть индекс в рассматриваемой колонке, IN
значительно превосходит OR
. Опыт показал мне, что db последовательно не использует индекс, когда в столбце есть OR
.
Если нет индекса в рассматриваемом столбце, IN
out-perform OR
если список длиннее, чем около 5 (быстрее выполнить несколько последовательных сравнений, чем пересечь небольшое значение BTree, то есть то, что DB превращает список в исполнение).
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
.
Осторожно при использовании NOT:
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
winner IN (SELECT columnX FROM tableY WHERE somePredicate)
.