내부 조인 사용

완료됨

T-SQL 쿼리에서 가장 빈번한 JOIN 유형은 INNER JOIN입니다. 내부 조인은 특히 매우 정규화된 데이터베이스 환경에서 많은 일반적인 비즈니스 문제를 해결하는 데 사용됩니다. 여러 테이블에 저장된 데이터를 검색하려면 INNER JOIN 쿼리를 통해 결합해야 하는 경우가 많습니다. INNER JOIN은 논리 처리 단계를 카티전 곱으로 시작하며, 조건자와 일치하지 않는 행을 모두 제거하도록 필터링됩니다.

INNER JOIN 처리

SQL Server에서 JOIN 쿼리를 논리적으로 처리하는 단계를 살펴보겠습니다. 다음 가상 예제의 줄 번호는 명확성을 위해 추가되었습니다.

1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp 
3) JOIN Sales.SalesOrder AS ord
4)      ON emp.EmployeeID = ord.EmployeeID;

알고 있겠지만, FROM 절은 SELECT 절보다 먼저 처리됩니다. 줄 2에서 시작하여 처리를 추적해 보겠습니다.

  • FROM 절은 입력 테이블 중 하나로 HR.Employee 테이블을 명시하고, 이를 emp라는 별칭으로 지정합니다.
  • 줄 3의 JOIN 연산자는 INNER JOIN(T-SQL의 기본 형식)의 사용을 반영하고 Sales.SalesOrderord 별칭이 있는 다른 입력 테이블로 지정합니다.
  • SQL Server는 이러한 테이블에서 논리 카티전 조인을 수행하고 결과를 가상 테이블로서 다음 단계로 전달합니다. (쿼리의 물리적 처리는 최적화 프로그램의 결정에 따라 실제로 카티전 곱 연산을 수행하지 않을 수 있습니다. 그러나 카티전 곱이 만들어지고 있다고 상상하는 것이 도움이 될 수 있습니다.)
  • ON 절을 사용하여 SQL Server는 가상 테이블을 필터링하여 emp 테이블의 EmployeeID 값이 ord 테이블의 EmployeeID와 일치하는 행만 유지합니다.
  • 나머지 행은 가상 테이블에 남아 있으며 SELECT 문에서 다음 단계로 전달됩니다. 이 예제에서 가상 테이블은 SELECT 절에 의해 다음에 처리되고, 지정된 두 개의 열이 클라이언트 애플리케이션에 반환됩니다.

완료된 쿼리의 결과는 직원 목록과 주문 금액입니다. 관련 주문이 없는 직원은 ON 절에 의해 필터링되었으며, HR.Employee 테이블에 맞지 않는 EmployeeID를 가진 주문도 마찬가지로 필터링되었습니다.

Employee 및 SalesOrder 집합의 일치하는 멤버를 보여 주는 벤 다이어그램

INNER JOIN 구문

INNER JOIN은 JOIN의 기본 형식이며 선택적 INNER 키워드는 JOIN 절에서 암시적입니다. 조인 형식을 혼합하고 일치시킬 때 다음 가상 예제와 같이 조인 형식을 명시적으로 지정하는 것이 유용할 수 있습니다.

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp 
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

내부 조인을 사용하여 쿼리를 작성할 때는 다음 지침을 고려하세요.

  • 테이블 별칭은 SELECT 목록뿐만 아니라 ON 절 작성에도 선호됩니다.
  • 내부 조인은 OrderID와 같은 단일 일치 열 또는 OrderIDProductID의 조합과 같은 여러 일치 특성에서 수행될 수 있습니다. 일치하는 여러 열을 지정하는 조인을 복합 조인이라고 합니다.
  • INNER JOIN의 FROM 절에 테이블이 나열되는 순서는 SQL Server 최적화 프로그램에 중요하지 않습니다. 개념적으로 조인은 왼쪽에서 오른쪽으로 계산됩니다.
  • JOIN 키워드는 FROM 목록에서 조인된 테이블의 각 쌍에 대해 한 번만 사용합니다. 두 개 테이블 쿼리의 경우 조인 하나를 지정합니다. 세 개 테이블 쿼리의 경우 JOIN을 두 번 사용합니다. 즉, 처음 두 테이블 간에 한 번 사용하고, 처음 두 테이블 간 JOIN의 출력과 세 번째 테이블 간에 다시 한번 사용합니다.

INNER JOIN 예제

다음 가상 예제에서는 Production.Product 테이블의 ProductModelID를 Production.ProductModel 테이블의 ProductModelID와 관련된 단일 일치 열에 조인을 수행합니다.

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;

다음 예제에서는 세 개 이상의 테이블을 포함하도록 내부 조인을 확장하는 방법을 보여 줍니다. Sales.SalesOrderDetail 테이블은 Production.ProductProduction.ProductModel 간의 JOIN 출력에 조인됩니다. JOIN/ON의 각 인스턴스는 가상 출력 테이블의 채우기 및 필터링을 수행합니다. SQL Server 쿼리 최적화 프로그램은 조인 및 필터링을 수행할 순서를 결정합니다.

SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
    ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;