Подтвердить что ты не робот

Разный подход использования предложения 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 в запросах.

4b9b3361

Ответ 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.