검수요청.png검수요청.png

내부조인

위키원
(Inner join에서 넘어옴)
이동: 둘러보기, 검색

내부조인(inner join)은 관계형 데이터베이스에서 두 개 이상의 테이블을 결합할 때 사용되는 SQL 연산자 중 하나이다. 내부조인은 두 테이블에서 일치하는 데이터를 결합하는 방식으로, 조건에 맞는 행들만 결과에 포함돼. 즉, 두 테이블 간에 공통된 컬럼의 값이 일치하는 행들만 추출된다.

개요[편집]

내부조인은 여러 애플리케이션에서 사용되는 가장 흔한 결합 방식이며, 기본 조인 형식으로 간주된다. 내부 조인은 조인 구문에 기반한 2개의 테이블(A, B)의 컬럼 값을 결합함으로써 새로운 결과 테이블을 생성한다. 그 질의어는 조인 구문을 충족하는 모든 일치되는 결과 열을 찾기 위해 A 테이블의 각 열을 B 테이블의 각 열과 비교를 한다. 조인 구문이 충족되면, A, B 테이블에서 일치된 각 열의 컬럼 값은 결과 열로 결합된다. 조인으로 도출된 결과 값은 (테이블 A 내의 모든 레코드와 테이블 B에 있는 모든 레코드가 결합하여) 테이블에 존재하는 모든 레코드(또는 크로스 조인)의 최초의 곱집합의 결과값으로 정의될 수 있으며, 그런 이후 조인 구문을 충족시키는 모든 레코드 값을 반환한다. 실제 SQL 실행은 보통 곱집합의 연산이 매우 비효율적이기 때문에 실행 가능한 해쉬 조인 또는 소트-머지(sort-merge) 조인과 같은 다른 접근법을 사용한다.

SQL은 '명시적 조인 표현'(explicit)과 '암시적 조인 표현'(implicit) 2개의 다른 조인식 구문을 지정한다.

'명시적 조인 표현'에서는 테이블에 조인을 하라는 것을 지정하기 위해 JOIN 키워드를 사용하며, 그리고 나서 다음의 예제와 같이 ON 키워드를 조인에 대한 구문을 지정하는데 사용한다.

SELECT *
FROM employee INNER JOIN department
  ON employee.DepartmentID = department.DepartmentID;

'암시적 조인 표현'은 SELECT 구문의 FROM 절에서 그것들을 분리하는 컴마를 사용해서 단순히 조인을 위한 여러 테이블을 나열하기만 한다. 그리하여 그것은 교차 조인(cross join)을 지정하면, WHERE 절은 추가적인 필터 구문(명시적 구문에서 조인 구문을 비교하는 역할을 하는)을 적용할 것이다.

다음의 예제는 전자의 것과 동일한 예이지만, 이번에는 암시적 조인 구문을 사용했다.

SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;

위의 예에서 제시한 질의어는 두 테이블의 DepartmentID 컬럼을 이용해서 Employee 와 Department 테이블을 조인할 것이다. 이 두 테이블에서 DepartmentID가 일치하는 곳(즉, 조인 구문이 충족되는 곳)에서 쿼리는 LastName, DepartmentID 와 DepartmentName 컬럼을 결과 열로 결합할 것이다. DepartmentID 가 일치하지 않는다면, 어떠한 결과 값도 생성되지 않을 것이다.

그리하여 위 예제의 2개의 질의 중 하나의 수행 결과는 다음과 같을 것이다.

Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Robinson 34 사무부 34
Jones 33 기술부 33
Smith 34 사무부 34
Steinberg 33 기술부 33
Rafferty 31 영업부 31

주의: 프로그래머는 조인 조건이 명시적으로 IS NULL 또는 IS NOT NULL과 같은 추가 구문을 사용하지 않는다면 NULL은 어떠한 값도 일치하지 않으므로(심지어 NULL 자체도) NULL 값이 포함될 수 있는 테이블을 조인하는데 있어서 특별한 주의를 기울여야 한다.

John이라는 직원과 마케팅이라는 부서가 쿼리 수행 결과에서 나타나지 않음을 유의하자. 이것들 중 어느 것도 다른 테이블에서 일치되는 레코드를 가지고 있지 않다 : John은 부서와 연관이 없으며, 어떤 직원도 department ID 35 ("마케팅")에 배속되어 있지 않다. 희망하는 결과값에 따라, 이러한 행위는 약간 버그가 있을 수도 있으며, 그리고 그것은 외부 조인에서는 회피될 수 있는 것이다.

내부 조인을 더 세부적으로 분류하여 동일 조인(Equi-Join), 자연 조인(natural join), 또는 교차 조인(cross-join)으로도 나눌 수 있다.

동일 조인[편집]

동일 조인(Equi-Join)은 특별한 유형의 비교자 기반의 조인이며, 이것은 조인 구문에서 동등비교만을 사용한다. 다른 비교 연산자(<와 같은)를 사용하는 것은 동일 조인으로서의 조인의 자격을 박탈하는 것이다. 위에서 보여준 쿼리는 이미 동일 조인의 예시가 제시되었다.

SELECT *
FROM employee JOIN department
  ON employee.DepartmentID = department.DepartmentID;

우리는 동일 조인을 아래와 같이 쓸 수 있다.

SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;

만약 동일 조인 내에 있는 컬럼들이 동일한 이름을 가지고 있다면, SQL-92USING을 추가함으로써 동일 조인을 표현하기 위한 속기적 개념을 선택적으로 제공한다 :

