Union join sql: Difference between JOIN and UNION in SQL
Содержание
Разница между JOIN и UNION в SQL
- 2019
Как Скорпион извин�…
Please enable JavaScript
Как Скорпион извиняется?
объединяет атрибуты двух отношений для формирования результирующих кортежей, тогда как предложение UNION объединяет результат двух запросов. Давайте обсудим разницу между JOIN и UNION с помощью сравнительной таблицы, показанной ниже.
Сравнительная таблица
Основа для сравнения | ПРИСОЕДИНИТЬСЯ | UNION |
---|---|---|
основной | JOIN объединяет атрибуты кортежей, присутствующих в двух разных отношениях, которые имеют общие поля или атрибуты. | UNION объединяет кортежи отношений, которые присутствуют в запросе.![]() |
Состояние | JOIN применяется, когда два вовлеченных отношения имеют хотя бы один общий атрибут. | UNION применяется, когда число столбцов, присутствующих в запросе, одинаково и соответствующие атрибуты имеют одинаковый домен. |
Типы | ВНУТРЕННЯЯ, ПОЛНАЯ (НАРУЖНАЯ), ЛЕВАЯ РЕГИСТРАЦИЯ, ПРАВАЯ СОЕДИНЕНИЕ | СОЮЗ и СОЮЗ ВСЕХ. |
эффект | Длина результирующих кортежей больше по сравнению с длиной кортежей вовлеченных отношений. | Количество результирующих кортежей больше по сравнению с количеством кортежей, присутствующих в каждом отношении, участвующем в запросе. |
схема |
Определение JOIN
Предложение JOIN в SQL объединяет кортежи из двух отношений или таблиц, что приводит к увеличению размера кортежа. Результирующий кортеж содержит атрибуты из обоих отношений. Атрибуты объединяются на основе общих атрибутов между ними. Различные типы JOIN в SQL: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN.
INNER JOIN объединяет кортежи из обеих таблиц, если между ними существует общий атрибут. LEFT JOIN приводит ко всем кортежам левой таблицы и соответствующим кортежу из правой таблицы. RIGHT JOIN приводит ко всем кортежам из правой таблицы и соответствует только кортежу из левой таблицы. FULL OUTER JOIN приводит ко всем кортежам из обеих таблиц, хотя они имеют совпадающие атрибуты или нет.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ — то же самое, что СОЕДИНЕНИЕ. Вы также можете удалить ключевое слово INNER и просто использовать JOIN для выполнения INNER JOIN.
Определение СОЮЗА
UNION — это операция над множествами в SQL. UNON объединяет результат двух запросов. Результат UNION включает в себя кортежи обоих отношений, присутствующих в запросе. Условия, которые должны быть выполнены для объединения двух отношений:
- Два отношения должны иметь одинаковое количество атрибутов.
- Домены соответствующего атрибута должны быть одинаковыми.
Существует два типа UNION: UNION и UNION ALL . Результат, полученный с помощью UNION, не содержит дубликатов. С другой стороны, результат, полученный с помощью UNION ALL, сохраняет дубликат.
- Основное различие между JOIN и UNION состоит в том, что JOIN объединяет кортежи из двух отношений, а результирующие кортежи включают атрибуты из обоих отношений. С другой стороны, UNION объединяет результат двух запросов SELECT.
- Предложение JOIN применимо только тогда, когда два участвующих отношения имеют хотя бы один общий атрибут в обоих. С другой стороны, UNION применяется, когда два отношения имеют одинаковое количество атрибутов и домены соответствующих атрибутов одинаковы.
- Существует четыре типа РЕАГИРОВАНИЯ ВНУТРЕННЕГО РЕШЕНИЯ, ЛЕВОГО СОЕДИНЕНИЯ, ПРЯМОГО СОЕДИНЕНИЯ, ПОЛНОГО НАРУЖНОГО СОЕДИНЕНИЯ. Но есть два типа UNION, UNION и UNION ALL.
- В JOIN результирующий кортеж имеет больший размер, поскольку включает атрибуты обоих отношений.
С другой стороны, в UNION число кортежей увеличивается, в результате чего в них входит кортеж из обоих отношений, присутствующих в запросе.
Заключение:
Обе операции объединения данных используются в разных ситуациях. JOIN используется, когда мы хотим объединить атрибуты двух отношений, имеющих хотя бы один общий атрибут. UNION используется, когда мы хотим объединить кортежи двух отношений, которые присутствуют в запросе.
Как использовать соединение SQL Union
Объединение SQL чрезвычайно полезно. В отличие от других типов соединения SQL, соединение union не пытается сопоставить строку из левой исходной таблицы с какими-либо строками в правой исходной таблице. Он создает новую виртуальную таблицу, содержащую SQL-объединение всех столбцов в обеих исходных таблицах. В виртуальной таблице результатов столбцы, полученные из левой исходной таблицы, содержат все строки, которые были в левой исходной таблице. Для этих строк все столбцы, полученные из правой исходной таблицы, имеют нулевое значение.
Аналогично, столбцы, полученные из правой исходной таблицы, содержат все строки, которые были в правой исходной таблице. Для этих строк все столбцы, полученные из левой исходной таблицы, имеют нулевое значение. Таким образом, таблица, полученная в результате объединения, содержит все столбцы обеих исходных таблиц, а количество содержащихся в ней строк равно сумме количества строк в двух исходных таблицах.
В большинстве случаев результат SQL-объединения сам по себе бесполезен; он создает таблицу результатов с большим количеством нулей. Но вы можете получить полезную информацию от объединения, когда используете его в сочетании с COALESCE
выражение. Посмотрите на пример.
Предположим, вы работаете в компании, которая проектирует и производит экспериментальные ракеты. У вас в работе несколько проектов. У вас также есть несколько инженеров-конструкторов, обладающих навыками в нескольких областях. Как руководитель вы хотите знать, какие сотрудники, обладающие какими навыками, над какими проектами работали. В настоящее время эти данные разбросаны по таблицам EMPLOYEE, PROJECTS и SKILLS.
Таблица EMPLOYEE содержит данные о сотрудниках, и EMPLOYEE.EmpID
— его первичный ключ. В таблице PROJECTS есть строка для каждого проекта, над которым работал сотрудник. PROJECTS.EmpID
— это внешний ключ, который ссылается на таблицу EMPLOYEE. Таблица SKILLS показывает опыт каждого сотрудника. SKILLS.EmpID
— это внешний ключ, ссылающийся на таблицу EMPLOYEE.
Таблица EMPLOYEE содержит по одной строке для каждого сотрудника; таблица PROJECTS и таблица SKILLS содержат ноль или более строк.
В следующих таблицах приведены примерные данные.
EmpID | Имя |
1 | Фергюсон |
2 | Фрост |
3 | Тойон |
Имя проекта | EmpID |
Структура X-63 | 1 |
Структура X-64 | 1 |
Х-63 Руководство | 2 |
Х-64 Руководство | 2 |
X-63 Телеметрия | 3 |
X-64 Телеметрия | 3 |
Навык | EmpID |
Механический дизайн | 1 |
Аэродинамическая нагрузка | 1 |
Аналоговый дизайн | 2 |
Конструкция гироскопа | 2 |
Цифровой дизайн | 3 |
Дизайн RF/F | 3 |
Из таблиц видно, что Фергюсон работал над конструкцией X-63 и X-64 и имеет опыт в области механического проектирования и аэродинамических нагрузок.
Теперь предположим, что вы как менеджер хотите видеть всю информацию обо всех сотрудниках. Вы решили применить эквивалентное соединение к таблицам EMPLOYEE, PROJECTS и SKILLS:
ВЫБОР * ОТ СОТРУДНИКА E, ПРОЕКТЫ P, НАВЫКИ S ГДЕ E.EmpID = P.EmpID И E.EmpID = S.EmpID ;
Эту же операцию можно выразить как внутреннее соединение, используя следующий синтаксис:
Обе формулировки дают одинаковый результат.
E.EmpID | Имя | P.EmpID | ИмяПроекта | S.EmpID | Навык |
1 | Фергюсон | 1 | Структура Х-63 | 1 | Механический дизайн |
1 | Фергюсон | 1 | Структура Х-63 | 1 | Аэродинамическая нагрузка |
1 | Фергюсон | 1 | Структура Х-64 | 1 | Механический дизайн |
1 | Фергюсон | 1 | Структура Х-64 | 1 | Аэродинамическая нагрузка |
2 | Фрост | 2 | Х-63 Руководство | 2 | Аналоговый дизайн |
2 | Фрост | 2 | Х-63 Руководство | 2 | Конструкция гироскопа |
2 | Фрост | 2 | Х-64 Руководство | 2 | Аналоговый дизайн |
2 | Фрост | 2 | Х-64 Руководство | 2 | Конструкция гироскопа |
3 | Тойон | 3 | X-63 Телеметрия | 3 | Цифровой дизайн |
3 | Тойон | 3 | X-63 Телеметрия | 3 | Дизайн R/F |
3 | Тойон | 3 | X-64 Телеметрия | 3 | Цифровой дизайн |
3 | Тойон | 3 | X-64 Телеметрия | 3 | Дизайн R/F |
Такое расположение данных не особенно информативно. Идентификационные номера сотрудников появляются три раза, а проекты и навыки дублируются для каждого сотрудника. Итог: внутренние соединения SQL не очень подходят для ответа на этот тип вопросов. Здесь вы можете использовать SQL union join вместе с некоторыми стратегически выбранными
SELECT
, чтобы получить более подходящий результат. Вы начинаете с базового объединения SQL:
Обратите внимание, что объединение не имеет условия ON
. Он не фильтрует данные, поэтому предложение ON
не требуется. Этот оператор дает результат, показанный в следующей таблице.
E.EmpID | Имя | P.EmpID | ИмяПроекта | S.EmpID | Навык |
1 | Фергюсон | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | 1 | Структура Х-63 | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | 1 | Структура Х-64 | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | 1 | Механический дизайн |
НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | 1 | Аэродинамическая нагрузка |
2 | Фрост | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | 2 | Х-63 Руководство | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | 2 | Х-64 Наведение | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | 2 | Аналоговый дизайн |
НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | 2 | Конструкция гироскопа |
3 | Тойон | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЕ | 3 | X-63 Телеметрия | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | 3 | X-64 Телеметрия | НУЛЕВОЙ | НУЛЕВОЙ |
НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | 3 | Цифровой дизайн |
НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | НУЛЕВОЙ | 3 | Дизайн R/F |
Каждая таблица была расширена вправо или влево с помощью нулей, и эти строки с нулевым расширением были объединены. Порядок строк произвольный и зависит от реализации. Теперь вы можете массировать данные, чтобы привести их в более полезную форму.
Обратите внимание, что в таблице есть три столбца идентификаторов, два из которых пусты в любой строке. Вы можете улучшить отображение, объединив столбцы ID. Выражение COALESCE
принимает значение первого ненулевого значения в списке значений. В данном случае он принимает значение единственного ненулевого значения в списке столбцов:
ВЫБЕРИТЕ ОБЪЕДИНЕНИЕ (E.EmpID, P.EmpID, S.EmpID) КАК ИДЕНТИФИКАТОР, E.Name, P.ProjectName, S.Skill ОТ СОТРУДНИКА E СОЮЗ ПРИСОЕДИНЯЙТЕСЬ К ПРОЕКТАМ P СОЮЗ ПРИСОЕДИНЯЙТЕСЬ К НАВЫКАМ S ЗАКАЗАТЬ ПО ID ;
Предложение FROM
такое же, как и в предыдущем примере, но теперь три столбца EMP_ID
объединены в один столбец с именем ID
. Вы также упорядочиваете результат по ID
. В следующей таблице показан результат.
ID | Имя | ИмяПроекта | Навык |
1 | Фергюсон | Структура Х-63 | НУЛЕВОЙ |
1 | Фергюсон | Структура Х-64 | НУЛЕВОЙ |
1 | Фергюсон | НУЛЕВОЙ | Механический дизайн |
1 | Фергюсон | НУЛЕВОЙ | Аэродинамическая нагрузка |
2 | Фрост | Х-63 Руководство | НУЛЕВОЙ |
2 | Фрост | Х-64 Руководство | НУЛЕВОЙ |
2 | Фрост | НУЛЕВОЙ | Аналоговый дизайн |
2 | Фрост | НУЛЕВОЙ | Конструкция гироскопа |
3 | Тойон | X-63 Телеметрия | НУЛЕВОЙ |
3 | Тойон | X-64 Телеметрия | НУЛЕВОЙ |
3 | Тойон | НУЛЕВОЙ | Цифровой дизайн |
3 | Тойон | НУЛЕВОЙ | Дизайн R/F |
Каждая строка в этом результате содержит данные о проекте или навыке, но не о том и другом. Когда вы читаете результат, вы сначала должны определить, какой тип информации находится в каждой строке (проект или навык). Если
ProjectName 9Столбец 0008 имеет ненулевое значение, в строке указан проект, над которым работал сотрудник. Если столбец
Skill
не равен нулю, в строке указывается один из навыков сотрудника.
Вы можете сделать результат более ясным, добавив еще одно COALESCE
к оператору SELECT
следующим образом:
ВЫБЕРИТЕ ОБЪЕДИНЕНИЕ (E.EmpID, P.EmpID, S.EmpID) КАК ИДЕНТИФИКАТОР, E.Name, COALESCE (P.Type, S.Type) AS Type, P.ProjectName, S.Skill ОТ СОТРУДНИКА E UNION JOIN (ВЫБРАТЬ «Проект» КАК Тип, P.* ИЗ ПРОЕКТОВ) П UNION JOIN (ВЫБЕРИТЕ «Skill» AS Type, S.* ОТ НАВЫКОВ) С ЗАКАЗАТЬ ПО ID, Тип ;
В этом объединении таблица PROJECTS в предыдущем примере заменяется вложенным SELECT
, который добавляет столбец с именем P.Type
с постоянным значением «Проект»
к столбцам, поступающим из таблицы PROJECTS. Точно так же таблица SKILLS заменяется вложенным
SELECT
, который добавляет столбец с именем S.Type
с постоянным значением «Skill»
к столбцам, поступающим из таблицы SKILLS. В каждой строке P.Type
имеет значение null или 9.0007 "Проект" и S.Type
либо нулевой, либо "Навык"
.
Внешний список SELECT
указывает COALESCE
из этих двух столбцов Type
в один столбец с именем Type
. Затем вы указываете Введите
в предложении ORDER BY
, которое сортирует строки с одинаковым идентификатором в порядке, в котором все проекты располагаются первыми, а затем все навыки. Результат показан в следующей таблице.
ID | Имя | Тип | ИмяПроекта | Навык |
1 | Фергюсон | Проект | Структура Х-63 | НУЛЕВОЙ |
1 | Фергюсон | Проект | Структура Х-64 | НУЛЕВОЙ |
1 | Фергюсон | Навык | НУЛЕВОЙ | Механический дизайн |
1 | Фергюсон | Навык | НУЛЕВОЙ | Аэродинамическая нагрузка |
2 | Фрост | Проект | Х-63 Руководство | НУЛЕВОЙ |
2 | Фрост | Проект | Х-64 Руководство | НУЛЕВОЙ |
2 | Фрост | Навык | НУЛЕВОЙ | Аналоговый дизайн |
2 | Фрост | Навык | НУЛЕВОЙ | Конструкция гироскопа |
3 | Тойон | Проект | X-63 Телеметрия | НУЛЕВОЙ |
3 | Тойон | Проект | X-64 Телеметрия | НУЛЕВОЙ |
3 | Тойон | Навык | НУЛЕВОЙ | Цифровой дизайн |
3 | Тойон | Навык | НУЛЕВОЙ | Дизайн R/F |
Таблица результатов теперь представляет собой очень удобочитаемый отчет об опыте проекта и наборах навыков всех сотрудников в таблице EMPLOYEE.
Учитывая количество доступных операций SQL JOIN
, связывание данных из разных таблиц не должно быть проблемой, независимо от структуры таблиц. Вы можете быть уверены, что, если в вашей базе данных существуют необработанные данные, у SQL есть средства для их извлечения и отображения в осмысленной форме.
Разница между JOIN и UNION в SQL
Оба типа предложений в SQL. Мы используем их оба для объединения данных из двух или более двух отношений.
Существует большое различие между JOIN и UNION в SQL. С помощью предложения JOIN мы объединяем атрибуты двух заданных отношений и в результате формируем кортежи. В то время как мы используем предложение UNION, когда хотим объединить результаты, полученные из двух запросов. Они оба объединяют данные по-разному. Формат результата, который они получают, также различается. В этой статье мы углубимся в разницу между JOIN и UNION в SQL. Но давайте сначала разберемся в отдельных функциях обоих пунктов.
Что такое JOIN в SQL?
Это предложение объединяет кортежи в SQL из двух таблиц или отношений. Таким образом, предложение JOIN приводит к формированию кортежей большего размера. Этот результирующий кортеж имеет атрибуты обоих связанных отношений. Предложение JOIN объединяет их оба на основе общих атрибутов между ними. Это предложение бывает разных типов: RIGHT JOIN, LEFT JOIN, FULL OUTER JOIN и INNER JOIN.
- Тип #1 INNER JOIN — помогает объединять кортежи из двух таблиц, когда они имеют общий атрибут.
- Тип #2 FULL OUTER JOIN — объединяет кортежи из обеих таблиц. Наличие общего атрибута в данном случае не является обязательным условием.
- Тип #3 LEFT JOIN — Это предложение приводит к кортежам из левой таблицы и только к соответствующим кортежам из правой таблицы.
- Тип #4 RIGHT JOIN — Это предложение приводит к получению кортежей из правой таблицы и только соответствующих кортежей из левой таблицы.
Здесь INNER JOIN действует так же, как предложение JOIN. Таким образом, за использование этого пункта можно опустить ключевое слово INNER и напрямую используйте ключевое слово JOIN для выполнения INNER JOIN.
Что такое UNION в SQL?
Это предложение, которое мы используем для операций над множествами в SQL. Предложение UNION объединяет результат, полученный из двух запросов. Результат, сгенерированный UNION, включает кортежи из обоих отношений, присутствующих в запросе. Чтобы применить предложение UNION к двум отношениям, они должны удовлетворять обоим этим условиям:
- Оба отношения должны иметь одинаковое количество атрибутов.
- Соответствующие атрибуты должны иметь один и тот же домен.
UNION бывает двух основных типов: UNION и UNION ALL. Результат, который мы получаем с помощью предложения UNION, не имеет дубликатов. Но результаты, которые мы получаем с помощью UNION ALL, всегда сохраняют все свои дубликаты.
Разница между JOIN и UNION в SQL
Параметры | СОЕДИНЕНИЕ в SQL | ОБЪЕДИНЕНИЕ в SQL |
Основы | Предложение JOIN объединяет кортежи и их атрибуты из двух разных таблиц/отношений, если они имеют общий атрибут или поле.![]() | Предложение UNION объединяет кортежи тех отношений, которые вы найдете в запросе. |
Типы | Существует четыре основных типа предложения JOIN: LEFT, RIGHT, FULL OUTER и INNER JOIN. | Существует два основных типа предложения UNION: UNION и UNION ALL. |
Применимые условия | Мы можем использовать предложение JOIN только в том случае, если два вовлеченных в него отношения имеют один (по крайней мере) общий атрибут. | Мы можем использовать предложение UNION, когда общее количество столбцов в запросе одинаково, а соответствующий атрибут имеет аналогичный домен. |
Эффект | Результирующий кортеж, полученный после применения предложения JOIN, оказывается больше длины тех кортежей, которые мы задействовали в отношениях. | Общее количество результирующих кортежей, полученных после применения предложения UNION, всегда больше по сравнению с кортежами, присутствующими в обоих отношениях запроса.![]() |