Основы SQL Server: Использование SQL-соединений

В реляционных базах данных, таких как SQL Server, оператор JOIN SQL используется для запроса, связи и извлечения данных из нескольких таблиц на основе отношений между ними. Вы можете использовать оператор JOIN SQL с двумя или более таблицами, и он возвращает записи, которые имеют совпадающие значения в разных таблицах. В этом учебнике я объясню, как использовать наиболее распространенные типы JOIN SQL, включая INNER JOIN, LEFT JOIN, RIGHT JOIN и OUTER JOIN.

JOIN в SQL – это важная функция, которую следует использовать при работе с реляционными базами данных. Они выполняются главным образом с помощью оператора SELECT SQL. Более подробную информацию о начале работы с оператором SELECT T-SQL вы можете найти в моей предыдущей статье о SQL Server: Использование оператора SELECT SQL и операторов WHERE и HAVING для извлечения данных.

Реклама

INNER JOIN SQL

Операция INNER JOIN SQL создает набор результатов, объединяя строки, которые имеют совпадающие значения в двух или более таблицах. Это, вероятно, наиболее часто используемая операция JOIN в T-SQL. INNER JOIN SQL возвращает только строки с совпадающими значениями, и он используется для извлечения данных, которые присутствуют во всех таблицах.

Следующая диаграмма иллюстрирует, как работает операция SQL INNER JOIN с двумя таблицами.

How an SQL INNER JOIN operation works with two tables (Image credit: Petri/Michael Otey)

Синтаксис INNER JOIN довольно простой. В рамках вашего оператора SELECT вы указываете две таблицы для объединения и столбцы для сопоставления строк.

Давайте ближе рассмотрим две таблицы из образца базы данных AdventureWorksLT2019. Если мы используем таблицы SalesLT.Customer и SalesLT.SalesOrderHeader, мы можем использовать SQL INNER JOIN для получения заказов для клиентов в таблице SalesLT.Customer, объединяя две таблицы по столбцу CustomerID, который является общим столбцом в обоих таблицах.

Реклама

Вот T-SQL-запрос, который вы можете использовать для этого:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate 
FROM SalesLT.Customer c
INNER JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID

Вот как работает синтаксис SQL INNER JOIN:

  • Здесь вы можете видеть, что мы выбираем столбцы “CustomerID”, “FirstName” и “LastName” из таблицы SalesLT.Customer, а также столбцы “SalesOrderID” и “OrderDate” из таблицы SalesLT.SalesOrderHeader.
  • “c” и “soh” – это сокращенные псевдонимы таблицы, которые позволяют избежать необходимости всегда использовать полное имя таблицы при обращении к столбцам.
  • Мы используем ключевое слово INNER JOIN для объединения двух таблиц. Ключевое слово ON указывает столбец для объединения. Здесь это столбец “CustomerID”.

Эта запрос будет возвращать набор результатов, включающий колонки ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ и ‘OrderDate’ для каждого клиента, который оформил заказ, как видите на следующем рисунке.

The result of our SQL INNER JOIN query (Image credit: Petri/Michael Otey)

SQL LEFT JOIN

Операция SQL LEFT OUTER JOIN также создаст набор результатов, сопоставляя строки между нашими двумя предыдущими таблицами. Однако с SQL LEFT JOIN, если нет соответствующих записей в левой таблице, будут показаны записи с null-значениями.

Реклама

Это полезно, когда вы хотите включить все строки из первой таблицы и только соответствующие строки из второй таблицы, даже если нет соответствия в правой таблице. SQL LEFT OUTER JOIN вернет null-значения в колонках второй таблицы, если нет соответствия.

下图中展示了SQL LEFT OUTER JOIN操作如何应用于两个表。

How an SQL LEFT OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

Syntax for the LEFT JOIN is also quite simple. As part of the SELECT statement, you specify the two tables to join, the columns to use to match rows, and the LEFT JOIN clause.

Let’s take a closer look at two tables from the AdventureWorksLT2019 database. For example, to retrieve all customers and any orders they have, you can use the SalesLT.Customer and SalesLT.SalesOrderHeader tables and perform a LEFT JOIN as you can see in the following listing:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
LEFT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • В этом примере мы выбираем колонки ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ и ‘OrderDate’ из таблиц SalesLT.Customer и SalesLT.SalesOrderHeader.
  • Мы используем ключевое слово LEFT JOIN для связки двух таблиц и ключевое слово ON, которое мы будем использовать в столбце ‘CustomerID’ для связки двух таблиц.

Результаты этого запроса SQL LEFT JOIN you can see the results of this SQL LEFT JOIN query in the figure below.

The results of our SQL LEFT JOIN query (Image credit: Petri/Michael Otey)

Этот запрос будет возвращать набор результатов, который включает всех клиентов в таблице SalesLT.Customer, а также соответствующую информацию о заказах из таблицы SalesLT.SalesOrderHeader. Если у клиента нет никаких заказов в SalesLT.SalesOrderHeader, то колонки из этой таблицы будут null. Вы можете увидеть несколько null значений в предыдущей рисунке.

SQL RIGHT JOIN

