강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
컬럼 조인
조회 : 6,705  


컬럼 조인
조인 질의는 조인 대상 테이블에 공통인 컬럼 값을 기반으로 결과를 만든다. 두 테이블의 조인 결과가 두 테이블에 대해 조인 조건을 모두 만족하는 경우를 내부 조인(inner join) 또는 간단히 조인(join)이라 한다.

컬럼 조인(outer join)은 질의 결과가 왼쪽 테이블의 모든 인스턴스를 포함(왼쪽 컬럼 조인)할 수 있고, 오른쪽 테이블의 모든 인스턴스를 포함(오른쪽 컬럼 조인)할 수 있고, 양쪽 인스턴스를 포함(완전 컬럼 조인)할 수도 있다. 테이블이 조인 조건을 만족하는 인스턴스를 가지지 않을 때 질의 결과에서 해당 컬럼은 NULL 값을 가진다.
1) 구문
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는 완전 컬럼 조인을 지원하지 않고, 컬럼 조인에서 조인 조건에 부질의와 하위 컬럼을 포함하는 경로 표현식을 사용할 수 없다.

컬럼 조인의 경우 조인 조건은 내부 조인의 경우와는 다른 방법으로 지정된다. 내부 조인의 조인 조건은 WHERE 절에 표현되지만, 컬럼 조인의 경우에는 조인 조건이 FROM 절에서 ON 키워드 뒤에 나타난다. 다른 검색 조건은 WHERE 절이나 ON 절에서 사용할 수 있지만 검색 조건이 WHERE 절에 있을 때와 ON 절에 있을 때 질의 결과가 달라질 수 있다
2) 예제
다음은 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.
다음은 1950년 이후에 열린 올림픽에서 신기록이 세워진 올림픽의 개최국가와 개최년도를 조회하되, 신기록이 세워지지 않은 올림픽에 대한 정보도 포함하는 예제이다. 이 예제를 오른쪽 컬럼 조인 질의로 나타내면 다음과 같다. 이 예제를 보면 history 테이블의 host_year가 1950보다 큰 범위에서 값이 존재하지 않더라도 모두 포함하여 값을 가져온다. 오른쪽 컬럼 조인 질의이기 때문에 host_nation의 모든 인스턴스를 포함한다. 값이 존재하지 않는 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.
오른쪽 컬럼 조인 질의는 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.
컬럼 조인은 WHERE 절에서 (+)를 사용해서 표현할 수도 있다. 위의 예는 왼쪽 컬럼 조인 질의(LEFT OUTER JOIN)를 이용한 예와 동일한 의미를 지닌 질의이다. (+) 구문은 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.

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1632


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
큐브리드