SELECT *
FROM employee INNER JOIN department USING (DepartmentID);

USING 구문은 단순한 설탕구문이지만, 결과 값이 명시적 구문에 의한 결과 값과는 다르다. 특히 USING 목록 속에 언급된 어떤 컬럼들은 조인에서 각 테이블에 한번 등장하기 보다는, 권한이 없는 이름으로 단 한번만 등장할 것이다. 위의 사례에서, 단인 DepartmentID 컬럼이 해당하고, employee.DepartmentID 또는 department.DepartmentID은 해당되지 않는다.

USING 구문은 MS SQL Server와 Sybase에서는 지원하지 않는다.

자연 조인[편집]

자연 조인(natural join)은 동일 조인의 한 유형으로 조인 구문이 조인된 테이블에서 동일한 컬럼명을 가진 2개의 테이블에서 모든 컬럼들을 비교함으로써, 암시적으로 일어나는 구문이다. 결과적으로 나온 조인된 테이블은 동일한 이름을 가진 컬럼의 각 쌍에 대한 단 하나의 컬럼만 포함하고 있다.

대부분의 전문가들은 NATURAL JOIN이 위험한 것이며, 그러므로 이것의 사용을 강력하게 비권장하고 있다. 그러한 위험은 다른 테이블에 다른 컬럼으로 동일한 이름을 가진 새로운 컬럼을 무심코 추가하는데서 오는 것이다.

현존하는 자연 조인은 자연스럽게 (다른 컬럼에서 온) 이전보다 다른 기준을 이용해서 비교를 위해 비교를 하거나 일치하는 것을 찾아서 새로운 컬럼을 이용할 것이다. 그리하여 테이블 내에 있는 데이터가 변경되지 않고, 증가만 해도 현존하는 질의어는 다른 결과물을 생성할 것이다.

위의 내부 조인을 위한 예제 질의는 다음과 같은 방법으로 자연 조인으로서 표현될 수 있을 것이다.

SELECT *
FROM employee NATURAL JOIN department;

명시적인 USING 구문을 사용해서, 단지 하나의 DepartmentID 컬럼이 조인된 테이블 내에 권한자 없이 생성된다 :

DepartmentID Employee.LastName Department.DepartmentName
34 Smith 사무부
33 Jones 기술부
34 Robinson 사무부
33 Steinberg 기술부
31 Rafferty 영업부

PostgreSQL, MySQL 그리고 오라클 데이터베이스는 자연 조인을 지원하지만, Microsoft T-SQL 또는 IBM DB2는 지원되지 않는다. 조인에 사용된 컬럼들은 암시적이어서, 조인 코드가

기대 컬럼이 어떤 것인지를 보여주지 않으며, 컬럼의 변화는 결과를 바꿀 것이다. 동일한 필드명을 가진 2개의 테이블에서 실행된 내부 조인 은 동일한 결과물을 가진다. SQL:2011 표준에서, 자연 조인은 F401 (확장 조인된 테이블) 패키지의 선택적 부분이다.

특징[편집]

조인 조건 일치 데이터만 반환

내부조인은 두 테이블에서 조인 조건에 해당하는 값이 모두 존재하는 경우에만 그 행들을 결과로 반환한다. 이 때문에 양쪽 테이블에 조건을 만족하는 값이 없으면 아무런 결과도 나오지 않는다.

불필요한 데이터 제거

일치하지 않는 데이터를 자동으로 걸러주기 때문에, 결과 집합이 더 작고 의미 있는 데이터만 포함하게 된다. 이는 보고서나 통계 작업 시 유용하다.

카티션 곱 방지

내부조인은 조인 조건을 명시함으로써, 모든 행의 조합이 생성되는 카티션 곱(Cartesian product)을 방지한다. 조건이 없는 조인은 성능과 정확성 모두에 부정적인 영향을 주기 때문에, 조인 조건이 필수적이다.

성능 효율성

내부조인은 조건에 맞는 데이터만 검색하기 때문에, 적절한 인덱스가 있는 경우 외부조인보다 빠르게 결과를 반환할 수 있다.

다중 테이블 조인 가능

두 개 이상의 테이블도 내부조인을 통해 연결할 수 있다. 이때 테이블 수가 N개라면, N−1개의 내부조인을 사용해야 모든 테이블을 연결할 수 있다.

널(NULL) 값 제외

내부조인은 비교 대상 컬럼 중 하나라도 NULL 값을 가지면 해당 행은 조인 조건을 만족하지 않는 것으로 간주되어 결과에 포함되지 않는다.

다대다 관계 처리 가능

내부조인은 조건을 만족하는 모든 행 조합을 반환하므로, 다대다 관계를 자연스럽게 표현할 수 있다.

내부조인과 다른 조인 종류[편집]

내부조인은 다른 조인 종류들과 비교했을 때 다음과 같은 차이가 있다:

  • 외부조인(Outer Join): 외부조인은 내부조인과 달리, 결합 조건에 맞지 않는 행도 포함시킨다. 예를 들어, 왼쪽 외부조인(LEFT JOIN)은 왼쪽 테이블의 모든 행을 포함시키고, 일치하는 오른쪽 테이블의 데이터만 포함시킨다.
  • 교차조인(Cross Join): 교차조인은 두 테이블의 모든 행을 결합한다. 내부조인처럼 조건이 없어서 모든 가능한 조합을 결과로 반환한다.

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 내부조인 문서는 데이터에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.