SQL 조인 사용하기: SQL Server 핵심 개념

관계형 데이터베이스에서 SQL Server와 같은 데이터베이스에서는 SQL JOIN 문을 사용하여 여러 테이블 간의 데이터 관계에 따라 데이터를 쿼리하고 연결하고 검색합니다. SQL JOIN 문을 두 개 이상의 테이블과 함께 사용할 수 있으며, 다른 테이블에서 일치하는 값이 있는 레코드를 반환합니다. 이 자습서에서는 SQL INNER JOIN, SQL LEFT JOIN, SQL RIGHT JOIN 및 SQL OUTER JOIN과 같은 가장 일반적인 SQL JOIN 유형을 사용하는 방법을 설명하겠습니다.

SQL Joins는 관계형 데이터베이스 작업 시 사용해야 하는 중요한 기능입니다. 주로 SQL SELECT 문을 사용하여 실행됩니다. 이전 SQL 서버 기사인 Using SQL SELECT and the WHERE and HAVING Clauses to Retrieve Data에서 T-SQL SELECT 문을 시작하는 방법에 대해 자세히 알아볼 수 있습니다.

광고

SQL INNER JOIN

SQL INNER JOIN 작업은 두 개 이상의 테이블에서 일치하는 값이 있는 행을 결합하여 결과 집합을 생성합니다. 이것은 T-SQL에서 가장 일반적으로 사용되는 조인 작업일 것입니다. SQL INNER JOIN은 일치하는 값이 있는 행만 반환하며, 모든 테이블에 나타나는 데이터를 검색하는 데 사용됩니다.

다음 다이어그램은 두 개의 테이블에서 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 테이블을 사용하면 두 테이블을 CustomerID 열을 기준으로 조인하여 SalesLT.Customer 테이블의 고객 주문을 검색할 수 있습니다. 이 열은 두 테이블 모두에 공통 열입니다.

광고

다음은이 작업을 수행하는 데 사용할 수있는 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의 구문이 작동하는 방식은 다음과 같습니다:

  • 여기에서 SalesLT.Customer 테이블에서 ‘CustomerID’, ‘FirstName’, ‘LastName’ 열을 선택하고 SalesLT.SalesOrderHeader 테이블에서 ‘SalesOrderID’ 및 ‘OrderDate’ 열을 선택하는 것을 볼 수 있습니다.
  • ‘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)

LEFT JOIN의 구문도 매우 간단합니다. SELECT 문의 일부로 조인할 두 개의 테이블, 행을 일치시킬 열 및 LEFT JOIN 절을 지정합니다.

AdventureWorksLT2019 데이터베이스의 두 개의 테이블을 자세히 살펴보겠습니다. 예를 들어 모든 고객과 그들이 가지고 있는 주문을 검색하려면 SalesLT.Customer 및 SalesLT.SalesOrderHeader 테이블을 사용하여 LEFT JOIN을 수행할 수 있습니다. 다음 목록에서 확인할 수 있습니다.

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
  • 이 예제에서는 SalesLT.Customer 및 SalesLT.SalesOrderHeader 테이블에서 ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ 및 ‘OrderDate’ 열을 선택합니다.
  • 우리는 두 테이블을 조인하기 위해 LEFT JOIN 키워드를 사용하고, 두 테이블을 조인하는 데 사용할 ON 키워드는 ‘CustomerID’ 열을 사용할 것입니다.

이 SQL LEFT JOIN 쿼리의 결과를 아래 그림에서 볼 수 있습니다.

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은 오른쪽 테이블(Table 2)에서 데이터를 선택하고, 이 데이터를 왼쪽 테이블(Table 1)의 행과 일치시킵니다.

RIGHT JOIN은 왼쪽 테이블과 일치하는 행이 없더라도 오른쪽 테이블의 모든 행을 포함하는 결과 집합을 반환합니다. 오른쪽 테이블의 행이 왼쪽 테이블과 일치하는 행이 없다면, 왼쪽 테이블의 열에 대한 결과 집합은 null이 됩니다.

다음 다이어그램은 두 테이블에서 RIGHT JOIN이 작동하는 방식을 보여줍니다:

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

이를 AdventuresLT2019 데이터베이스의 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
  • 이 예에서는 SalesLT.Customer 및 SalesLT.SalesOrderHeader 테이블에서 ‘CustomerID’, ‘FirstName’, ‘LastName’, ‘SalesOrderID’ 및 ‘OrderDate’ 열을 선택합니다.
  • ‘RIGHT JOIN’ 키워드는 두 테이블을 조인하는 데 사용되며, ‘ON’ 키워드는 ‘CustomerID’ 열을 기준으로 두 테이블을 조인한다는 것을 지정합니다.

이 쿼리는 SalesLT.SalesOrderHeader 테이블의 모든 주문과 SalesLT.Customer 테이블에서 사용 가능한 경우 해당 고객 정보를 포함하는 결과 집합을 반환합니다. SalesLT.Customer 테이블에 해당하는 고객이 없는 경우 결과 집합의 고객 열은 null이 됩니다.

이 쿼리가 이전 쿼리와 매우 유사하다는 것을 알 수 있습니다. 그러나 LEFT JOIN은 SaleOrderHeader 테이블에서 많은 null 값을 반환했습니다. 그러나 마지막 쿼리는 SaleOrderHeader 테이블의 행에 null 값이 없습니다.

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을 사용할 수 있습니다. 이는 SalesOrderHeader 행과 일치하지 않는 모든 SalesOrderDetail 행을 반환합니다. 대부분의 정상적인 경우 모든 SalesOrderDetails 행은 SalesOrderHearder 행과 일치해야 하지만 이것이 애플리케이션이나 시스템 오류가 발생한 경우에는 그렇지 않을 수 있으며, 이를 통해 감지할 수 있습니다.

다음은 FULL OUTER JOIN을 보여주는 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
  • 이 예제에서는 SalesLT.SalesOrderHeader 및 SalesLT.SalesOrderDetail 테이블에서 ‘SalesOrderID’, ‘OrderDate’, ‘ProductID’, ‘Quantity’ 및 ‘UnitPrice’ 열을 선택하고 있습니다.
  • 두 테이블을 조인하기 위해 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 조인 기본 원리 학습

이 튜토리얼에서는 가장 일반적인 다양한 유형의 SQL JOIN에 대해 다루었습니다. INNER JOIN, LEFT JOIN, RIGHT JOIN 및 OUTER JOIN을 사용하는 방법을 보여주었으며, 이러한 JOIN이 어떻게 다르며 어디에 사용될 수 있는지에 대해서도 설명했습니다. 다음 포스트에서는 CROSS JOIN 및 SELF JOIN과 같은 일반적이지 않은 JOIN에 대해 다룰 예정이므로 Petri를 주목해 주세요!

관련 기사:

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