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

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

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

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

Выражение читается иначе. Кроме этого: Нет.

sticky bit 30.06.2018 20:23

Я не знаком с MySQL, но с IN вы, вероятно, можете использовать таблицу, например winner IN (SELECT columnX FROM tableY WHERE somePredicate).

Andrew Morton 30.06.2018 20:34

Используйте IN, потому что 1) Меньше символов для ввода. 2) Уменьшите риск И / ИЛИ проблем при наличии других условий.

jarlh 01.07.2018 14:34
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
65
3

Ответы 3

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

Однако 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. очень четкое. Пришлось прочитать самому пару раз, чтобы понять, о чем вы говорите.

Rand Random 30.06.2018 23:18

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

Другие вопросы по теме