구름조아

Join, Cross Join, Inner Join, Natural Join, Outer Join 본문

SQLD자격증공부/SQL활용

Join, Cross Join, Inner Join, Natural Join, Outer Join

김옹희 2023. 5. 9. 14:40

1. 조인(join) 이란?

  • 두개 이상의 테이블을 결합하여 출력하는 명령어.
  • 관계형 데이터베이스의 핵심적인 기능.
  • PK와 FK의 값을 기반으로 join이 성립 된다.
  • 조인은 여러 테이블을 하나의 테이블로 만드는 과정이다.
INNER_JOIN 동일한 데이터의 값을 기준으로 실행되는 JOIN
NATURAL_JOIN 양 테이블 간 동일한 컬럼명을 가지고 자동으로 매칭되는 INNER_JOIN
CROSS_JOIN JOIN 하는 테이블간 조인 조건이 없을때 실행되는 JOIN
OUTER_JOIN INNER JOIN과 같은 상태에서 기준이 되는 테이블은 다른쪽에 같은 값이 없어도 실행되어 출력하는 JOIN

2. CROSS JOIN

  • 두개의 테이블 간에 매칭되는 모든 데이터 조합을 출력한다.
  • 카티션곱(CARTESIAN PRODUCT)와 동의어.
  • JOIN 조건을 따로 정의하지 않는다.
  • 스크립트 실행
SELECT *
FROM major, professor;

SELECT *
FROM major CROSS JOIN professor;

3. INNER JOIN

  • 두개의 테이블 간에 매칭되는 모든 데이터 조합 중 특정 컬럼끼리 값이 같은 것만 출력한다.
  • 가장 보편적인 JOIN 방법이다.
  • INNER 는 생략 가능
SELECT *
FROM major m INNER JOIN profrssor p
ON m.major_id = p.bl_major_id;

4. NATURAL JOIN

  • 두 테이블간에 동일한 이름을 갖는 모든 컬럼들에 대해 자동으로 EQUI JOIN을 실행 한다.
  • WHERE 절에서 JOIN 조건을 사용하거나, ON절 또는 USING절을 사용 할 수 있다.
SELECT *
FROM major NATURAL JOIN professor;

5. OUTER JOIN

  • INNER JOIN 과 다르게 기준이되는 한쪽은 매칭되는 값이 없어도 출력 된다.
  • 동일한 값이 없다면 한쪽은 NULL이 출력 된다.
create table major_outer as select * from major where MAJOR_PRFS_CNT > 6;

SELECT *
FROM professor p OUTER JOIN major_outer m
ON m.major_id = b.bl_major_id;

SELECT *
FROM professor p, major_outer m
WHERE m.major_id = p.bl.major_id(+);

6. ON절

  • ON절은 동일하지 않은 이름을 가진 컬럼끼리도 JOIN조건에 사용 가능하도록 한다.
  • 물론, 동일한 이름도 가능 하다.
  • WHERE절과 혼용하여 사용도 가능 하다.

7. USING절

  • USING절에 두 테이블에 존재하는 공통된 컬럼명을 사용
  • 데이터 유형도 동일해야 한다.
SELECT *
FROM major m INNER JOIN professor p
ON m_major_id = p.bl_major_id;

SELECT *
FROM major m INNER JOIN professor p
USING(major_id);

8. 데이터 증가

  • 조인을 잘못하면 데이터가 많아 진다.
  • 중복된 데이터가 있을 때 JOIN은 신중하게 해야 한다.
create table major_duple as select * from major union all select * from major;
create table professor_duple as select * from professor union all select * from  professor;

SELECT *
FROM major_duple m INNER JOIN professor_duple p
ON m_major_id = p.bl_major_id;