Post

Oracle Joins

1. Summary

Oracle join은 관련 열의 값을 기준으로 둘 이상의 테이블의 열을 결합하는 데 사용된다. 관련 열은 일반적으로 첫 번째 테이블의 기본 키 열과 두 번째 테이블의 외부 키 열이다.

Oracle은 inner join, left join, right join, full outer join 그리고 cross join을 지원한다.

inner join, left join, 또는 right join을 사용하여 계층 데이터를 쿼리하기 위해 테이블을 자체 결합할 수 있다. 이런 종류의 조인은 self-join 이라고 한다.

2. Sample Tables

  • Create SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
CREATE TABLE palette_a (
    id INT PRIMARY KEY,
    color VARCHAR2 (100) NOT NULL
);

CREATE TABLE palette_b (
    id INT PRIMARY KEY,
    color VARCHAR2 (100) NOT NULL
);

-- insert data for the palette_a
INSERT INTO palette_a (id, color)
VALUES (1, 'Red');

INSERT INTO palette_a (id, color)
VALUES (2, 'Green');

INSERT INTO palette_a (id, color)
VALUES (3, 'Blue');

INSERT INTO palette_a (id, color)
VALUES (4, 'Purple');

-- insert data for the palette_b
INSERT INTO palette_b (id, color)
VALUES (1, 'Green');

INSERT INTO palette_b (id, color)
VALUES (2, 'Red');

INSERT INTO palette_b (id, color)
VALUES (3, 'Cyan');

INSERT INTO palette_b (id, color)
VALUES (4, 'Brown');
  • palett_a Table

palette-a-table

  • palett_b Table

palette-b-table

3. Oracle inner join

색상 열의 값을 사용하여 왼쪽 테이블을 오른쪽 테이블로 결합한다.

  • SQL
1
2
3
4
5
6
7
8
9
SELECT
    a.id id_a,
    a.color color_a,
    b.id id_b,
    b.color color_b
FROM
    palette_a a
INNER JOIN palette_b b
ON a.color = b.color
  • 결과

inner-join-example

inner join은 오른쪽 테이블의 행과 일치하는 왼쪽 테이블의 행을 반환한다.

  • Venn diagram

inner-join-venn-diagram

4. Oracle left join

left join(또는 left outer join)을 사용하여 왼쪽 테이블을 오른쪽 테이블과 결합한다.

  • SQL
1
2
3
4
5
6
7
8
9
SELECT
    a.id id_a,
    a.color color_a,
    b.id id_b,
    b.color color_b
FROM
    palette_a a
LEFT JOIN palette_b b
ON a.color = b.color
  • 결과

left-join-example

left join에서는 오른쪽 테이블에서 사용할 수 있는 경우 일치하는 행이 있는 왼쪽 테이블의 모든 행을 반환한다. 오른쪽 테이블에서 일치하는 행을 찾을 수 없는 경우 left join에는 오른쪽 테이블의 열에 대한 null 값이 포함된다.

  • Venn diagram

left-join-venn-diagram

왼쪽 테이블에 없는 행만 가져오려는 경우도 있다. 이를 위해 left join 및 WHERE 절을 사용하여 오른쪽 테이블에서 행을 제외한다.

다음 SQL은 palette_a에서만 사용할 수 있고 palette_b에서는 사용할 수 없는 색상이 표시된다.

  • SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT
    a.id id_a,
    a.color color_a,
    b.id id_b,
    b.color color_b
FROM
    palette_a a
LEFT JOIN palette_b b
ON a.color = b.color
WHERE
    b.id IS NULL
  • 결과

left-join-example-with-where

  • Venn diagram

left-join-with-where-venn-diagram

5. Oracle right join

right join 또는 right outer join은 left join의 역 버전이다. right join에서는 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 포함하는 결과 집합을 만든다. 일치하는 항목이 없으면 왼쪽이 null 이다.

right join을 사용하여 왼쪽 테이블을 오른쪽 테이블로 조인한다.

  • SQL
1
2
3
4
5
6
7
8
9
SELECT
    a.id id_a,
    a.color color_a,
    b.id id_b,
    b.color color_b
FROM
    palette_a a
RIGHT JOIN palette_b b
ON a.color = b.color
  • 결과

right-join-example

  • Venn diagram

right-join-venn-diagram

WHERE 절을 추가하여 오른쪽 테이블에서만 행을 가져올 수 있지만 왼쪽 테이블에서는 가져올 수 없다.

  • SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT
    a.id id_a,
    a.color color_a,
    b.id id_b,
    b.color color_b
FROM
    palette_a a
RIGHT JOIN palette_b b
ON a.color = b.color
WHERE
    a.id IS NULL
  • 결과

right-join-example-with-where

  • Venn diagram

right-join-with-where-venn-diagram

6. Oracle full outer join

full outer join 또는 full join은 왼쪽 및 오른쪽 테이블의 모든 행을 포함하는 결과 집합을 반환하며 사용 가능한 경우 양쪽에서 일치하는 행을 포함한다. 일치하는 항목이 없으면 누락 된쪽에 null이 된다.

왼쪽 및 오른쪽 테이블의 전체 외부 조인을 보여준다.

  • SQL
1
2
3
4
5
6
7
8
9
SELECT
    a.id id_a,
    a.color color_a,
    b.id id_b,
    b.color color_b
FROM
    palette_a a
FULL OUTER JOIN palette_b b
ON a.color = b.color
  • 결과

full-outer-join-example

OUTER 키워드는 선택 사항이다.

  • Venn diagram

full-outer-join-venn-diagram

왼쪽 및 오른쪽 테이블로부터 고유한 행 집합을 가져오려면 동일한 full join을 수행 후 WHERE 절을 사용하여 양쪽에서 원하지 않는 행을 제외한다.

  • SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT
    a.id id_a,
    a.color color_a,
    b.id id_b,
    b.color color_b
FROM
    palette_a a
FULL JOIN palette_b b
ON a.color = b.color
WHERE
    a.id IS NULL OR b.id IS NULL
  • 결과

full-outer-join-example-with-where

  • Venn diagram

full-outer-join-with-where-venn-diagram

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.