Yeonnnnny

[2과목] 2-8. 표준 조인 본문

SQLD

[2과목] 2-8. 표준 조인

yeonny_do 2024. 3. 6. 18:55

■ 표준 조인

  • ANSI 표준으로 작성되는 INNER JOIN, CROSS JOIN, NATURAL JOIN, OUTER JOIN을 말함

 

 INNER JOIN

  • 내부 조인이라고 하며, 조인 조건이 일치하는 행만 추출 (ORACLE 기본 조인)
  • ANSI 표준의 경우 FROM 절에서 INNER JOIN 혹은 줄여서 JOIN을 명시
  • ANSI 표준의 경우 USING 이나 ON 조건절을 필수적으로 사용

 

○ ON절

  • 조인할 양 컬럼의 컬럼명이 서로 다르더라도 사용 가능
  • ON 조건의 괄호는 옵션 (생략 가능)
  • 컬럼명이 같을 경우 테이블 이름이나 별칭을 사용하여 명확하게 지정(테이블 출처 명확히)
  • ON 조건절에서 조인조건 명시, WHERE 절에서는 일반 조건 명시 (WHERE 절과 ON절을 쓰임에 따라 명확히 함)
  • ** 문법
select 테이블1.컬럼명, 테이블2.컬럼명
from 테이블1 inner join 테이블2
on 테이블1.조인컬럼 = 테이블2.조인컬럼;

 

 

예제) EMP 테이블과 DEPT테이블을 사용하여 각 직원의 이름과 부서명을 함께 출력(EQUI JOIN)

select emp.ename, dept.dname
from emp join dept
on emp.deptno = dept.deptno;

 

※ ORACLE 표준은 FROM 절에 테이블을 컴마(,)로 구분, WHERE 절에 조인 조건 나열

※ ORACLE은 INNER JOIN이 기본 조인 연산이므로 별도의 문법 존재하지 않음

 

 

 

  USING 조건절

  • 조인할 컬럼명이 같을 경우 사용
  • Alias나 테이블 이름 같은 접두사 붙이기 불가
  • 괄호 필수
  • ** 문법
select 테이블1.컬럼명, 테이블2.컬럼명
from 테이블1 inner join 테이블2
using (동일컬럼명);

 

위의 ON 예시를 USING으로 바꾸면 아래와 같음 !

select emp.ename, dept.dname
from emp join dept
using (deptno);

 

 

 

 

 NATURAL JOIN

  • 두 테이블 간의 동일한 이름을 가지는 모든 컬럼들에 대해 EQUI JOIN을 수행
  • USING, ON, WHERE 절에서 조건 정의 불가
  • JOIN에 사용된 컬럼들은 데이터 유형이 동일해야 하며 접두사를 사용할 수 없음
  • ** 문법
select 테이블1.컬럼명, 테이블2.컬럼명
from 테이블1 natural join 테이블2;

 

 

위의 INNER JOIN 예시를 NATURAL JOIN을 이용한 쿼리문으로 바꿔 보면 아래와 같음

select emp.ename, dept.dname
from emp natural join dept;

 

※ NATURAL JOIN 시 주의

  • 동일한 이름의 모든 컬럼을 조인 컬럼으로 사용하므로 조인 컬럼의 값이 모두 같을 때만 결과가 리턴됨
  • STUDENT와 PROFESSOR 테이블에 NAME 컬럼과 PROFNO컬럼이 컬럼명이 서로 동일하다면, 이 두 컬럼이 조인되고 이 두 컬럼만 조회가 가능함

 

 

 CROSS JOIN

  • 테이블 간 JOIN 조건이 없는 경우 생성 가능한 모든 데이터들의 조합
  • Cartesian product (카타시안곱) 출력
  • 양쪽 테이블 행의 수를 곱한 만큼의 데이터 조합이 발생함 (m*n)
  • ** 문법
select 테이블1.컬럼명, 테이블2.컬럼명
from 테이블1 cross join 테이블2;

 

 

 OUTER JOIN

  • INNER JOIN과 대비되는 조인 방식
  • JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용
  • 두 테이블 중 한쪽에 NULL을 가지면 EQUI JOIN 시 출력되지 않는데, 이를 출력하기 위해서는 OUTER JOIN을 사용하면 됨
  • 테이블 기준 방향에 따라 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN으로 구분
  1. LEFT OUTER JOIN
    • FROM절에 나열된 왼쪽 테이블에 해당하는 데이터를 읽은 후, 우측 테이블에서 JOIN 대상 읽어옴
    • 즉, 왼쪽 테이블이 기준이 되어 오른쪽 데이터를 채우는 방식
    • 우측값에서 같은 값이 없는 경우 NULL 값으로 출력
  2. RIGHT OUTER JOIN
    • LEFT OUTER JOIN의 반대
    • 즉, 오른쪽 테이블 기준으로 왼쪽 데이터를 채우는 방식
    • FROM 절에 테이블 순서를 변경하면 LEFT OUTER JOIN으로 수행
  3. FULL OUTER JOIN
    • 두 테이블 전체 기준으로 결과를 생성하여 중복 데이터는 삭제 후 리턴
    • LEFT OUTER JOIN 결과와 RIGHT OUTER JOIN 결과의 UNION 연산 리턴과 동일함
    • ORACLE 표준에는 없음

 

 

※ ORACLE 표준은 WHERE 절에 조인 조건을 작성하므로 LEFT OUTER JOIN을 기술하지 않음

※ WHERE 절에서 기준이 되는 테이블의 반대 테이블 조건 컬럼 뒤에 (+)를 붙임

※ ANSI 표준에서는 조인 종류를 명시해야하고, 조인 조건을 바로 뒤 ON 절에 나열해야 함. 그리고 WHERE절을 ON절 밑에 전달 (순서 중요)

※ FULL OUTER JOIN은 성능적으로 좋지 않기 때문에 사용 시 주의 필요

'SQLD' 카테고리의 다른 글

[2과목] 2-10. 집합 연산자  (2) 2024.03.06
[2과목] 2-9. 서브쿼리  (0) 2024.03.06
[2과목] 2-7. 조인  (0) 2024.03.06
[2과목] 2-5. ORDER BY 절  (0) 2024.03.06
[2과목] 2-5. GROUP BY 절  (0) 2024.03.05