Операторы сравнения в SQL: IN, NOT IN

Операторы сравнения IN и NOT IN в SQL используются для проверки наличия или отсутствия значения в определённом наборе значений или в результате подзапроса.

IN

Оператор IN проверяет, содержится ли значение в указанном списке значений или в результате подзапроса. Если значение присутствует в списке, то условие считается истинным.

Примеры:

Проверка в списке значений:

SELECT * FROM employees
WHERE department_id IN (1, 2, 3);

Этот запрос вернёт всех сотрудников, которые работают в отделах с идентификаторами 1, 2 или 3.

Использование с подзапросом:

SELECT * FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 100);

Этот запрос вернёт всех сотрудников, которые работают в отделах, расположенных в местоположении с идентификатором 100.

NOT IN

Оператор NOT IN проверяет, отсутствует ли значение в указанном списке значений или в результате подзапроса. Если значение не содержится в списке, то условие считается истинным.

Примеры:

Проверка в списке значений:

SELECT * FROM employees
WHERE department_id NOT IN (1, 2, 3);

Этот запрос вернёт всех сотрудников, которые не работают в отделах с идентификаторами 1, 2 или 3.

Использование с подзапросом:

SELECT * FROM employees
WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location_id = 100);

Этот запрос вернёт всех сотрудников, которые не работают в отделах, расположенных в местоположении с идентификатором 100.

Важные моменты:

  • Оба оператора используются для работы с множествами данных и позволяют сравнивать значение с несколькими возможными вариантами.

  • NULL в списке значений может повлиять на результат работы оператора NOT IN. Если в списке есть NULL, запрос с NOT IN вернёт пустой результат, потому что NULL делает результат неопределённым.

Пример проблемы с NULL:

SELECT * FROM employees
WHERE department_id NOT IN (1, 2, NULL);

Этот запрос не вернёт никаких строк, так как наличие NULL в списке делает результат неопределённым.

Чтобы избежать этой проблемы, следует явно исключить NULL значения из подзапроса:

SELECT * FROM employees
WHERE department_id NOT IN (SELECT department_id FROM departments WHERE department_id IS NOT NULL);

Используя IN и NOT IN, можно эффективно фильтровать данные, основываясь на множестве возможных значений.

Last updated