Какая разница, если я использую, winner IN ('Subject1','Subject2'); и winner='Subject1' OR winner='Subject2';
Запросы к таблице 17 по ссылке ниже:
https://www.w3resource.com/sql-exercises/sql-retrieve-from-table.php#SQLEDITOR
Я не знаком с MySQL, но с IN вы, вероятно, можете использовать таблицу, например winner IN (SELECT columnX FROM tableY WHERE somePredicate).
Используйте IN, потому что 1) Меньше символов для ввода. 2) Уменьшите риск И / ИЛИ проблем при наличии других условий.






Для списков с двумя элементами это не имеет значения.
Однако MySQL оптимизирует IN, когда список состоит из константных выражений. Он в основном сортирует их и выполняет двоичный поиск по списку. С более длинными списками это может дать значительную экономию. Как поясняет документация:
If all values are constants, they are evaluated according to the type of expr and sorted. The search for the item then is done using a binary search. This means IN is very quick if the IN value list consists entirely of constants.
В целом 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. Опыт показал мне, что база данных постоянно не использует индекс, когда в столбце есть OR.
Если в рассматриваемом столбце есть индекс нет, IN превосходит OR, если список длиннее примерно 5 (быстрее выполнить несколько последовательных сравнений, чем пройти небольшое дерево значений BT, в которое БД превращает список для исполнение).
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.
Будьте осторожны при использовании НЕ:
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
Выражение читается иначе. Кроме этого: Нет.