본문 바로가기
CS 지식/데이터베이스

[데이터베이스] 조인 연산의 종류와 조건

by 코딩하는 동현 2025. 3. 26.

Joined Relations

조인 연산은 두 개의 관계(Relation)를 입력으로 받아 또 다른 관계를 결과로 반환하는 연산이다.

두 개 이상의 테이블에서 관련된 열(Column)을 기준으로 행(Row)을 결합할 때 사용된다.

일반적으로 FROM 절의 서브쿼리 표현식으로 활용된다.

조인의 종류

  1. 자연 조인(Natural Join)
    • 두 테이블에서 동일한 이름을 가진 속성을 기준으로 자동으로 조인한다.
    • 중복된 속성은 하나로 합쳐진다.
  2. 내부 조인(Inner Join)
    • 조인 조건을 만족하는 행들만 결과로 반환한다.
    • ON 절을 사용하여 특정 조건을 명시할 수 있다.
  3. 외부 조인(Outer Join)
    • 한쪽 테이블에 매칭되는 데이터가 없어도 결과에 포함되도록 한다.
    • 세 가지 유형이 있다.
      • 왼쪽 외부 조인(Left Outer Join): 왼쪽 테이블의 모든 행을 포함하며, 매칭되지 않는 오른쪽 테이블의 값은 NULL로 채운다.
      • 오른쪽 외부 조인(Right Outer Join): 오른쪽 테이블의 모든 행을 포함하며, 매칭되지 않는 왼쪽 테이블의 값은 NULL로 채운다.
      • 완전 외부 조인(Full Outer Join): 양쪽 테이블의 모든 행을 포함하며, 매칭되지 않는 값은 NULL로 채운다.

Natural Join in SQL

NATURAL JOIN은 두 테이블 간에 이름이 같은 속성(컬럼) 을 기준으로 자동으로 매칭해서 조인을 수행합니다. 즉, 두개의 테이블에서 같은 속성 가지고 있는게 있으면 모든 속성이 다 같을떄 튜플만 반환합니다.

  • 이름이 같은 속성이 여러 개일 경우, 모두 같은 값일 때만 행을 매칭합니다.
  • 그리고 공통된 컬럼은 결과에 한 번만 나타납니다.

카테시안 곱으로 작성한 경우 (공통된 속성이 ID밖에 없다면)

select name, course_id
from students, takes
where student.ID = takes.ID;

 

natural join 문 사용

select name, course_id
from student natural join takes;

Natural Join 문법

from 절은 natural join을 하면서 여러 relation을 조합할 수 있다.

select A1, A2, … An
from r1 natural join r2... natural join rn
where P ;

student natural join takes

학생 테이들과 수강신청 테이블 natural join 한 예이다.

ID가 00128인 튜블은 takes 테이들의 ID 00128인 두개랑 합쳐져서 총 튜블 2개가 생성된 모습이다.

 

자연 조인(Natural Join) 사용 시 주의사항

자연 조인은 공통된 속성을 자동으로 기준으로 삼아 조인하는 방식이다.

그러나, 의도하지 않은 속성 이름이 같을 경우 예상치 못한 결과가 발생할 수 있다.

주의할 점

  • 관련이 없는 속성이라도 이름이 동일하면 자동으로 조인 조건에 포함될 수 있다.
  • 데이터베이스 설계 시 동일한 이름의 속성이 여러 테이블에 존재할 경우 주의가 필요하다.
  • 예상치 못한 조인이 발생하지 않도록, 명시적인 조인 조건을 추가하는 것이 좋다.

 

잘못된 예제

select name, title
from student natural join takes natural join course;

  • 자연 조인을 사용했을 때, student, takes, course 테이블 간의 공통 속성이 자동으로 조인된다.
  • 만약 student와 course에 같은 이름의 속성이 존재하면, 의도하지 않은 조인 조건이 적용될 수 있다.

 

올바른 접근 방식

select name, title
from student natural join takes, course
where takes.course_id = course.course_id;

  • student와 takes 테이블은 자연 조인으로 결합하되,course 테이블은 명시적으로 course_id를 기준으로 카테시안 곱을 한 후 조인한다.
  • 이렇게 하면 원하지 않는 속성으로 인해 발생하는 오류를 방지할 수 있다.

Using절을 이용한 natural join

자연 조인은 공통된 속성을 자동으로 기준으로 삼아 조인하지만,

예상치 못한 속성이 조인 조건에 포함될 위험이 있다.

이러한 문제를 방지하기 위해 USING 구문을 사용하면

명확하게 특정 속성을 지정하여 조인할 수 있다.

USING 구문의 역할

  • 자연 조인에서 어떤 속성을 기준으로 조인할지 명시적으로 지정할 수 있다.
  • 의도치 않은 속성이 조인 조건에 포함되는 것을 방지할 수 있다.
  • 중복 속성은 하나로 유지되며, 명시된 속성만 비교하여 조인한다.

 

예제 설명

학생과 강사가 수강한 강좌의 제목을 조회하는 경우를 가정한다.

select name, title
from (student natural join takes) natural join course using (course_id)

  • student와 takes 테이블은 공통 속성(ID)을 기준으로 자연 조인한다.
  • 이후, course 테이블을 조인할 때 course_id를 기준으로 조인하도록 명시적으로 지정한다.
  • 이를 통해 불필요한 속성이 조인 조건으로 포함되는 것을 방지할 수 있다. 사실 그러면 natrual join 쓰는 의미가 없다.

on절을 이용한 join

ON 조건을 사용하면 조인하는 관계들 사이에서 특정 조건을 적용할 수 있다.

이는 조인할 두 테이블 간의 속성을 명확하게 지정하는 방법이다.

다음 두 개의 쿼리는 동일한 결과를 반환한다.

ON 조건을 사용한 조인

두 테이블을 조인할 때, student_ID와 takes_ID가 같은 경우만 선택한다.

select *
from student join takes on student_ID= takes_ID

WHERE 절을 사용한 조인

두 테이블을 나열한 후, WHERE 절에서 student_ID와 takes_ID가 같은 경우만 선택한다.

select *
from student , takes
where student_ID= takes_ID


Outer Join

정보 손실을 피하기 위한 조인 확장 Outer Join은 일반적인 Join에서 발생할 수 있는 정보 손실(loss of information)을 방지하기 위해 사용되는 확장된 조인 방식이다.

  • 일반 Join처럼 두 릴레이션을 조인한 후,
  • 한 릴레이션에는 존재하지만 다른 릴레이션에 매칭되지 않는 튜플도 결과에 포함시킴
  • 이때 매칭되지 않는 컬럼에는 NULL 값을 채워 넣음

Outer Join의 세 가지 형태

1. Left Outer Join

  • 왼쪽 릴레이션의 모든 튜플을 결과에 포함
  • 오른쪽 릴레이션에 매칭되는 튜플이 없으면, 오른쪽 컬럼은 NULL로 채움

2. Right Outer Join

  • 오른쪽 릴레이션의 모든 튜플을 결과에 포함
  • 왼쪽 릴레이션에 매칭되는 튜플이 없으면, 왼쪽 컬럼은 NULL로 채움

3. Full Outer Join

  • 왼쪽과 오른쪽 모두의 모든 튜플을 결과에 포함
  • 어느 쪽이든 매칭되지 않는 튜플은 해당되지 않는 컬럼에 NULL을 채워 포함

Left Outer Join

course ⟕ prereq

  • 왼쪽 테이블의 튜플을 전부 유지하고 싶을때 이용한다.
  • course natural left outer join prereq 는 왼쪽에 있는 course 테이블의 모든 튜플을 결과에 포함시켜야 한다.
  • CS-347 같은 튜플이 prereq 테이블에 매칭되지 않더라도 결과에서 사라지지 않는다.
  • Outer 조인은 조인 조건을 만족하지 않아도 튜플을 보존하고 싶을 때 사용한다.
  • 첫 번째와 두 번째 줄은 natural join을 했을 때의 결과이고,
  • 마지막 한 줄은 prereq 의 속성값들이 null로 채워진 채 결과에 포함된 것이다.

Right Outer Join

course ⟖ prereq

  • 오른쪽 테이블의 튜플을 무조건 유지하고 싶을때 이용한다 .
  • course natural right outer join prereq 는 오른쪽에 있는 prereq 테이블의 모든 튜플을 결과에 포함시켜야 한다.
  • CS-315은 결과에서 사라지지 않고 포함되어야 하는데, 자연 조인만 쓰면 없어지게 된다.
  • Outer 조인은 조인 조건을 만족하지 않아도 튜플을 보존하고 싶을 때 사용한다.
  • 첫 번째와 두 번째 줄은 natural join을 했을 때의 결과이고,
  • 마지막 한 줄은 _course_의 속성값들이 null로 채워진 채 결과에 포함된 것이다.

Full Outer Join

course ⟗ prereq

  • 양쪽 테이블 모두의 튜플을 보존해야 할 때 사용하는 조인이다.
  • 1, 2번째 줄은 natural join의 결과이고,
  • 나머지 두 줄은 왼쪽과 오른쪽 테이블의 모든 튜플을 보존했기 때문에 추가된 것이다.
  • CS-315는 prereq 테이블에 없기 때문에 prereq_id 는 null 값으로 대체되었다.
  • CS-347은 course 테이블에 없기 때문에 해당 속성들은 null로 대체된다.
  • natural join 의 확장 형태이므로, 심볼이 비슷하다는 점도 알 수 있다.

조인의 종류

  • INNER JOIN: 조인 조건을 만족하는 튜플만 결과에 포함
  • OUTER JOIN: 조건을 만족하지 않더라도 특정 테이블의 튜플을 결과에 포함
    • LEFT OUTER JOIN: 왼쪽 테이블의 튜플을 보존
    • RIGHT OUTER JOIN: 오른쪽 테이블의 튜플을 보존
    • FULL OUTER JOIN: 양쪽 테이블의 튜플을 모두 보존

조인 조건 명시 방법

  • NATURAL JOIN
    • 양쪽 테이블에 이름이 같은 모든 컬럼을 자동으로 조인 조건으로 사용
    • 조인 조건을 명시하지 않아도 된다
  • ON
    • 조인 조건을 명시적으로 작성
    • 컬럼 이름이 달라도 조인 가능
    • 복수 조건, 비교 연산 등 자유롭게 지정 가능
  • USING (column_name)
    • 양쪽 테이블에 동일한 이름의 컬럼이 있을 때
    • 그 컬럼을 기준으로 조인을 수행
    • 결과에는 해당 컬럼이 한 번만 표시됨
반응형

댓글