Шаг 11 - Использование оператора EXISTS в SQLite

Оператор EXISTS

Оператор EXISTS принимает подзапрос как аргумент и возвращает: - TRUE, если подзапрос возвращает хотя бы одну строку - FALSE, если подзапрос не возвращает ни одной строки

Пример 1: Найти всех клиентов, если существует хотя бы один клиент из Парижа

SELECT customerNumber, customerName, city
FROM customers c1
WHERE EXISTS (
    SELECT 1
    FROM customers c2
    WHERE c2.city = 'Paris'
);

Результат:

cnum

customerName

city

103

Atelier graphique

Nantes

112

Signal Gift Stores

Las Vegas

114

Australian Collectors

Melbourne

Пример 2: Найти сотрудников, обслуживающих несколько клиентов

SELECT DISTINCT e.employeeNumber, e.lastName, e.firstName
FROM employees e
JOIN customers c ON e.employeeNumber = c.salesRepEmployeeNumber
WHERE EXISTS (
    SELECT 1
    FROM customers c2
    WHERE c2.salesRepEmployeeNumber = c.salesRepEmployeeNumber
    AND c2.customerNumber <> c.customerNumber
);

Результат:

empID

lastName

firstName

1002

Murphy

Diane

1056

Patterson

Mary

1076

Firrelli

Jeff

Пример 3: Найти сотрудников с только одним клиентом

SELECT e.employeeNumber, e.lastName, e.firstName
FROM employees e
WHERE EXISTS (
    SELECT 1
    FROM customers c
    WHERE c.salesRepEmployeeNumber = e.employeeNumber
    AND NOT EXISTS (
        SELECT 1
        FROM customers c2
        WHERE c2.salesRepEmployeeNumber = e.employeeNumber
        AND c2.customerNumber <> c.customerNumber
    )
);

Результат:

empID

lastName

firstName

1102

Bondur

Gerard

1166

Thompson

Leslie

Пример 4: Найти офисы, в которых есть сотрудники с клиентами

SELECT o.officeCode, o.city, o.country
FROM offices o
WHERE EXISTS (
    SELECT 1
    FROM employees e
    JOIN customers c ON e.employeeNumber = c.salesRepEmployeeNumber
    WHERE e.officeCode = o.officeCode
);

Результат:

officeCode

city

country

1

San Francisco

USA

2

Boston

USA

4

Paris

France