Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

조인 질의

설명

조인은 두 개 이상의 테이블 또는 뷰(view)에 대해 행(row)을 결합하는 질의이다. 조인 질의에서 두 개 이상의 테이블에 공통인 컬럼을 비교하는 조건을 조인 조건이라고 하며, 조인된 각 테이블로부터 행을 가져와 지정된 조인 조건을 만족하는 경우에만 결과 행을 결합한다.

조인 질의에서 동등 연산자(=)를 이용한 조인 조건을 포함하는 조인 질의를 동등 조인(equi-join)이라 하고, 조인 조건이 없는 조인 질의를 카티션 곱(cartesian products)이라 한다. 또한, 하나의 테이블을 조인하는 경우를 자체 조인(self join)이라 하는데, 자체 조인에서는 FROM 절에 같은 테이블이 두 번 사용되므로 테이블 별칭(alias)을 사용하여 컬럼을 구분한다.

한편, 조인된 테이블에 대해 조인 조건을 만족하는 행만 결과를 출력하는 경우를 내부 조인(inner join) 또는 간단 조인(simple join)이라고 하며, 조인된 테이블에 대해 조인 조건을 만족하는 행은 물론, 조인 조건을 만족하지 못하는 행도 포함하여 출력하는 경우를 외부 조인(outer join)이라 한다. 외부 조인은 왼쪽 테이블의 모든 행이 결과로 출력되는 왼쪽 외부 조인과(left outer join)과 오른쪽 테이블의 모든 행이 결과로 출력되는 오른쪽 외부 조인(right outer join)이 있으며, 양쪽의 행이 모두 출력되는 완전 외부 조인(full outer join)이 있다. 이때, 외부 조인 질의 결과에서 한쪽 테이블에 대해 대응되는 컬럼 값이 없는 경우, 이는 모두 NULL로 반환된다.

구문

FROM table_specification [{, table_specification | qualified_join_table_specification}...]

 

table_specification :

table_specification [ correlation ]

CLASS table_name [ correlation ]

subquery correlation

TABLE (expression) correlation

 

qualified_join_table_specification :

[ INNER | {LEFT | RIGHT} [ OUTER ] ] JOIN table_specification

join_condition

 

join_condition :

ON search_condition

  • qualified_join_table_specification :
    LEFT | RIGHT } [ OUTER ] JOIN : LEFT는 왼쪽 외부 조인을 수행하는 질의를 만드는데 사용되고, RIGHT는 오른쪽 외부 조인을 수행하는 질의를 만드는데 사용된다.

CUBRID는 왼쪽 외부 조인과 오른쪽 외부 조인만 지원하며, 완전 외부 조인(full outer join)을 지원하지 않는다. 또한, 외부 조인에서 조인 조건에 부질의와 하위 컬럼을 포함하는 경로 표현식을 사용할 수 없다.

외부 조인의 경우 조인 조건은 내부 조인의 경우와는 다른 방법으로 지정된다. 내부 조인의 조인 조건은 WHERE 절에 표현되지만, 외부 조인의 경우에는 조인 조건이 FROM 절에서 ON 키워드 뒤에 나타난다. 다른 검색 조건은 WHERE 절이나 ON 절에서 사용할 수 있지만 검색 조건이 WHERE 절에 있을 때와 ON 절에 있을 때 질의 결과가 달라질 수 있다.

FROM 절에 명시된 순서대로 테이블 실행 순서가 고정되므로, 외부 조인을 사용하는 경우 테이블 순서에 주의하여 질의문을 작성한다. 외부 조인 연산자 '(+)'를 WHERE 절에 명시하여 Oracle 스타일의 조인 질의문도 작성 가능하나, 실행 결과나 실행 계획이 원하지 않는 방향으로 유도될 수 있으므로 { LEFT | RIGHT } [ OUTER ] JOIN 을 이용한 표준 구문을 사용할 것을 권장한다.

예제 1

다음은 내부 조인을 이용하여 1950년 이후에 열린 올림픽 중에서 신기록이 세워진 올림픽의 개최년도와 개최국가를 조회하는 예제이다. 다음 질의는 history 테이블의 host_year가 1950보다 큰 범위에서 값이 존재하는 레코드를 가져온다.

SELECT DISTINCT h.host_year, o.host_nation FROM history h, olympic o
WHERE h.host_year=o.host_year AND o.host_year>1950;  
=== <Result of SELECT Command in Line 2> ===
    host_year  host_nation
