SQL

SQL> 테이블 조인 (JOIN)

황기하 2022. 11. 25.

SELECT문은 하나 이상의 테이블로부터 데이타를 가져올 수 있다.

복수의 테이블로부터 데이타를 가져오기 위해서는,

FROM절 뒤에 복수의 테이블을 나열하면 된다.

 

이때, 테이블들이 서로 연관을 맺고

이들로부터 특정 조건의 레코드셋들을 선별하게 되는데,

이를 테이블 조인이라 한다.

 

테이블 조인에는

Cross Join,

Inner Join,

Outer Join 등이 있으며,

 

Cross Join은

테이블A의 모든 레코드들에 대해 테이블B의 모든 레코드가 맴핑되는 것으로,

테이블A에 10개 레코드가 있고, 테이블 B에 5개 있다면,

총 10 x 5 = 50개의 레코드를 출력한다.

 

Inner Join은

테이블A의 특정 컬럼값이 테이블B의 지정 컬럼값과

일치하는 레코드만을 선별하는 경우에 사용된다.

 

Outer Join은

Inner Join과 마찬가지로 조인 조건을 만족하는 레코드들을 출력하지만,

추가로 일치하지 않는 레코드들도 함께 출력해 준다.

 

Inner Join

Inner Join은
복수 테이블들이 조인 조건을 모두 만족하는 레코드들만 선별하는 조인이다.


INNER JOIN...ON 문장을 FROM절에 사용하거나
일반 WHERE절에서 조인 조건식을 사용할 수 있다.
아래의 예제는
Orders와 OrderDetails 두 테이블을
Order ID로 조인해서 그 값이 같은 경우만 선별하여
Orders 테이블의 일부 컬럼과 OrderDetails 테이블의 컬럼들을 출력하는 예이다.

(1) Inner Join...On 문
    FROM TabA INNER JOIN TabB ON TabA.Col = TabB.Col
(2) FROM...WHERE절에서 조인 조건식 사용
     FROM TabA,TabB WHERE TabA.Col = TabB.Col

-- Orders 테이블과 OrderDetails 테이블을
-- Order ID로 조인한 예
-- 두 테이블에 동일 컬럼이 있는 경우
-- 테이블명을 명시적으로 사용한다.

SELECT Orders.ID, OrderDetails.*
FROM Orders INNER JOIN OrderDetails
ON Orders.ID = OrderDetails.ID
WHERE Orders.OrderDate >= '1/1/2012'

-- 테이블 Alias를 사용하여
-- 위의 문장을 간략히 다음처럼 표시

SELECT o.ID, d.*
FROM Orders o INNER JOIN OrderDetails d
ON o.ID = d.ID
WHERE o.OrderDate >= '1/1/2012'

 

Cross Join

Cross Join은
복수 테이블의 모든 레코드를 M x N 식으로 모두 출력하는 것으로,
만약 테이블A가 10개의 레코드가 있고,
테이블B가 5개의 레코드가 있다면, 10 x 5 레코드 즉 총 50개의 조합을 출력한다.
Cross Join은 특별한 조인 조건을 지정하지 않고,
복수 테이블명을 FROM절에 나열하면 된다.

 

SELECT * FROM Class, Scores

 

Outer Join

도시별 매출을 구하는 쿼리를 생각해 보자.
만약 100개의 도시가 있고,
각 매출 데이타에는 어떤 도시에서 매출이 일어 났는지를 기록했다고 하자.
그런데, 모든 도시에서 매출이 일어났으면 상관 없겠지만,
만약 80개의 도시에서만 매출이 일어 났다고 하면,
Inner Join을 사용하면
매출이 없는 도시들은 매출 테이블에 해당 도시가 없을 것이므로 출력되지 않을 것이다.
하지만, 경우에 따라 모든 도시를 출력하고
매출이 없는 도시는 매출란을 공란 혹은 NULL로 표시하는 것이 필요할 때가 있다.

 

이렇게 복수 테이블에 모든 조인 조건이 만족되지 않더라도
한 테이블의 모든 데이타는 출력되게 하려면 Outer Join을 사용한다.

매칭 데이타가 없는 부분은 NULL로 표시될 것이다.

Outer Join은 모든 데이타를 출력하는 테이블의 위치에 따라

Left Outer Join, Right Outer Join,

그리도 양쪽 테이블의 모든 데이타가 기본적으로 출력되는 Full Outer Join이 있다.

 

-- City명은 매출여부와 상관없이
-- 출력. 매출없는 경우 합계란은 NULL
--
SELECT c.Name, SUM(s.Total) '합계'
FROM City c LEFT OUTER JOIN Sales s
ON c.Code = s.CityCode
GROUP BY c.Name

-- Outer Join 결과 예 --

Name                 합계
-------------------  -----------
서울                   264
부산                   238
대전                   232
제주                   NULL

 

 

Self Join

Self Join이란
FROM절에 하나의 테이블을 Table Alias를 통하여 두번 참조한 후,
자신의 테이블을 마치 다른 테이블인 것 처럼 조인하는 것이다.
아래 예제는 Self Join을 통해
Emp 테이블에서 Boss가 Kim인 모든 종업원을 출력하는 예이다.

 

SELECT e.EmpID, e.Name, b.Name AS Boss
FROM Emp e, Emp b 
WHERE e.MgrId = b.EmpId
AND b.Name = 'Kim'

'SQL' 카테고리의 다른 글

SQL> 쿼리 : 서브쿼리 (Subquery)  (1) 2022.11.25
SQL> SQL 함수의 사용  (0) 2022.11.25
SQL> DECALRE : 로컬 변수 선언  (0) 2022.11.25

댓글