개발/sqld

[SQL/2과목] 조인이란?

2ivii 2025. 8. 21. 01:51

2과목 1장의 마지막 챕터, 조인에 대해 정리하고 이제 SQL 심화로 넘어가겠따.

 

조인이란 뭘까? 어려우니 잘 살펴보도록 하자


조인

 

조인이란, 두 개 이상의 테이블에 나뉘어 저장된 데이터를 공통된 값을 기준으로 합쳐서 마치 하나의 테이블로 보여주는 것이다!

 

노랭이책에서도 나뉘어져있다시피, 일반조인과 표준 조인이 있다.

  • 일반조인 : 과거부터 사용하던 방식으로, WHERE절에 조인 조건을 작성한다.
  • 표준조인 : 현재 표준으로 권장되는 방식으로, FROM 절에 JOIN 키워드를 명시적으로 사용한다.

우선 조인이 너무너무 많아서 간단하게 분류를 해보겠다. 조인은 세가지 분류로 나눌 수 있다. 

  • 문법
    • 일반조인 : WHERE절 사용
    • 표준조인 : FROM절에 JOIN을 명시하여 ON절과 함께 쓴다
  • 연산자
    • 등가조인(EQUI JOIN) : 등호 사용
    • 비등가조인(NON_EQUI JOIN) : 등호 안사용
  • 결과 범위
    • 내부조인(INNER JOIN) : 매칭되는 데이터만 포함
    • 외부조인(OUTER JOIN) : 매칭되지 않는 데이터도 포함. LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN이 있다.
    • 교차조인(CROSS JOIN) : 모든 데이터의 조합 포함

일단, 노랭이책은 일반조인과 표준조인이 챕터로 그나누고있으니 이 둘을 분류해서 보겠다!


일반조인

우선, Oracle기준으로만 설명하겠다. 왜냐하면, 일반조인은  WHERE절에 테이블을 연결하는 조건인데 WHERE절에서 외부 조인할때 쓸만한 기호가 없기때문에 너무너무 복잡하다! 그래서 MSSQL은 빠르게 표준조인을 사용하였기 때문에 일반조인은 대게 Oracle만 보인다. 

 

내부 조인(INNNER JOIN)

 

가장 기본적인 형식으로, WHERE절에 등호를 사용한다. WHERE절의 조건이 만족한 FROM절의 양쪽 테이블의 데이터만 반환한다.

SELECT
    e.emp_name,
    d.dept_name
FROM
    employees e, departments d
WHERE
    e.department_id = d.department_id;

 

외부 조인(OUTER JOIN)

 

Oracle의 (+) 기호를 사용하여 구현하며, 조인 조건이 일치하지 않는 데이터도 결과에 포함시킨다. 즉 한쪽 테이블의 데이터를 모두 보여주면서 일치하는 데이터가 없는 쪽은 NULL로 채운다. 어느쪽 테이블을 기준으로 할지에 따라 LEFT, RIGHT, FULL로 나뉜다. 예를들어 LEFT JOIN은 왼쪽 테이블의 모든 데이터를 결과에 포함하고, 오른쪽 테이블에 그게 없으면 NULL로 표시한다. 

(+)의 위치는, NULL이 될 수 있는 쪽에 붙인다. 또 예를들어 LEFT JOIN의 경우 오른쪽 테이블 쪽에 NULL이 표시되므로 오른쪽에 (+)d이다. 아래 예시는 LEFT JOIN이다.

SELECT
    e.emp_name,
    d.dept_name
FROM
    employees e, departments d
WHERE
    e.department_id = d.department_id (+);

 

크로스 조인(CROSS JOIN)

 

모든 가능한 행의 조합을 반환한다. 이 조합을 카티전 프로덕트라고 한다. 일반조인에서는 WHERE절을 생략하면 교차조인이다! 웃긴점은 그래서 실수로 WHERE절을 빼먹고 일반조인하면 발생하는게 크로스 조인이라한다 ㅋㅋ 이러면 시스템 부화된단다.

SELECT
    e.emp_name,
    d.dept_name
FROM
    employees e, departments d;

 

자체 조인(SELF JOIN)

 

우선 이 자체조인은 추가 기법이라고 한다. 딱히 막 내부외부이렇게 나누는 분류에 들어가는 것이 아니라 추가 '기법'이라고 생각하면 된다. 이건 SELECT에 별칭을 다르게 부여하여 마치 두개의 테이블처럼 사용한다. 보면 employees끼리 조인중이다!! 아래는 간단한 이너조인에 자체조인 한 예시이다.

SELECT
    e.emp_name AS "사원 이름",
    m.emp_name AS "관리자 이름"
FROM
    employees e, employees m
WHERE
    e.manager_id = m.emp_id;

 

이러면 사원이름, 관리자이름이라는 컬럼으로 테이블이 하나 더 만들어지는 효과를 낸다.


표준 조인

표준 조인은 FROM 절에 JOIN 키워드를 명시적으로 사용한다. 최근엔 표준조인방식 쓴다. 그리고 내부조인, 외부조인, 크로스 조인 모두 Oracle이랑 MSSQL이랑 구문 같다고 한다 휴~ 아래 설명할때 내부조인이 뭔지 외부조인이 뭔지는 위에 설명했으니 생략하겠다.

내부 조인(INNER JOIN)

 

INNER키워드를 생략하고 JOIN이라고만 써도 내부조인으로 작동한다.

SELECT e.emp_name,d.dept_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
외부 조인(OUTTER JOIN)

 

OUTER 키워드는 보통 생략해서 LEFT JOIN, RIGHT JOIN 등으로 사용된다. 예시로 LEFT만 들겠다. 

SELECT e.emp_name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
교차 조인(CROSS JOIN)

 

ON 조건절 없이 두 테이블의 모든 가능한 행의 조합을 반환한다.

SELECT e.emp_name, d.dept_name
FROM employees e
CROSS JOIN departments d;

 

자체 조인(SELF JOIN)

 

이번에도 이너조인으로 예시를 들겠다. 얘도 보면 employees끼리 조인중!

SELECT e.emp_name AS "사원 이름", m.emp_name AS "관리자 이름"
FROM employees e
INNER JOIN employees m ON e.manager_id = m.emp_id;

 

자연 조인(NATURAL JOIN)

 

얘는 두 테이블에서 이름과 타입이 같은 모든 컬럼을 기준으로 자동으로 등가조인을 수행한다. 자동이기때문에 ON 절이 필요없다. 그렇기에 예상치 못한 컬럼이 조인 조건에 포함될 수 있어, 실무에선 거의 사용하지 않는다.

SELECT emp_name, dept_name
FROM employees
NATURAL JOIN departments;

 

+++++++

USING 절

ON 절 대신 조인할 컬럼을 지정하는 문구이다. 조인하려는 컬럼 이름이 양쪽 테이블에서 같을 때에만 사용 가능하다!
SELECT emp_name, dept_name
FROM employees
JOIN departments USING (department_id);

이렇게 오늘은 조인에 대해 알아보았다. 처음엔 너무 어려웠지만 초반에 분류를 제대로 나누고 살피니, 어렵지 않게 이해가 됐다!! 힛