SQL стейтмент IN

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

IN (трансл. В) — оператор-предикат ЯЗ SQL для поиска вхождений указанных значений, т.е. он определяет набор значений, в которые указанное значение может или не может быть включено.

Принцип работы

SQL стейтмент IN работает оч. просто: он определяет, совпадает ли указанное значение с каким-либо из значений во вложенным запросе или списке. В связи с этим в операторе IN указываются возможные значения вхождений или вложенные запросы, которые возвращают такие значения (один столбец строк).

Синтаксис

Шаблон:alt ttl

test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )

Аргументы

test_expression
Любое допустимое выражение в текущей СУБД.
subquery
Подзапрос с результирующим набором из одного столбца. Тип данных в столбце должен совпадать с типом данных в test_expression.
expression [ ,... n]
Список выражений для проверки на совпадение. Тип данных всех выражений должен совпадать с типом данных в test_expression.

Возвращаемое значение

Если значение test_expression равно любому значению, которое вернул subquery, или значению expression из разделенного запятыми списка, будет возвращено значение TRUE. В противном случае возвращенное значение — FALSE.

Оператор NOT IN инвертирует возвращенное значение.

Оператор NOT IN

Оператор NOT IN инвертирует функционал оператора IN. То есть список нужных (возможных, допустимых) значений, перечисленный в операторе IN инвертируется в список ненужных (недопустимых) значений. Проще говоря, в обычном режиме оператор IN перечисляет то, что надо, а NOT IN перечисляет то, что не надо.

IN и NULL

INNOT IN) не работает с NULL, поэтому стоит озаботиться, чтобы в аргументах оператора IN наверняка не было NULL. Для этого обычно для нужного поля достаточно добавить условие IS NOT NULL:

DELETE FROM tbl_1 WHERE user_id NOT IN (SELECT DISTINCT user_id FROM tbl_2 WHERE user_id IS NOT NULL);

Использование

Шаблон:alt ttl Напр., если необходимо найти всех продавцов, которые размещены в Megacity или в Metropolis, не зная оператора IN, надо использ. след. запрос:

SELECT * FROM `Salespeople` WHERE `city` = 'Megacity' OR `city` = 'Metropolis';

Результат:

SQL Execution Log
snumsnamecitycomm
1001PeelMetropolis0.12
1004MotikaMetropolis0.11
1007RifkinMegacity0.15

Имеется и более простой способ получить ту же информацию уже с помощью оператора IN:

SELECT * FROM `Salespeople` WHERE `city` IN ( 'Megacity', 'Metropolis' );

Результат:

SQL Execution Log
snumsnamecitycomm
1001PeelMetropolis0.12
1004MotikaMetropolis0.11
1007RifkinMegacity0.15

Оператор IN определяет набор значений с помощью имен членов набора, заключенных в круглые скобки, и отделенных запятыми. Он затем проверяет различные значения указанного поля, пытаясь найти совпадение со значениями из набора. Если это случается, то предикат верен. Когда набор содержит значения номеров а не символов, одиночные кавычки опускаются.

Найти всех заказчиков, относящихся к продавцам, имеющих значения snum = 1001, 1007, и 1004:

SELECT * FROM `Customers` WHERE `snum` IN ( 1001, 1007, 1004 );

Результат:

SQL Execution Log
cnumcnamecityratingsnum
2001HoffmanMetropolis1001001
2006ClemensMetropolis1001001
2008CisnerosGotham3001007
2007PereiraRockport1001004

Примеры

Этот раздел также можно назвать, или альтернативные заголовки раздела:
  • Примеры использования SQL оператора IN

Получить все строки со столбцами "roomNumber" из таблицы "classes", где столбец "name" подходит хоть под одно из значений, перечисленных в IN:

SELECT `roomNumber` FROM `classes` WHERE `name` IN ('Metropolis', 'Raccoon', 'Rapture');

Выбор всех заказчиков, которые находятся в указанных городах:

SELECT * FROM `Customers` WHERE `city` IN ('Raccoon', 'Metropolis', 'Rockport');

А теперь, которые там не находятся:

SELECT * FROM `Customers` WHERE `city` NOT IN ('Raccoon', 'Metropolis', 'Rockport');

Эта статья относится к языку SQL.