Возможность объединения результатов из связанных строк из нескольких таблиц является важной частью проектирования системы реляционных баз данных. В SQL Server это достигается с помощью предложения SQL join. Это характер традиционных систем реляционных баз данных, где одна таблица содержит информацию, относящуюся к другим таблицам с общим значением ключа. Используя соединение SQL, вы можете легко выполнять запросы к связанным наборам данных из нескольких таблиц с этими общими ключами.
Цель этой статьи — предоставить вам базовые знания и примеры, которые вам понадобятся для эффективного использования объединения SQL в любой среде баз данных.
Что такое SQL-соединение?
Соединение SQL — это особая форма генерации значимых данных путем объединения нескольких таблиц, связанных друг с другом с помощью «Ключа». Как правило, реляционные таблицы должны иметь уникальный столбец, и этот столбец используется для создания отношений с одной или несколькими другими таблицами. Когда вам нужен набор результатов, который включает связанные строки из нескольких таблиц, вам нужно использовать SQL-соединение в этом столбце
Различные типы соединений следующие
- Внутреннее соединение SQL
- Equi Join
- Неравное соединение (тета-соединение)
- Внешнее соединение SQL
- SQL левое соединение или левое внешнее соединение
- SQL правое соединение или правое внешнее соединение
- Полное соединение SQL или полное внешнее соединение
- SQL кросс-соединение
- Самоподключение SQL
Примечание. Ключевое слово external не обязательно. Это означает, что вы можете указать ключевое слово «external» или нет, не имеет значения для выполнения запроса.
Например,
SQL Inner Join
Самая простая и наиболее распространенная форма объединения — это внутреннее соединение SQL, которое является типом соединения по умолчанию в большинстве систем управления базами данных. Это SQL-соединение по умолчанию, которое вы получаете, когда используете само ключевое слово join.
Результат внутреннего соединения SQL включает строки из обеих таблиц, где выполняются условия соединения.
Синтаксис:
SELECT ColumnList from LeftTable L
INNER join RightTable R
ON L.Column=R.Column
Примечание. Запрос на объединение очень легко представить в виде диаграммы Венна, где каждая из таблиц представлена пересекающимися фигурами. Пересечение фигур, где таблицы перекрываются, — это строки, в которых выполняется условие. Для этой цели часто используются уникальные столбцы (ID), где условие, которое необходимо выполнить, соответствует идентификаторам строк.
Equi Присоединиться:
Равное соединение — это наиболее распространенная форма внутреннего объединения SQL, используемая на практике. Если соединение содержит оператор равенства eg =, то это равное соединение.
В следующем примере возвращаются все совпадающие имена состояний и stateProvinceID.
SELECT DISTINCT A.StateProvinceID,S.Name
FROM Person.Address A
inner join Person.StateProvince S
On A.StateProvinceID=S.StateProvinceID
Тета-присоединение (Non-equi join):
В общем, это тета-соединение используется для указания операторов или условий (предложение ON в SQL). На практике это редко используемый тип соединения. В большинстве случаев объединение будет использовать условие неравенства, например>
SELECT p1.FirstName, p2. FirstName
FROM PErson.Person p1
INNER join PErson.Person p2
ON len(p1.FirstName) > len(p2.FirstName);
SQL Self Join
Самостоятельное соединение SQL — это механизм соединения таблицы с самим собой. Вы можете использовать самостоятельное соединение, когда хотите создать результирующий набор, объединяющий записи в таблице с некоторыми другими записями из той же таблицы.
В качестве примера самостоятельного объединения SQL рассмотрим таблицу Employee, в которой перечислены менеджеры, поскольку они также являются сотрудниками, и мы хотели бы взглянуть на набор результатов, который возвращает всех сотрудников и указывает, кто является их менеджерами.
SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
emp e, emp m
WHERE e.mgr = m.empno
SQL Cross Join
Соединение CROSS возвращает все строки для всех возможных комбинаций двух таблиц. Он генерирует все строки из левой таблицы, которая затем объединяется со всеми строками из правой таблицы. Этот тип соединения также известен как декартово произведение (A * B).
Например, если левая таблица имеет 100 строк, а правая таблица имеет 100, то результат перекрестного соединения даст 10000 строк.
SELECT e.BusinessEntityID, d.Name AS Department
FROM HumanResources.Employee AS e
CROSS join HumanResources.Department AS d
Внешнее соединение SQL
При объединении таблиц с внутренним соединением SQL выходные данные возвращают только совпадающие строки из обеих таблиц. При использовании внешнего соединения SQL, он не только выведет список совпадающих строк, но и список несопоставленных строк из других таблиц.
При левом внешнем соединении SQL будут возвращены все записи из левой таблицы в предложении объединения, независимо от совпадения записей в правой таблице. В левое внешнее соединение SQL входят строки, в которых выполняется условие, а также все строки в левой таблице, где условие не выполняется. Поля из правой таблицы без совпадения будут отображаться как нулевые значения.
Синтаксис:
SELECT ColumnList from LeftTable L
LEFT join RightTable R
ON L.Column=R.Column
Where R.Column is NULL
В следующем примере объединяются две таблицы ProductProduct и SalesOrderDetail для ProductID и сохраняются несопоставленные строки из левой таблицы. Таблица Product соответствует таблице SalesOrderDetail в столбцах ProductID в каждой таблице. Все продукты, заказанные и не заказанные, отображаются в наборе результатов.
SELECT p.Name, so.SalesOrderID
FROM Production.Product p
LEFT OUTER join Sales.SalesOrderDetail so
ON p.ProductID = so.ProductID
ORDER BY p.Name ;
Правое внешнее соединение возвращает все записи в таблице справа в соединении положение, независимо от соответствия записей в таблице слева. Использование правильного внешнего соединения SQL включает в себя все строки таблицы справа. Правильное внешнее объединение SQL считается особым случаем, и многие базы данных не поддерживают правильные объединения. Как правило, правое соединение SQL можно переписать как левое соединение SQL, просто изменив порядок таблиц в запросе. В этом случае поля из левой таблицы без совпадения будут отображать нулевые значения
Синтаксис:
SELECT ColumnList from LeftTable L
RIGHT join RightTable R
ON L.Column=R.Column
Where L.Column is NULL
В следующем примере объединяются две таблицы TerritoryID (SalesTerritory) и сохраняются несопоставленные строки из правой таблицы (SalesPerson). Таблица SalesTerritory сопоставляется с таблицей SalesPerson в столбце TerritoryID в каждой таблице. Все продавцы появляются в наборе результатов, независимо от того, назначена ли им территория.
SELECT s.Name AS Territory, p.BusinessEntityID
FROM Sales.SalesTerritory s
RIGHT OUTER join Sales.SalesPerson p
ON s.TerritoryID = p.TerritoryID ;
SQL внешнего соединения , как можно было бы ожидать теперь, возвратит все строки в обеих таблицах. Если строки не совпадают в одной из таблиц, в поле будет отображаться нулевое значение. Полное внешнее объединение SQL объединяет эффекты левых объединений SQL и правых объединений SQL. Многие базы данных не поддерживают реализацию полных внешних объединений SQL
Синтаксис:
SELECT ColumnList from LeftTable L
FULL OUTER join RightTable R
ON L.Column=R.Column
В следующем примере возвращается имя продукта, соответствующее любым соответствующим заказам на продажу в таблице SalesOrderDetail из базы данных AdventureWorks2014. Он также возвращает все заказы на продажу, у которых нет продуктов, перечисленных в таблице «Продукт», и любые продукты с заказами на продажу, отличными от тех, которые перечислены в таблице «Продукт».
SELECT p.Name, s.SalesOrderID
FROM Production.Product p
FULL OUTER join Sales.SalesOrderDetail s
ON p.ProductID = s.ProductID
ORDER BY p.Name ;
Резюме
В этой статье мы обсудили большинство важных аспектов SQL-соединений. Мы также продемонстрировали несколько быстрых примеров и примеров того, как мы можем извлечь данные из связанных таблиц из базы данных Adventureworks2016 и как эти таблицы на самом деле получают эту связь с помощью этих ключей с помощью объединений SQL.
Это все на данный момент. Надеюсь, вам понравилась эта статья о соединениях SQL. Не стесняйтесь задавать любые вопросы в комментариях ниже, и счастливого присоединения!