Комбинирование различных операторов EXISTS, IN, ANY, ALL в сложных запросах

Давайте объединим использование операторов EXISTS, ANY, ALL, и IN в одном SQL-запросе.

Пример SQL-запроса

Предположим, что у нас есть две таблицы: students и courses.

  • students: содержит информацию о студентах (ID, имя и возраст).

  • courses: содержит информацию о курсах, на которые записаны студенты (ID студента и название курса).

-- Таблица students
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

-- Таблица courses
CREATE TABLE courses (
    course_id INT,
    student_id INT,
    course_name VARCHAR(100)
);

Теперь создадим запрос, который использует все операторы:

SELECT *
FROM students s
WHERE EXISTS (
    SELECT 1
    FROM courses c
    WHERE c.student_id = s.student_id
      AND c.course_name = 'Math'
)
AND age > ANY (
    SELECT age
    FROM students
    WHERE student_id IN (
        SELECT student_id
        FROM courses
        WHERE course_name = 'Physics'
    )
)
AND age < ALL (
    SELECT age
    FROM students
    WHERE student_id IN (
        SELECT student_id
        FROM courses
        WHERE course_name = 'Chemistry'
    )
);

Описание запроса

  1. EXISTS: Проверяет, существует ли хотя бы одна запись в таблице courses для студента с курсом 'Math'. Если такая запись найдена, условие EXISTS возвращает TRUE.

  2. ANY: Сравнивает возраст студента с возрастом любого студента, который записан на курс 'Physics'. Запрос выбирает тех студентов, чей возраст больше, чем у любого из студентов, записанных на 'Physics'.

  3. IN: Подзапрос используется для нахождения student_id всех студентов, записанных на курс 'Physics'. Этот список используется в операторе ANY.

  4. ALL: Проверяет, меньше ли возраст студента, чем у всех студентов, записанных на курс 'Chemistry'. Запрос выбирает только тех студентов, чей возраст меньше всех возрастов в подзапросе.

Итог

Этот запрос возвращает всех студентов, которые:

  • Записаны на курс 'Math'.

  • Их возраст больше возраста любого студента, записанного на курс 'Physics'.

  • Их возраст меньше возраста всех студентов, записанных на курс 'Chemistry'.

Этот запрос демонстрирует использование всех четырех операторов EXISTS, ANY, ALL, и IN в одном запросе для фильтрации данных на основе сложных условий.

Last updated