В этом учебном пособии вы узнаете, как использовать SQLite оператор INTERSECT с синтаксисом и примерами.
Описание
SQLite оператор INTERSECT возвращает пересечение 2 или более наборов данных. Каждый набор данных определяется оператором SELECT. Если запись существует в обоих наборах данных, она будет включена в результаты INTERSECT. Однако, если запись существует в одном наборе данных, а не в другом, она будет опущена в результатах INTERSECT.
INTERSECT запрос
Пояснение: Запрос INTERSECT вернет записи в синей заштрихованной области. Это записи, которые существуют как в select1, так и в select2.
Каждый оператор SELECT в INTERSECT должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
Синтаксис
Синтаксис оператора INTERSECT в SQLite:
FROM tables
[WHERE conditions]
INTERSECT
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
Параметры или аргументы
expression1, expression2, expression_n
Столбцы или расчеты, которые вы хотите получить.
tables
Таблицы, из которых вы хотите получить записи. В операторе FROM должна быть указана хотя бы одна таблица.
WHERE conditions
Необязательный. Это условия, которые должны быть соблюдены для выбранных записей.
Примечание
- В обоих операторах SELECT должно быть одинаковое количество выражений.
- Соответствующие выражения должны иметь одинаковый тип данных в операторах SELECT. Например: expression1 должно иметь одинаковый тип данных как в первом, так и во втором операторе SELECT.
Пример - с одним выражением
Ниже приведен пример оператора INTERSECT, в котором есть одно поле с одинаковым типом данных:
1 2 3 4 5 |
SELECT department_id FROM departments INTERSECT SELECT department_id FROM employees; |
В этом примере INTERSECT, если department_id находится в таблице departments и employees, он появится в вашем результирующем наборе.
Теперь давайте усложним наш пример, добавив условия WHERE в запрос INTERSECT.
1 2 3 4 5 6 7 |
SELECT department_id FROM departments WHERE department_id >= 25 INTERSECT SELECT department_id FROM employees WHERE last_name <> 'Petrov'; |
В этом примере предложения WHERE были добавлены к каждому из наборов данных. Первый набор данных был отфильтрован таким образом, что возвращаются только те записи из таблицы departments, где department_id больше или равно 25. Второй набор данных был отфильтрован так, что возвращаются только те записи из таблицы employees, где last_name не равно 'Petrov'.
Пример - с несколькими выражениями
Далее давайте рассмотрим пример использования оператора INTERSECT в SQLite для возврата более одного столбца.
Например:
1 2 3 4 5 6 7 |
SELECT contact_id, last_name, first_name FROM contacts WHERE contact_id > 50 INTERSECT SELECT customer_id, last_name, first_name FROM customers WHERE last_name <> 'Zagoskin'; |
В этом примере INTERSECT запрос вернет записи из таблицы contacts, где значения contact_id, last_name и first_name соответствуют значениям customer_id, last_name и first_name из таблицы customers.
Существуют WHERE условия для каждого набора данных для дальнейшей фильтрации результатов, так что возвращаются только те записи из contacts, где contact_id больше 50. Записи из таблицы customers возвращаются, когда last_name не равно 'Zagoskin'.
Пример - использование ORDER BY
Ниже приведен пример INTERSECT, в котором используется оператор ORDER BY:
1 2 3 4 5 6 7 8 |
SELECT department_id, state FROM departments WHERE department_id >= 25 INTERSECT SELECT company_id, state FROM companies WHERE company_name LIKE 'G%' ORDER BY 1; |
Поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в операторе ORDER BY по их позициям в результирующем наборе. В этом примере мы отсортировали результаты по department_id / company_id в порядке возрастания, как обозначено в ORDER BY 1.
Поля department_id / company_id находятся в позиции № 1 в результирующем наборе.