익명 사용자
로그인하지 않음
계정 만들기
로그인
youngwiki
검색
Join Expression 문서 원본 보기
youngwiki
이름공간
문서
토론
더 보기
더 보기
문서 행위
읽기
원본 보기
역사
←
Join Expression
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
상위 문서: [[SQL]] ==개요== <gallery caption="Sample gallery" widths="300px" heights="390px"> The student relation.png|Figure 1. The student relation The takes relation.png|Figure 2. The takes relation </gallery> '''Join 연산'''은 두 개의 릴레이션(relation)을 입력으로 받고 그 결과로 또 다른 릴레이션을 만들어내는 연산이다. '''Join은 데카르트 곱(Cartesian product)의 일종으로, 두 릴레이션에 있는 튜플들을 모든 가능한 쌍으로 조합한 다음 특정 조건을 만족하는 튜플 쌍만 선택해서 결과로 내보낸다. 또한 릴레이션에 포함될 속성(attribute)들도 지정된다. Join 연산은 보통 SQL 쿼리(query)에서 from 절의 subquery 표현식으로 사용된다. Join 연산의 종류는 다음 세가지가 있다: * [[Join Expression#The Natural Join|Natural Join]]: 두 테이블에서 이름이 같은 속성들끼리 자동으로 비교해서 join 한다. * Inner Join: 조건을 만족하는 쌍만 결과에 포함된다. (null이 있는 건 제외) * Outer Join: 조건에 맞지 않아도 한쪽 테이블의 데이터를 모두 유지한다. → Left / Right / Full Outer Join으로 나뉜다. 해당 문서에서 사용되는 모든 예제들은 figure 1, 2로 제공되는 두 릴레이션인 student와 takes에 대한 것이다. ==The Natural Join== 다음의 “모든 학생들 중에서 어떤 과목이라도 수강한 학생들의 이름과 수강한 과목의 ID를 구하라”라는 SQL 쿼리<ref>해당 쿼리는 일부 과목을 수강한 학생들만을 출력하며, 어떠한 과목도 출력되지 않는다.</ref>를 보자: <syntaxhighlight lang="sql"> select name, course_id from student, takes where student.ID = takes.ID; </syntaxhighlight> 위 쿼리는 where 절의 조건은 student와 takes 테이블에서 student.ID가 takes.ID와 같아야 한다는 것이다. 이와 같은 조건은 매우 흔하게 사용된다. 즉, from 절에 있는 일치 조건은 이름이 같은 모든 속성들을 등호(=)로 비교하는 것이 대부분이다. 이러한 일반적인 경우를 위해서 SQL은 '''natural join'''이라는 연산을 지원한다. Natural join 연산은 두 릴레이션에 대해 동작하고, 양쪽 릴레이션 스키마에 공톡으로 존재하는 속성의 값이 동일한 튜플 쌍만을 고려하여 하나의 릴레이션을 생성한다. 예를 들어, [[파일:The natural join of the student relation with the takes relation.png|대체글=Figure 1. The natural join of the student relation with the takes relation|가운데|섬네일|500x500픽셀|Figure 1. The natural join of the ''student'' relation with the ''takes'' relation]] <syntaxhighlight lang="sql"> student natural join takes </syntaxhighlight> 이 연산은 두 튜플의 공통 속성(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> ===Dangerous in Natural Join=== SQL의 from 절에는 다음과 같이 여러 릴레이션을 natural join으로 연결할 수 있다. <syntaxhighlight lang="sql"> select A1, A2, ..., An from r1 natural join r2 natural join ... natural join rm where P; --보다 일반적인 형태. Ei는 하나의 릴레이션이거나 natural relation을 포함하는 표현식 from E1, E2, ..., En </syntaxhighlight> 예를 들어, “학생들의 이름과, 그들이 수강한 과목들의 제목(title)을 나열하라”는 질의를 SQL로 다음과 같이 쓸 수 있다: <syntaxhighlight lang="sql"> select name, title from student natural join takes, course where takes.course_id = course.course_id; </syntaxhighlight> 해당 코드에서는 먼저 <code>student natural join takes</code>를 수행한 후 해당 결과와 course 테이블의 데카르트 곱을 계산한다.<ref>두 릴레이션이 from 절에서 연속적으로 사용된 경우, 명시적인 join 조건이 없으면 SQL은 데카르트 곱을 수행한다.</ref> 그리고 그 결과 테이블에서 where 절에 따라 course_id가 같은 튜플만 추출한다. <br> 반면, 다음 쿼리는 '''동일한 결과를 생성하지 않는다.''' <syntaxhighlight lang="sql"> select name, title from student natural join takes natural join course; </syntaxhighlight> 이유를 이해하기 위해, 먼저 <code>student natural join takes</code>의 결과를 보자. 이 결과에는 다음과 같은 속성들이 있다: <syntaxhighlight lang="sql"> (ID, name, dept_name, tot_cred, course_id, sec_id) </syntaxhighlight> 따라서 <code>student natural join takes</code>이 <code>course</code>와 join할 때, dept_name 속성도 동일해야 한다는 조건이 추가로 필요하다. 즉, 학생의 전공 학과와 과목의 학과가 같아야만 join이 이루어지는 것이다. 따라서 학생이 자신의 학과가 아닌 다른 학과의 과목을 수강한 경우는 (name, title) 결과 쌍에서 누락된다. ===Natural Join with Using Clause=== Natural join을 사용하면서도 불필요한 속성 간의 자동 비교로 인한 오류를 피하기 위해 SQL은 '''using 절'''을 사용하여 '''어떤 속성들끼리만 같아야 하는지를 명시적으로 지정'''할 수 있는 natural join 형식을 제공한다. 아래는 그 예시이다. <syntaxhighlight lang="sql"> select name, title from (student natural join takes) join course using (course_id); </syntaxhighlight> <code>join ... using</code> 연산은 두 릴레이션의 공통 속성 목록을 명시해야 한다. 예를 들어 <code>r1 join r2 using (A1, A2)</code>은 다음과 같은 동작을 한다. * 튜플 t1과 t2가 매치되기 위한 조건은 <code>t1.A1 = t2.A1</code> 및 <code>t1.A2 = t2.A2</code>이어야 하며, * 만약 r1과 r2가 공통으로 A3 속성을 가지고 있더라도 <code>t1.A3 = t2.A3</code>일 필요는 없다. 따라서 위의 SQL 질의에서는, 학생의 dept_name과 과목의 dept_name이 달라도 상관없으며, 의도대로의 결과를 출력한다. <syntaxhighlight lang="sql"> </syntaxhighlight> ==각주== [[분류:데이터베이스 시스템]]
Join Expression
문서로 돌아갑니다.
둘러보기
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
위키 도구
위키 도구
특수 문서 목록
문서 도구
문서 도구
사용자 문서 도구
더 보기
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
문서 기록