본문 바로가기

[DB]DataBase/[SQL]

[SQL] JOIN문

728x90
반응형

JOIN문?

여러 테이블에 흩어져 있는 데이터를 연관짓기 위해 사용한다.
각 테이블에는 매칭할 수 있는 'key column'이 있어야 한다.
즉 여러 개의 테이블을 연관지어 데이터를 조합하고 하나의 테이블로 표현하기 위한 수단이다.

JOIN문의 default 값

JOIN 키워드만 사용하는 구문에 해당하는 JOIN은 'INNER JOIN'이다.

JOIN문 예시 테이블

  • TABLE1
ID FOOD
1 돈까스
2 곱창
3 삼겹살
4 치킨
   
  • TABLE2
ID FOOD
1 마라탕
2 돈까스
3 햄버거
4 곱창

JOIN문 종류

1. INNER JOIN

  • 결과는 두 테이블 A, B의 A ∩ B 와 같다.
  • 두 테이블 간의 교집합(key column)이 존재하는 경우에만 사용 가능하다.
  • 조인하려는 두 테이블명을 JOIN을 기준으로 양쪽에 쓴다.
  • 교집합이 되는 각 테이블의 컬럼명을 ON 또는 WHERE로 명시한다.
    SELECT *
    FROM TABLE1
    INNER JOIN TABLE2
    WHERE TABLE1.col = TABLE2.col
  • SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.col = TABLE2.col

1-1. THETA JOIN

  • THETA JOIN을 사용하면 theta(θ)가 나타내는 조건에 따라 두 테이블을 병합할 수 있다.
  • 모든 비교 연산자에서 작동한다.
  • JOIN 작업의 일반적인 경우를 THETA JOIN이라고 한다.

1-2. EQUI JOIN / NON-EQUI JOIN

  • EQUI JOIN (등가 조인)
    • JOIN 조건식에 '='연산자를 사용한다.
    • 주로 특정 테이블의 컬럼 정보를 알고 있고 그것에 대한 다른 테이블의 정보를 알고 싶을 때 사용한다.
  • NON-EQUI JOIN (비등가 조인)
    • JOIN 조건식에 '='연산자 이외에 비교 연산자를 사용한다.

1-3. NATURAL JOIN

  • 자연 조인은 등가 조인하는 방법 중 하나이고 비교 연산자를 사용하지 않는다.
  • 동일한 타입과 이름을 가진 컬럼을 JOIN 조건으로 이용한다.
  • 반드시 두 테이블간의 동일한 타입과 이름을 가진 컬럼이 필요하다.
  • 조인에 이용되는 컬럼은 명시하지 않아도 자동으로 사용된다.
  • 조인하는 테이블 간의 동일 컬럼이 SELECT 절에 기술되어도 테이블 이름을 생략해야 한다.
  • USING 절에는 조인 컬럼을 괄호로 묶어서 표현해야 한다.

2. OUTER JOIN

  • 두 테이블 간의 합집합, 차집합 개념이다.
  • '기준 테이블'과 '대상 테이블'이 존재한다.
    • 기준 테이블) Driving table:드라이빙 테이블, 조인 대상 테이블 중 먼저 액세스하는 테이블을 말하며 Outer table이라고도 한다.
    • 대상 테이블) Driven-to table:드리븐 테이블, 조인 대상 테이블 중 나중에 액세스하는 테이블을 말하며 Inner table 이라고도 한다.
  • 기준 테이블은 변형이 없고, 대상 테이블이 변형된다.
  • 2-1. FULL OUTER JOIN
  • 결과는 두 테이블 A, B의 A∪B 과 같다.

2-2. LEFT OUTER JOIN

  • 결과는 두 테이블 A, B의 (A ∩ B) ∪ (A - B) 와 같다.
  • 'LEFT JOIN'이라고 부르기도 한다.
  • 기준 테이블을 왼쪽에 두고 OUTER JOIN을 수행한다.

2-3. RIGHT OUTER JOIN

  • 결과는 두 테이블 A, B의 (A ∩ B) ∪ (B - A) 와 같다.
  • 'RIGHT JOIN'이라고 부르기도 한다.
  • 기준 테이블을 오른쪽에 두고 OUTER JOIN을 수행한다.

2-3. LEFT ONLY / RIGHT ONLY

 

  • 결과는 두 테이블 A, B의 (A - B) / (B - A) 와 같다.
  • 테이블 A / B를 기준으로 B / A와 맵핑 되는 컬럼이 있다면 제외하고 추출한다.

다음 예시는 'LEFT ONLY'이고, col2는 테이블 A, B의 교집합 중 B가 존재하는 컬럼이다.

SELCT *
FROM TABLE1 A
LEFT OUTER JOIN TABLE2 B
ON A.col1 = B.col1
WHERE B.col2 IS NULL;

