Какая разница, если я использую операторы OR вместо IN в SQL

0

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

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

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

  • 1
    Выражение читается по-разному. Кроме этого: нет.
  • 0
    Я не знаком с MySQL, но с IN вы, вероятно, можете использовать таблицу, например, winner IN (SELECT columnX FROM tableY WHERE somePredicate) .
Показать ещё 1 комментарий
Теги:

3 ответа

2

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

Однако 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'
  • 0
    Не верьте своему утверждению and the logic is not longer what you really want. очень ясно. Пришлось пару раз прочитать его самому, чтобы понять, о чем ты говоришь.
1

Если есть индекс в рассматриваемой колонке, 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.

0

Осторожно при использовании 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню