Join Expression: 두 판 사이의 차이
| 25번째 줄: | 25번째 줄: | ||
student natural join takes | student natural join takes | ||
</syntaxhighlight> | </syntaxhighlight> | ||
이 연산은 두 튜플의 공통 속성(ID)의 값이 같을 경우에만 그 튜플 쌍을 고려한다. 이때, 두 릴레이션의 스키마에 공통으로 존재하는 속성들은 한 번만 나타나며 반복되지 않는다. 또한 속성들의 순서는 1) 공통 속성, 2) 첫번째 릴레이션에만 있는 속성들, 3) 두번째 릴레이션에만 있는 속성들 순으로 고정된다. 이를 바탕으로 figure 1의 student와 takes 간의 natural join 연산 결과를 이해할 수 있다. | 이 연산은 두 튜플의 공통 속성(ID)의 값이 같을 경우에만 그 튜플 쌍을 고려한다. 이때, 두 릴레이션의 스키마에 공통으로 존재하는 속성들은 한 번만 나타나며 반복되지 않는다. 또한 속성들의 순서는 1) 공통 속성, 2) 첫번째 릴레이션에만 있는 속성들, 3) 두번째 릴레이션에만 있는 속성들 순으로 고정된다. 이를 바탕으로 figure 1의 student와 takes 간의 natural join 연산 결과를 이해할 수 있다.<br> | ||
“모든 학생들 중에서 어떤 과목이라도 수강한 학생들의 이름과 수강한 과목의 ID를 구하라”라는 쿼리는 natural join을 사용하여 다음과 같이 더 간단하게 작성할 수 있다. | |||
<syntaxhighlight lang="sql"> | |||
select name, course_id | |||
from student natural join takes; | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
2025년 4월 7일 (월) 18:01 판
상위 문서: SQL
개요
- Sample gallery
-
Figure 1. The student relation
-
Figure 2. The takes relation
Join 연산은 두 개의 릴레이션(relation)을 입력으로 받고 그 결과로 또 다른 릴레이션을 만들어내는 연산이다. Join은 데카르트 곱(Cartesian product)의 일종으로, 두 릴레이션에 있는 튜플들을 모든 가능한 쌍으로 조합한 다음 특정 조건을 만족하는 튜플 쌍만 선택해서 결과로 내보낸다. 또한 릴레이션에 포함될 속성(attribute)들도 지정된다. Join 연산은 보통 SQL 쿼리(query)에서 from 절의 subquery 표현식으로 사용된다. Join 연산의 종류는 다음 세가지가 있다:
- Natural Join: 두 테이블에서 이름이 같은 속성들끼리 자동으로 비교해서 join 한다.
- Inner Join: 조건을 만족하는 쌍만 결과에 포함된다. (null이 있는 건 제외)
- Outer Join: 조건에 맞지 않아도 한쪽 테이블의 데이터를 모두 유지한다. → Left / Right / Full Outer Join으로 나뉜다.
해당 문서에서 사용되는 모든 예제들은 figure 1, 2로 제공되는 두 릴레이션인 student와 takes에 대한 것이다.
The Natural Join
다음의 “모든 학생들 중에서 어떤 과목이라도 수강한 학생들의 이름과 수강한 과목의 ID를 구하라”라는 SQL 쿼리[1]를 보자:
select name, course_id
from student, takes
where student.ID = takes.ID;
위 쿼리는 where 절의 조건은 student와 takes 테이블에서 student.ID가 takes.ID와 같아야 한다는 것이다. 이와 같은 조건은 매우 흔하게 사용된다. 즉, from 절에 있는 일치 조건은 이름이 같은 모든 속성들을 등호(=)로 비교하는 것이 대부분이다. 이러한 일반적인 경우를 위해서 SQL은 natural join이라는 연산을 지원한다. Natural join 연산은 두 릴레이션에 대해 동작하고, 양쪽 릴레이션 스키마에 공톡으로 존재하는 속성의 값이 동일한 튜플 쌍만을 고려하여 하나의 릴레이션을 생성한다. 예를 들어,

student natural join takes
이 연산은 두 튜플의 공통 속성(ID)의 값이 같을 경우에만 그 튜플 쌍을 고려한다. 이때, 두 릴레이션의 스키마에 공통으로 존재하는 속성들은 한 번만 나타나며 반복되지 않는다. 또한 속성들의 순서는 1) 공통 속성, 2) 첫번째 릴레이션에만 있는 속성들, 3) 두번째 릴레이션에만 있는 속성들 순으로 고정된다. 이를 바탕으로 figure 1의 student와 takes 간의 natural join 연산 결과를 이해할 수 있다.
“모든 학생들 중에서 어떤 과목이라도 수강한 학생들의 이름과 수강한 과목의 ID를 구하라”라는 쿼리는 natural join을 사용하여 다음과 같이 더 간단하게 작성할 수 있다.
select name, course_id
from student natural join takes;
각주
- ↑ 해당 쿼리는 일부 과목을 수강한 학생들만을 출력하며, 어떠한 과목도 출력되지 않는다.