TOP

SQL 강의 11. 고급 테이블 조합(OUTER JOIN)

이전 섹션에서는 WHERE 및 INNER JOIN 문장을 사용하여 테이블을 결합하는 가장 간단한 방법을 고려했습니다. 이러한 조합을 내부 조합 또는 등가 조합이라고 합니다. 그러나 SQL에는 테이블 조인을 위한 더 많은 옵션이 있습니다. 즉, 외부 조인, 자연 조인 및 자체 조인과 같은 다른 유형의 조인도 있습니다. 하지만 먼저 테이블에 별칭을 할당할 수 있는 방법을 고려해 보겠습니다. 나중에 필드의 전체 이름(Table.Field)을 사용해야 하기 때문에 약어 없이는 길이가 길어서 작동하기가 매우 어렵습니다.


1. 테이블 별칭(Aliases) 활용

이전 섹션에서는 별칭을 사용하여 특정 테이블 필드나 계산된 필드를 참조하는 방법을 배웠습니다. SQL을 사용하면 테이블 이름 대신 별칭을 사용할 수도 있습니다. 이는 더 짧은 SQL 구문과 같은 이점을 제공하고 SELECT 문에서 동일한 테이블을 여러 번 사용할 수 있게 해줍니다.

Run SQLSELECT Seller_name, SUM(Amount) AS Sum1 
FROM Sellers AS S, Sumproduct AS SP 
WHERE S.City = SP.City 
GROUP BY Seller_name

각 판매자별로 판매된 상품의 총액을 표시했습니다. SQL 쿼리에서는 계산된 필드 SUM(Amount)에 별칭 Sum1, 테이블 Sellers에 별칭 S, Sumproduct에 별칭 SP를 사용했습니다. 테이블 별칭은 ORDER BY, GROUP BY 등과 같은 다른 문장에서도 사용될 수 있습니다.

2. 자체 연결(SELF JOIN)

예를 생각해 봅시다. John Smith와 같은 국가에서 거래하는 판매자의 주소를 알아야 한다고 가정해 보겠습니다. 이를 위해 다음 요청을 생성합니다.

Run SQLSELECT Address, City, Country, Seller_name
FROM Sellers
WHERE Country = (SELECT Country 
                 FROM Sellers 
                 WHERE Seller_name = 'John Smith')

또한 다음 코드를 작성하여 자체 연결을 통해 이 문제를 해결할 수 있습니다.

Run SQLSELECT S1.Address, S1.City, S1.Country, S1.Seller_name
FROM Sellers AS S1, Sellers AS S2 
WHERE S1.Country = S2.Country AND S2.Seller_name = 'John Smith'

이 문제를 해결하기 위해 가명을 사용했습니다. Sellers 테이블에 처음으로 별칭 S1이 할당되었고 두 번째에는 별칭 S2가 할당되었습니다. 그런 다음 이러한 별칭을 테이블 이름으로 사용할 수 있습니다. WHERE 연산자에서는 각 필드 이름에 접두사 S1을 추가하여 DBMS가 어떤 테이블이 출력되어야 하는 필드를 이해할 수 있도록 합니다(하나의 테이블에서 두 개의 가상 테이블을 만들었기 때문입니다). WHERE 절은 먼저 테이블을 조인한 다음 Seller_name 필드로 두 번째 테이블의 데이터를 필터링하여 필요한 값만 반환합니다.

자체 조인은 외부 연산자 SELECT과 동일한 테이블에서 데이터를 선택하는 하위 쿼리를 대체하는 데 자주 사용됩니다. 최종 결과는 동일하지만 많은 DBMS 프로세스는 하위 쿼리보다 훨씬 빠르게 조인합니다. 어떤 쿼리가 더 빨리 작동하는지 확인하려면 실험해 볼 가치가 있습니다.

3. 자연스러운 조합

자연 조인은 반복되지 않는 열만 선택하는 조인입니다. 이는 일반적으로 한 테이블에 대해 (SELECT *)을 쓰고 나머지 테이블에 대한 필드 목록을 지정하여 수행됩니다. 예:

Run SQLSELECT SP.*, S.Country
FROM Sumproduct AS SP, Sellers AS S 
WHERE SP.City = S.City

이 예에서는 와일드카드(*)가 첫 번째 테이블에만 사용됩니다. 다른 모든 열은 명시적으로 지정되므로 중복된 열은 선택되지 않습니다.

4. 외부 조합(OUTER JOIN)

일반적으로 병합할 때 한 테이블의 행은 다른 테이블의 해당 행과 연결되지만, 경우에 따라 다른 테이블의 관련 행이 없는 결과 행(즉, 모든 행)을 결과 행에 포함해야 할 수도 있습니다. 한 테이블의 행이 선택되고 다른 테이블의 관련 행만 추가됩니다. 이러한 유형의 연결을 외부 연결이라고 합니다. 이를 위해 LEFT 또는 RIGHT 접두사가 붙은 키워드 OUTER JOIN ... ON ...이 사용됩니다.

이전에 새 판매자(아직 매출이 없는 Semuel Piter)를 Sellers 테이블에 추가한 예를 고려해 보겠습니다.

Run SQLSELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers2 
LEFT OUTER JOIN Sumproduct 
ON Sellers2.City = Sumproduct.City
GROUP BY Seller_name

이 요청을 통해 우리는 데이터베이스에 있는 모든 판매자 목록을 추출하고 해당 달 동안 판매된 총 상품 금액을 계산했습니다. 새 판매자인 Semuel Piter에 대한 판매가 없음을 확인합니다. 내부 조인을 사용하면 Sumproduct 테이블에 레코드가 없기 때문에 새 판매자를 볼 수 없습니다. 글을 쓰는 것뿐만 아니라 조합의 방향을 바꿀 수도 있습니다. LEFT 또는 RIGHT뿐만 아니라 단순히 테이블 순서를 변경해도 됩니다(즉, 다음 두 레코드는 동일한 결과를 제공합니다: Sellers LEFT OUTER JOIN Sumproduct 및 Sumproduct RIGHT OUTER JOIN Sellers).

또한 일부 DBMS는 *= 및 =* 기호를 사용하여 단순화된 레코드에 대한 외부 조인을 허용합니다. 이는 각각 LEFT OUTER JOIN 및 RIGHT OUTER JOIN에 해당합니다. 따라서 이전 쿼리는 다음과 같이 다시 작성될 수 있습니다.

SELECT Seller_name, SUM(Quantity) AS Qty
FROM Sellers, Sumproduct
WHERE Sellers.City *= Sumproduct.City

불행하게도 MS Access은 외부 조인에 대한 단축 레코드를 지원하지 않습니다.

5. 완전 외부 조인(FULL OUTER JOIN)

또 다른 유형의 외부 조인, 즉 두 테이블의 모든 행을 표시하고 관련될 수 있는 행만 조인하는 완전 외부 조인도 있습니다. 완전 외부 조인의 구문은 다음과 같습니다.

SELECT Seller_name, Product
FROM Sellers 
FULL OUTER JOIN Sumproduct 
ON Sellers.City = Sumproduct.City

다시 말하지만, MS Access, MySQL, SQL Server 및 Sybase DBMS에서는 완전 외부 조인이 지원되지 않습니다. 이 불의를 해결하는 방법은 다음 섹션에서 고려할 것입니다.