Разный подход использования предложения IN в MySql
Сегодня я отправил ответ с таким запросом
SELECT * FROM table_name where column_name IN (val1,val2,...)
Другой пользователь отправил ответ на запрос, подобный этому
SELECT * FROM table_name where val1 IN (column_name)
Как вы можете видеть здесь, позиция column_name и значения взаимозаменяемы.
Из документов Mysql
expr IN (значение,...)
Возвращает 1, если expr равно любому из значений в списке IN, else возвращает 0. Если все значения являются константами, они вычисляются в соответствии с типом выражения и сортируются. Затем поиск объекта осуществляется с помощью двоичного поиска. Это означает, что IN очень быстро, если список значений IN целиком состоит из констант.
mysql> SELECT 2 IN (0,3,5,7);
-> 0
mysql> SELECT 'wefwf' IN ('wee','wefwf','weg');
-> 1
Как ясно говорится, что приведенный выше (мой запрос) правильный. но оба вышеупомянутых запроса производят один и тот же вывод.
Также почему другой подход не указан в Документация Mysql?
Этот вопрос служит каноническим источником информации об использовании IN. Его цель - иметь подробные, высококачественные ответы, подробно описывающие правильное использование IN в запросах.
Ответы
Ответ 1
вы подняли вопрос, связанный с моим ответом здесь.
В простом объяснении с использованием этих утверждений ниже
SELECT * FROM TableName WHERE column1 IN (1, 2, 3, 4)
-- versus
SELECT * FROM TableName WHERE 1 IN (column1, column2, column3, column4)
Первый оператор включает только ONE COLUMN, который сравнивается с несколькими значениями.
SELECT *
FROM TableName
WHERE column1 = 1 OR
column1 = 2 OR
column1 = 3 OR
column1 = 4
а второй оператор VALUE, который сравнивается с несколькими столбцами.
SELECT *
FROM TableName
WHERE column1 = 1 OR
column2 = 1 OR
column3 = 1 OR
column4 = 1
который немного отличается друг от друга.
ОБНОВЛЕНИЕ 1
Здесь третья форма предложения IN
:
Ответ 2
Как отмечено в вопросе, документация MySQL дает форму предложения IN как:
expr IN (value,...)
expr
- выражение, которое может иметь только одно значение для данной строки - это значение может быть константой (например, 2), именем столбца (например, column_name
из вопроса), который будет имеют определенное значение в данной строке или любое выражение, включая функции, операторы, константы и имена столбцов, которые выдает одно значение для данной строки.
Содержимое круглых скобок - value,...
- содержит выражение, которое может быть оценено как предоставление списка значений (потенциально включающий пустой список значений, и в этом случае условие in
будет оцениваться как ложное). Этот список значений может быть:
- в виде явного ряда из одной или нескольких констант (например,
val1,val2,...
) и/или одного или нескольких однозначных имен столбцов для данной строки (например, column_name
) и/или серии выражения, каждое из которых генерирует одно значение для данной строки; или
- в виде предложения
select
, который возвращает набор значений (например, select column_name from table where ...
), который затем можно сравнить со значением expr
(непосредственно перед оператором in
).
Подводя итог: expr
должен оценивать одно значение (для данной строки), тогда как скопированный набор значений, которые должны быть сопоставлены, может быть оценен до 0, 1 или более значений.
В этом отношении MySQL работает так же, как и любой другой вариант SQL, который я использовал.
В тех случаях, когда MySQL отличается от того, что вся команда expr IN (value,...)
сама оценивает значение 0 или 1, которую MySQL обрабатывает как ложную или истинную, соответственно - в большинстве вариантов SQL все предложение будет оцениваться с помощью логического FALSE или TRUE.