카테고리: 쿼리 구문
이 항목에서는
FROM 절에서 테이블을 조인하는 데 권장되는 방법은 구문¶다음 중 하나를 사용하십시오. SELECT ... FROM <object_ref1> [ { INNER | { LEFT | RIGHT | FULL } [ OUTER ] } ] JOIN <object_ref2> [ ON <condition> ] [ ... ] SELECT * FROM <object_ref1> [ { INNER | { LEFT | RIGHT | FULL } [ OUTER ] } ] JOIN <object_ref2> [ USING( <column_list> ) ] [ ... ] SELECT ... FROM <object_ref1> [ { | NATURAL [ { LEFT | RIGHT | FULL } [ OUTER ] ] | CROSS } ] JOIN <object_ref2> [ ... ]
예¶많은 CREATE TABLE t1 (col1 INTEGER); CREATE TABLE t2 (col1 INTEGER);INSERT INTO t1 (col1) VALUES (2), (3), (4); INSERT INTO t2 (col1) VALUES (1), (2), (2), (3); 내부 조인: SELECT t1.col1, t2.col1 FROM t1 INNER JOIN t2 ON t2.col1 = t1.col1 ORDER BY 1,2; +------+------+ | COL1 | COL1 | |------+------| | 2 | 2 | | 2 | 2 | | 3 | 3 | +------+------+ 이는 왼쪽 외부 조인을 보여줍니다. 테이블 t2에 일치하는 행이 없는 테이블 t1의 행에 대한 NULL 값에 유의하십시오. SELECT t1.col1, t2.col1 FROM t1 LEFT OUTER JOIN t2 ON t2.col1 = t1.col1 ORDER BY 1,2; +------+------+ | COL1 | COL1 | |------+------| | 2 | 2 | | 2 | 2 | | 3 | 3 | | 4 | NULL | +------+------+ 이는 오른쪽 외부 조인을 보여줍니다. 테이블 t2에 일치하는 행이 없는 테이블 t1의 행에 대한 NULL 값에 유의하십시오. SELECT t1.col1, t2.col1 FROM t1 RIGHT OUTER JOIN t2 ON t2.col1 = t1.col1 ORDER BY 1,2; +------+------+ | COL1 | COL1 | |------+------| | 2 | 2 | | 2 | 2 | | 3 | 3 | | NULL | 1 | +------+------+ 이는 전체 외부 조인을 보여줍니다. 각 테이블에는 다른 테이블에서 일치하는 행이 없는 행이 있기 때문에 출력에는 다음과 같이 NULL 값이 있는 두 개의 행이 포함된다는 것에 유의하십시오. SELECT t1.col1, t2.col1 FROM t1 FULL OUTER JOIN t2 ON t2.col1 = t1.col1 ORDER BY 1,2; +------+------+ | COL1 | COL1 | |------+------| | 2 | 2 | | 2 | 2 | | 3 | 3 | | 4 | NULL | | NULL | 1 | +------+------+ 다음은 데카르트 곱을 생성하는 크로스 조인의 예입니다. 크로스 조인에는 ON 절이 없음에 유의하십시오. SELECT t1.col1, t2.col1 FROM t1 CROSS JOIN t2 ORDER BY 1, 2; +------+------+ | COL1 | COL1 | |------+------| | 2 | 1 | | 2 | 2 | | 2 | 2 | | 2 | 3 | | 3 | 1 | | 3 | 2 | | 3 | 2 | | 3 | 3 | | 4 | 1 | | 4 | 2 | | 4 | 2 | | 4 | 3 | +------+------+ 크로스 조인은 아래 예와 같이 SELECT t1.col1, t2.col1 FROM t1 CROSS JOIN t2 WHERE t2.col1 = t1.col1 ORDER BY 1, 2; +------+------+ | COL1 | COL1 | |------+------| | 2 | 2 | | 2 | 2 | | 3 | 3 | +------+------+ 이는 자연 조인의 예입니다. 이렇게 할 경우, 출력에 조인 열의 두 번째 복사본이 포함되지 않는다는 점을 제외하고는, 해당 내부 조인과 동일한 출력이 다음과 같이 생성됩니다. CREATE OR REPLACE TABLE d1 ( id number, name string ); +--------------------------------+ | status | |--------------------------------| | Table D1 successfully created. | +--------------------------------+ INSERT INTO d1 (id, name) VALUES (1,'a'), (2,'b'), (4,'c'); +-------------------------+ | number of rows inserted | |-------------------------| | 3 | +-------------------------+ CREATE OR REPLACE TABLE d2 ( id number, value string ); +--------------------------------+ | status | |--------------------------------| | Table D2 successfully created. | +--------------------------------+ INSERT INTO d2 (id, value) VALUES (1,'xx'), (2,'yy'), (5,'zz'); +-------------------------+ | number of rows inserted | |-------------------------| | 3 | +-------------------------+ SELECT * FROM d1 NATURAL INNER JOIN d2 ORDER BY id; +----+------+-------+ | ID | NAME | VALUE | |----+------+-------| | 1 | a | xx | | 2 | b | yy | +----+------+-------+ 자연 조인은 외부 조인과 결합될 수 있습니다. 예를 들면 다음과 같습니다. SELECT * FROM d1 NATURAL FULL OUTER JOIN d2 ORDER BY ID; +----+------+-------+ | ID | NAME | VALUE | |----+------+-------| | 1 | a | xx | | 2 | b | yy | | 4 | c | NULL | | 5 | NULL | zz | +----+------+-------+ 조인은 CREATE TABLE t3 (col1 INTEGER); INSERT INTO t3 (col1) VALUES (2), (6);SELECT t1.*, t2.*, t3.* FROM t1 LEFT OUTER JOIN t2 ON (t1.col1 = t2.col1) RIGHT OUTER JOIN t3 ON (t3.col1 = t2.col1) ORDER BY t1.col1; +------+------+------+ | COL1 | COL1 | COL1 | |------+------+------| | 2 | 2 | 2 | | 2 | 2 | 2 | | NULL | NULL | 6 | +------+------+------+ 이러한 쿼리에서 결과는 왼쪽에서 오른쪽으로 발생하는 조인을 기반으로 결정됩니다(단, 다른 조인 순서가 동일 결과를 생성하는 경우, 옵티마이저가 조인을 재정렬할 수 있음). 오른쪽 외부 조인이 왼쪽 외부 조인보다 먼저 발생해야 하는 경우, 쿼리는 다음과 같이 작성할 수 있습니다. SELECT t1.*, t2.*, t3.* FROM t1 LEFT OUTER JOIN (t2 RIGHT OUTER JOIN t3 ON (t3.col1 = t2.col1)) ON (t1.col1 = t2.col1) ORDER BY t1.col1; +------+------+------+ | COL1 | COL1 | COL1 | |------+------+------| | 2 | 2 | 2 | | 2 | 2 | 2 | | 3 | NULL | NULL | | 4 | NULL | NULL | +------+------+------+ 아래의 두 가지 예는 이 첫 번째 예는 올바른 사용법을 보여줍니다. 특히, 프로젝션 목록에는 《*》만 있고 다른 것은 없습니다. 쿼리가 두 개의 테이블을 조인하고, 각 테이블에 하나의 열이 있고, 쿼리가 모든 열을 요청하더라도 출력에는 두 개의 열이 아니라 하나의 열이 포함됩니다. WITH l AS ( SELECT 'a' AS userid ), r AS ( SELECT 'b' AS userid ) SELECT * FROM l LEFT JOIN r USING(userid) ; +--------+ | USERID | |--------| | a | +--------+ 다음 예는 비표준 사용법을 보여줍니다. 프로젝션 목록에는 《*》가 아닌 다른 항목이 있습니다. 이 사용법은 비표준이기 때문에 출력에는 《userid》라는 두 개의 열이 포함되고, 두 번째 발생 항목(테이블 〈r’의 값을 포함할 것으로 예상할 수 있음)에는 테이블에 없는 값이 포함됩니다(값 〈a’는 테이블 〈r’에 없음). WITH l AS ( SELECT 'a' AS userid ), r AS ( SELECT 'b' AS userid ) SELECT l.userid as UI_L, r.userid as UI_R -- Incorrect usage! FROM l LEFT JOIN r USING(userid) ; +------+------+ | UI_L | UI_R | |------+------| | a | NULL | +------+------+ |