조인 개념 및 구문 이해
여러 테이블의 데이터를 결합하는 가장 기본적이고 일반적인 방법은 JOIN 연산을 사용하는 것입니다. 어떤 사용자는 SELECT 문에서 JOIN을 별도의 절로 간주하지만, 다른 사용자는 FROM 절의 일부로 간주합니다. 이 모듈에서는 주로 FROM 절에 포함된 것으로 간주할 것입니다. 이 모듈에서는 T-SQL SELECT 문의 FROM 절이 쿼리의 이후 단계에서 사용될 중간 가상 테이블을 어떻게 만드는지를 알아봅니다.
FROM 절 및 가상 테이블
SQL Server가 쿼리를 처리할 때 수행되는 작업의 논리적 순서에 대해 배웠다면 SELECT 문의 FROM 절이 처리되는 첫 번째 절임을 알게 되었을 것입니다. 이 절은 쿼리를 위한 행의 원본이 될 테이블을 결정합니다. FROM은 단일 테이블을 참조하거나 쿼리를 위한 데이터 원본으로 여러 테이블을 가져올 수 있습니다. FROM 절의 역할이 가상 테이블을 만들고 채우는 것이라고 생각할 수 있습니다. 이 가상 테이블은 FROM 절의 출력을 보유하며, WHERE 절과 같이 나중에 적용되는 SELECT 문의 절에 사용됩니다. 조인 연산자와 같은 별도의 기능을 FROM 절에 추가할 때, FROM 절 요소의 목적을 가상 테이블에서 행을 추가 또는 제거하는 것으로 생각하면 도움이 됩니다.
FROM 절에서 만들어지는 가상 테이블은 논리적 엔터티뿐입니다. SQL Server에서는, WHERE 절이나 쿼리의 다른 부분에 전달될 때 FROM 절의 결과를 보관하기 위해 영구적이든 임시든 물리적 테이블이 만들어지지 않습니다.
FROM 절에서 만들어진 가상 테이블에는 조인된 모든 테이블의 데이터가 포함됩니다. 결과를 ‘집합’으로 생각하고 조인 결과를 벤 다이어그램으로 개념화하는 것이 유용할 수 있습니다.
T-SQL 언어는 지금까지 SQL 언어용 ANSI(American National Standards Institute) 표준에 대한 변경 내용을 반영하며 확장되어 왔습니다. 이러한 변경 내용이 표시되는 가장 주목할 만한 위치 중 하나는 FROM 절의 조인 구문에 있습니다. ANSI SQL-89 표준에서는 FROM 절에 여러 테이블을 쉼표로 구분된 목록에 포함하여 조인을 지정했습니다. 포함할 행을 결정하는 필터링은 다음과 같이 WHERE 절에서 수행되었습니다.
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;
이 구문은 SQL Server에서 계속 지원되지만 복잡한 조인용 필터를 표현하는 복잡성 때문에 권장되지는 않습니다. 또한 WHERE 절이 실수로 생략된 경우 ANSI SQL-89 스타일 조인은 쉽게 카티전 곱이 되고 과도한 수의 결과 행을 반환하여, 성능 문제와 함께 잘못된 결과가 발생할 수 있습니다.
T-SQL에서 다중 테이블 쿼리를 작성하는 방법을 배울 때는 카티전 곱의 개념을 이해하는 것이 중요합니다. 수학에서 카티전 곱은 두 집합의 곱입니다. 두 요소 집합과 6개 요소 집합의 곱은 12개 요소 또는 6x2의 집합입니다. 한 집합의 모든 요소는 다른 집합의 모든 요소와 결합됩니다. 아래 예제에는 두 개의 요소가 있는 이름 집합과 세 개의 요소가 있는 제품 집합이 있습니다. 카티전 곱은 모든 이름을 모든 제품과 결합하여 6개의 요소를 생성합니다.
데이터베이스에서 카티전 곱은 한 테이블의 모든 행을 다른 테이블의 모든 행과 결합한 결과입니다. 행이 10개인 테이블과 행이 100개인 테이블의 곱은 행이 1,000개 있는 결과 집합입니다. JOIN 연산의 기본 결과는 카티전 곱이지만 대부분의 T-SQL 쿼리에서 카티전 곱은 원하는 결과가 아닙니다. T-SQL에서 카티전 곱은 관계를 고려하지 않은 채 두 입력 테이블이 조인될 때 발생합니다. 관계에 대한 정보가 없으면 SQL Server 쿼리 프로세서는 가능한 모든 행 결합을 반환합니다. 이 결과에는 테스트 데이터 생성과 같은 몇 가지 실용적인 응용 방법이 있을 수 있지만, 일반적으로 유용하지 않으며 성능에 심각한 영향을 미칠 수 있습니다.
ANSI SQL-92 표준의 등장에 따라 키워드 JOIN과 ON 절에 대한 지원이 추가되었습니다. T-SQL도 이 구문을 지원합니다. 조인은 FROM 절에서 적절한 JOIN 연산자를 사용하여 표현됩니다. 필터 조건자가 되는 테이블 간의 논리적 관계는 ON 절에 지정됩니다.
다음 예제에서는 이전 쿼리를 최신 구문으로 다시 설명합니다.
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
ON p.ProductModelID = m.ProductModelID;
참고
ANSI SQL-92 구문을 사용하면 실수로 카티전 곱을 만드는 것이 더 어려워집니다. 키워드 JOIN이 추가되면 JOIN이 CROSS JOIN으로 지정되지 않는 한 ON 절이 누락될 경우 구문 오류가 발생합니다.