===================================
         1968  'Mexico'
         1980  'U.S.S.R.'
         1984  'United States of America'
         1988  'Korea'
         1992  'Spain'
         1996  'United States of America'
         2000  'Australia'
         2004  'Greece'    
8 rows selected.

예제 2

다음은 외부 조인을 이용하여 1950년 이후에 열린 올림픽에서 신기록이 세워진 올림픽의 개최국가와 개최년도를 조회하되, 신기록이 세워지지 않은 올림픽에 대한 정보도 포함하는 예제이다. 이 예제는 오른쪽 외부 조인이므로, olympic 테이블의 host_nation의 모든 레코드를 포함하고, 값이 존재하지 않는 history 테이블의 host_year에 대해서는 컬럼 값으로 NULL을 반환한다.

SELECT DISTINCT h.host_year, o.host_nation
FROM history h RIGHT OUTER JOIN olympic o ON h.host_year=o.host_year WHERE o.host_year>1950;
=== <Result of SELECT Command in Line 3> ===
    host_year  host_nation
===================================
         NULL  'Australia'
         NULL  'Canada'
         NULL  'Finland'
         NULL  'Germany'
         NULL  'Italy'
         NULL  'Japan'
         1968  'Mexico'
         1980  'U.S.S.R.'
         1984  'United States of America'
         1988  'Korea'
         1992  'Spain'
         1996  'United States of America'
         2000  'Australia'
         2004  'Greece'    
14 rows selected.

예제 3

다음은 왼쪽 외부 조인을 이용하여 예제 2와 동일한 결과를 출력하는 예제이다. FROM 절에서 두 테이블의 순서를 바꾸어 명시한 후, 왼쪽 외부 조인을 수행한다.

SELECT DISTINCT h.host_year, o.host_nation
FROM olympic o LEFT OUTER JOIN history h ON h.host_year=o.host_year WHERE o.host_year>1950;
=== <Result of SELECT Command in Line 3> ===
    host_year  host_nation
===================================
         NULL  'Australia'
         NULL  'Canada'
         NULL  'Finland'
         NULL  'Germany'
         NULL  'Italy'
         NULL  'Japan'
         1968  'Mexico'
         1980  'U.S.S.R.'
         1984  'United States of America'
         1988  'Korea'
         1992  'Spain'
         1996  'United States of America'
         2000  'Australia'
         2004  'Greece' 
14 rows selected.

이 예에서 h.host_year=o.host_year는 외부 조인 조건이고 o.host_year > 1950은 검색 조건이다. 만약 검색 조건이 WHERE 절이 아닌 ON 절에서 조인 조건으로 사용될 경우 질의의 의미와 결과는 달라진다. 다음 질의는 o.host_year가 1950보다 크지 않은 값도 질의 결과에 포함된다.

SELECT DISTINCT h.host_year, o.host_nation
FROM olympic o LEFT OUTER JOIN history h ON h.host_year=o.host_year AND o.host_year>1950;    
=== <Result of SELECT Command in Line 3> ===
    host_year  host_nation
===================================
         NULL  'Australia'
         NULL  'Belgium'
         NULL  'Canada'
...
         1996  'United States of America'
         2000  'Australia'
         2004  'Greece'
21 rows selected.

예제 4

다음은 WHERE 절에서 (+)를 사용해서 외부 조인 질의를 작성한 예이며, 예제 2, 예제 3과 같은 결과를 출력한다. 단, (+) 연산자를 이용한 Oracle 스타일의 외부 조인 질의문은 ISO/ANSI 표준이 아니며 모호한 상황을 만들어 낼 수 있으므로 가능하면 표준 구문인 LEFT OUTER JOIN(또는 RIGHT OUTER JOIN)을 사용할 것을 권장한다.

SELECT DISTINCT h.host_year, o.host_nation FROM history h, olympic o
WHERE o.host_year=h.host_year(+) AND o.host_year>1950;
=== <Result of SELECT Command in Line 2> ===
    host_year  host_nation
===================================
         NULL  'Australia'
         NULL  'Canada'
         NULL  'Finland'
         NULL  'Germany'
         NULL  'Italy'
         NULL  'Japan'
         1968  'Mexico'
         1980  'U.S.S.R.'
         1984  'United States of America'
         1988  'Korea'
         1992  'Spain'
         1996  'United States of America'
         2000  'Australia'
         2004  'Greece'    
14 rows selected.