조인 질의는 조인 대상 테이블에 공통인 컬럼 값을 기반으로 결과를 만든다. 두 테이블의 조인 결과가 두 테이블에 대해 조인 조건을 모두 만족하는 경우를 내부 조인(inner join) 또는 간단히 조인(join)이라 한다.
외부 조인(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
CUBRID는 완전 외부 조인을 지원하지 않고, 외부 조인에서 조인 조건에 부질의와 하위 컬럼을 포함하는 경로 표현식을 사용할 수 없다.
외부 조인의 경우 조인 조건은 내부 조인의 경우와는 다른 방법으로 지정된다. 내부 조인의 조인 조건은 WHERE 절에 표현되지만, 외부 조인의 경우에는 조인 조건이 FROM 절에서 ON 키워드 뒤에 나타난다. 다른 검색 조건은 WHERE 절이나 ON 절에서 사용할 수 있지만 검색 조건이 WHERE 절에 있을 때와 ON 절에 있을 때 질의 결과가 달라질 수 있다.
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.
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.
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.
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.
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.