Как можно предположить, операция SQL RIGHT OUTER JOIN по существу является обратной к LEFT OUTER JOIN. RIGHT OUTER JOIN выбирает данные из правой таблицы (Таблица 2) и соответствует эти данные с записями слева (из Таблицы 1).

RIGHT JOIN возвращает набор результатов, который включает все строки в правой таблице, даже если у них нет соответствующих строк слева. Если строка в правой таблице не имеет соответствующей строки слева, то набор результатов для столбцов слева будет null.

下図には、right JOINが2つのテーブルでどのように動作するかを説明しています。

How a right JOIN works with two tables (Image credit: Petri/Michael Otey)

私たちはこれをSalesLT.CustomerとSalesLT.SalesOrderHeaderで示すことができます。すべての注文とその対応する顧客情報を取得するには、RIGHT JOINのクエリを使用することができます。以下はその例です:

USE AdventureWorksLT2019

SELECT c.CustomerID, c.FirstName, c.LastName, soh.SalesOrderID, soh.OrderDate
FROM SalesLT.Customer c 
RIGHT JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  • В этом примере мы выбираем колонки ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ и ‘OrderDate’ из таблиц SalesLT.Customer и SalesLT.SalesOrderHeader.
  • 关键词 RIGHT JOIN用于连接这两个表,而ON关键词指定了我们是在‘CustomerID’列上连接这两个表。

这个查询将返回一个结果集,包括SalesLT.SalesOrderHeader表中的所有订单,以及相应客户信息从SalesLT.Customer表中获取(如果可用)。如果某个订单在SalesLT.Customer表中没有相应的客户,结果集中的客户列将为空。

您可能会注意到这个查询与前面的查询非常相似。然而,LEFT JOIN导致SaleOrderHeader表中有许多具有空值的行。但是,我们最后一个查询中SaleOrderHeader表中的行没有空值。

以下图表显示了我们的SQL RIGHT OUTER JOIN操作的结果。

The results of our SQL RIGHT OUTER JOIN operation (Image credit: Petri/Michael Otey)

SQL OUTER JOIN

SQL OUTER JOIN并不是最常用的连接操作类型。有时被称为FULL JOIN,OUTER JOIN查询将不仅检索匹配的行,还会检索未匹配的行。换句话说,它返回来自连接表的数据,当左右表中有一个匹配时。

如您所猜,这往往会产生比其他连接类型更大的结果集。以下图表说明了SQL OUTER JOIN如何与两个表一起工作。

How an SQL OUTER JOIN works with two tables (Image credit: Petri/Michael Otey)

I’ll give you an example of an SQL OUTER JOIN operation using the SalesLT.SalesOrderHeader and SalesLT.SalesOrderDetail tables. Here, we want to retrieve all sales orders and their associated details, including orders that don’t have any details records.

Для этого мы можем использовать полное внешнее связь (FULL OUTER JOIN). Это также вернёт любые строки SalesOrderDetail, у которых не было соответствующей строки SalesOrderHeader. В большинстве нормальных случаев все строки SalesOrderDetails должны иметь соответствующую строку SalesOrderHeader, но это может не быть так, если произошла ошибка приложения или системы, которую это поможет обнаружить.

Вот T-SQL-запрос, показывающий пример полного внешнего связывания:

USE AdventureWorksLT2019

SELECT soh.SalesOrderID, soh.OrderDate, sod.ProductID, sod.OrderQty, sod.UnitPrice
FROM SalesLT.SalesOrderHeader soh
FULL OUTER JOIN SalesLT.SalesOrderDetail sod
ON soh.SalesOrderID = sod.SalesOrderID
  • В этом примере мы выбираем колонки ‘SalesOrderID’, ‘OrderDate’, ‘ProductID’, ‘Quantity’ и ‘UnitPrice’ из таблиц SalesLT.SalesOrderHeader и SalesLT.SalesOrderDetail.
  • Мы используем ключевое слово FULL OUTER JOIN, чтобы связать две таблицы, а ключевое слово ON, чтобы указать, что колонка SalesOrderID будет использоваться для связки двух таблиц.
  • Этот запрос вернёт набор результатов, включающий все продажи заказов из SalesLT.SalesOrderHeader, а также соответствующую информацию о деталях из SalesLT.SalesOrderDetail. Он также включит все данные из SalesLT.SalesOrderDetail, а также их соответствующую информацию заголовка заказа, если она доступна.
  • Если заказ продаж не имеет никаких деталей в SalesLT.SalesOrderDetail, то эти колонки будут NULL. Если деталь не имеет соответствующего заказа в SalesLT.SalesOrderHeader, то колонки заказа будут NULL.

Результаты этого оператора FULL OUTER JOIN показаны на следующей рисунке.

The results of our FULL OUTER JOIN operation (Image credit: Petri/Michael Otey)

Основы SQL Join

В этом учебнике я рассмотрел наиболее распространенные типы объединений SQL. Я показал, как использовать INNER JOIN, LEFT JOIN, RIGHT JOIN и OUTER JOIN, и также объяснил их различия и области применения. В следующей публикации я расскажу о менее распространенных типах объединений, таких как CROSS JOIN и SELF JOIN, так что следите за обновлениями на Petri!

Связанная статья:

Source:
https://petri.com/sql-join/