3. CROSS JOIN

  • 교차 결합을 위한 JOIN이다.
  • JOIN 조건을 주지 않는 경우 (테이블 A의 행 갯수) * (테이블 B의 행 갯수)만큼 조회된다.
  • Cartesian Product(카티션 곱) : 발생 가능한 모든 경우의 수를 출력
    • 조인 조건을 생략하거나 조인 조건이 부적절한 경우에 발생한다.
    • 데이터가 방대할 경우 CPU 과부화를 유발시킨다.
    • /* 명시적 CROSS JOIN */ SELECT * FROM TABLE1 CROSS JOIN TABLE2 /* 암시적 CROSS JOIN */ SELECT * FROM TABLE1, TABLE2

4. UNION

  • UNION vs. JOIN
    • 공통점 : 테이블의 데이터를 연결
    • 차이점 : 연결하는 방법이 다름
    • JOIN*
    • UNION*
  • 두 개 이상의 테이블을 JOIN하는 방법이다.
  • 연결하고자 하는 컬럼의 갯수와 타입이 같아야 연결할 수 있다.
  • UNION이 모든 결과를 합치기 때문에 정렬은 마지막에 한 번만 가능하다.
  • UNION은 중복 데이터 값을 삭제하고 연결한다.
  • UNION ALL을 사용하면 중복되는 값도 모두 연결한다.
  • SELECT name FROM TABLE1 UNION SELECT name FROM TABLE2 UNION SELECT name FROM TABLE3 ORDER BY name;

5. SELF JOIN

  • 1개의 테이블에서 JOIN 하는 방법이다.
  • FROM 절에 동일 테이블이 두 번 이상 나타난다.
  • 자기 자신의 테이블로 JOIN을 실행하므로 테이블 별칭(Alias)을 사용해야 데이터 조회가 가능하다.
  • SELECT column_names FROM TABLE1 T1, TABLE2 T2 WHERE condition;

6. semi-join / anti-join

Conventional join이 아닌 Sub query를 이용하여 main body query를 driving 혹은 driven 하는 join이다.

/* Conventional join */
SELECT a.*
    FROM employee a, dept b
    WHERE a.deptid = b.deptid;

6-1. semi-join

  • JOIN 조건이 존재해야 한다.
  • row들 중 outer node와의 JOIN 결과를 반환한다.
  • SQL 구문 상 직접 기술할 수 없어, 'IN', 'EXISTS'등의 ANY형 연산자로 표현한다.
  • 조건에 대한 index가 존재하고, inner node의 unique가 보장되면 'Inverted Semi Join'을 할 수 있다.
  • # 1 SELECT a FROM TABLE1 WHERE a+3 IN (SELECT C FROM TABLE2 WHERE d='d');
SELECT a.\*  
FROM employee a  
WHERE EXISTS (SELECT b.deptid  
FROM dept b  
WHERE b.deptid = a.deptid);

6-2. anti-join

  • JOIN 조건에 부합하지 않는 outer node의 row들만 반환한다.
  • 반드시 NULL 처리가 필요하다. (oracle 11 버전부터는 명시하지 않아도 가능)
SELECT a.\*  
FROM employee a  
WHERE NOT EXISTS (SELECT b.deptid  
FROM dept b  
WHERE b.deptid = a.deptid);

오라클에서는 Semi-join처럼 optimizer가 인식하기 위해 명확한 syntax는 없지만,
EXISTS/IN 또는 NOT EXISTS/NOT IN을 사용하면 Semi-join 또는 Anti-join으로 optimizer가 판단하게 된다.

JOIN algorithm

RDB JOIN algorithm

요약

  • DBMS의 조인은 주로 1) 내부 조인 2) 외부 조인 두 가지가 있다.
  • 내부 조인은 널리 사용되는 조인 작업이며 기본 조인 유형으로 간주할 수 있다.
  • 내부 조인은 세 가지 하위 유형으로 더 나뉜다. 1) 세타 조인 2) 자연 조인 3) EQUI 조인
  • Theta Join을 사용하면 theta가 나타내는 조건에 따라 두 테이블을 병합할 수 있다.
  • 세타 조인이 동등성 조건만 사용하면 동등 조인이 된다.
  • 자연 조인은 비교 연산자를 사용하지 않는다.
  • 외부 조인에서는 두 조인 테이블의 각 레코드가 일치하는 레코드를 가질 필요가 없다.
  • 외부 조인은 1) 왼쪽 외부 조인 2) 오른쪽 외부 조인 3) 완전 외부 조인의 세 가지 하위 유형으로 더 나뉜다.
  • LEFT Outer Join은 오른쪽 테이블에서 일치하는 행이 없더라도 왼쪽 테이블의 모든 행을 반환한다.
  • RIGHT Outer Join은 왼쪽 테이블에서 일치하는 행이 없더라도 오른쪽 테이블의 모든 열을 반환한다.
  • 완전 외부 조인에서는 일치 조건에 관계없이 두 관계의 모든 튜플이 결과에 포함된다.

 


Referenece

반응형

'[DB]DataBase > [SQL]' 카테고리의 다른 글

[SQLD] 데이터베이스 스키마 구조  (0) 2024.02.21
[SQLD] 데이터 독립성  (0) 2024.02.20
[SQLD] 데이터 모델링  (0) 2024.02.19
[SQL] CONVERT_TZ()  (0) 2023.07.14
[SQL] 집계함수(Aggregate function)  (0) 2023.04.15