В этом учебном пособии вы узнаете, как использовать оператор INTERSECT с синтаксисом и примерами.
Описание
Хотя в MariaDB нет оператора INTERSECT, вы можете легко смоделировать этот тип запроса, используя условие IN или условие EXISTS. В зависимости от сложности запроса INTERSECT.
Сначала давайте объясним, что такое запрос INTERSECT. INTERSECT запрос возвращает пересечение 2 или более наборов данных. Если запись существует в обоих наборах данных, она будет включена в результаты INTERSECT. Однако, если запись существует в одном наборе данных, а не в другом, она будет опущена в результатах INTERSECT.
INTERSECT запрос
Объяснение: Запрос INTERSECT вернет записи в синей заштрихованной области. Это записи, которые существуют как в SELECT 1, так и в SELECT 2.
Синтаксис
Синтаксис оператора INTERSECT в MariaDB:
FROM tables
[WHERE conditions]
INTERSECT
SELECT expression1, expression2, .. expression_n
FROM tables
[WHERE conditions];
Параметры или аргументы
- expression1, expression2, .. expression_n
- Столбцы или вычисления, которые вы хотите получить.
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица.
- WHERE conditions
- Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны.
Примечание
- В обоих операторах SELECT должно быть одинаковое количество выражений и одинаковые типы данных.
Пример с одним выражением
Сначала давайте рассмотрим, как имитировать запрос INTERSECT в MariaDB, который имеет одно поле с одинаковым типом данных.
Если база данных поддерживает оператор INTERSECT (чего нет у MariaDB), то таким образом вы бы использовали оператор INTERSECT для возврата общих значений поля product_id из таблиц products и inventory.
1 2 3 4 5 |
SELECT product_id FROM products INTERSECT SELECT product_id FROM inventory; |
Поскольку вы не можете использовать оператор INTERSECT в MariaDB, вы будете использовать оператор IN для имитации запроса INTERSECT следующим образом:
1 2 3 |
SELECT products.product_id FROM products WHERE products.product_id IN (SELECT inventory.product_id FROM inventory); |
В этом простом примере вы можете использовать оператор IN для возврата всех значений product_id, которые существуют как в таблицах products, так и в inventory
Теперь давайте усложним наш пример, добавив условия WHERE к запросу INTERSECT.
Например, вот как INTERSECT будет выглядеть с условиями WHERE:
1 2 3 4 5 6 7 |
SELECT product_id FROM products WHERE product_id < 45 INTERSECT SELECT product_id FROM inventory WHERE quantity > 1; |
Вот как вы бы смоделировали запрос INTERSECT, используя оператор IN, и включили условия WHERE:
1 2 3 4 5 6 7 |
SELECT products.product_id FROM products WHERE products.product_id < 45 AND products.product_id IN (SELECT inventory.product_id FROM inventory WHERE inventory.quantity > 1); |
В этом примере были добавлены условия в WHERE, которые фильтруют как таблицу products, так и результаты из таблицы inventory.
Пример с несколькими выражениями
Далее давайте посмотрим, как имитировать запрос INTERSECT в MariaDB, который возвращает более одного столбца.
Во-первых, так бы вы использовали оператор INTERSECT для возврата нескольких выражений.
1 2 3 4 5 6 7 |
SELECT contact_id, last_name, first_name FROM contacts WHERE first_name <> 'Elena' INTERSECT SELECT customer_id, last_name, first_name FROM customers WHERE customer_id >= 50; |
Опять же, поскольку вы не можете использовать оператор INTERSECT в MariaDB, вы можете использовать предложение EXISTS в более сложных ситуациях для имитации запроса INTERSECT следующим образом:
1 2 3 4 5 6 7 8 9 |
SELECT contacts.contact_id, contacts.last_name, contacts.first_name FROM contacts WHERE contacts.first_name <> 'Elena' AND EXISTS (SELECT * FROM customers WHERE customers.customer_id >= 50 AND customers.customer_id = contacts.contact_id AND customers.last_name = contacts.last_name AND customers.first_name = contacts.first_name); |
В этом более сложном примере вы можете использовать оператор EXISTS для возврата нескольких выражений, которые существуют в обеих таблицах contacts, где first_name не равно 'Elena' а также таблица customers, где customer_id больше или равен 50.
Поскольку вы применяете INTERSECT, вам нужно соединить поля пересечения следующим образом:
1 2 3 |
AND customers.customer_id = contacts.contact_id AND customers.last_name = contacts.last_name AND customers.first_name = contacts.first_name |
Это соединение выполняется для того, чтобы поля customer_id, last_name и first_name из таблицы customers пересекались с полями contact_id, last_name и first_name из таблицы contacts.