티스토리 뷰
INNER JOIN:
먼저 INNER JOIN(또는 SIMPLE JOIN)은 조인 조건을 충족하는 ROWS만 리턴하는 둘 이상의 테이블 조인입니다.
OUTER JOIN:
OUTER JOIN은 INNER JOIN의 결과의 확장입니다. OUTER JOIN은 조인 조건을 충족하는 모든 ROWS을 반환하고 다른 테이블의 행이 조인 조건을 충족하지 않는 일부 또는 모든 행도 리턴합니다.
LEFT OUTER JOIN:
테이블 A와 B의 OUTER JOIN을 수행하고 A(left outer join)의 모든 행을 반환하는 쿼리를 작성하려면 FROM 절에서 LEFT [OUTER] JOIN 구문을 사용하거나 OUTER JOIN 연산자(+)를 WHERE 절의 조인 조건에 있는 B의 모든 컬럼에 적용합니다. B에 일치하는 행이 없는 A의 모든 행에 대해 오라클은 B의 컬럼을 포함하는 모든 select list 표현식에 대해 null을 반환합니다.
RIGHT OUTER JOIN:
테이블 A와 B의 OUTER JOIN을 수행하고 B(right outer join)의 모든 행을 반환하는 쿼리를 작성하려면 FROM 절에서 RIGHT [OUTER] JOIN 구문을 사용하거나 WHERE 절의 조인 조건에서 A의 모든 열에 OUTER JOIN 연산자(+)를 적용합니다. A에 일치하는 행이 없는 B의 모든 행에 대해 Oracle은 A의 열을 포함하는 모든 select list 표현식에 대해 null을 반환합니다.
FULL OUTER JOIN:
OUTER JOIN을 수행하고 조인 조건(full outer join)을 충족하지 않는 경우 null로 확장된 A 및 B의 모든 행을 반환하는 쿼리를 작성하려면 FROM 절에서 FULL [OUTER] JOIN 구문을 사용합니다.
참고
Oracle은 Oracle 조인 연산자(+)보다 FROM 절 OUTER JOIN 구문을 사용할 것을 권장합니다. Oracle 조인 연산자(+)를 사용하는 OUTER JOIN 쿼리에는 FROM 절 OUTER JOIN 구문에 적용되지 않는 여러 규칙 및 제한 사항이 적용됩니다.
아래와 같이 세 개의 테이블이 있을 때 여러 조건으로 LEFT OUTER JOIN에 대한 실습입니다.
SQL> SELECT * FROM TEST02.T72E1;
C1 C2
---------- ----------
100 Android
200 iOS
300 Bada
SQL> SELECT * FROM TEST02.T72E2;
C3 C4 C1
---------- ---------- ----------
1000 A1000 100
2000 B2000 100
3000 C3000 200
4000 D3000 300
SQL> SELECT * FROM TEST02.T72E3;
C5 C6 C3
---------- ---------- ----------
11000 hong 1000
12000 kang
13000 lee
14000 ann 3000
15000 gou 4000
16000 lees 4000
첫 번째 쿼리와 결과는 다음과 같습니다:
select a.c5, a.c6, b.c3, b.c4, c.c1, c.c2
from t72e3 a left outer join t72e2 b
on (a.c5 in (11000, 12000) and a.c3 = b.c3) left outer join t72e1 c
on (b.c1 = c.c1)
order by a.c5;
C5 C6 C3 C4 C1 C2
---------- ---------- ---------- ---------- ---------- ----------
11000 hong 1000 A1000 100 Android
12000 kang
13000 lee
14000 ann
15000 gou
16000 lees
두 번째 쿼리 및 결과입니다:
select a.c5, a.c6, b.c3, b.c4, c.c1, c.c2
from t72e3 a, t72e2 b, t72e1 c
where (a.c5 in (11000, 12000) and a.c3 = b.c3)
and (b.c1 = c.c1)
order by a.c5;
C5 C6 C3 C4 C1 C2
---------- ---------- ---------- ---------- ---------- ----------
11000 hong 1000 A1000 100 Android
데이터 생성
샘플 데이터를 다음과 같이 생성해서 실습해보시길 바랍니다.
set pages 5000
set line 300
select username from all_users;
col username for a25
grant create session to test02 identified by "test02";
grant create table to test02;
select username,default_tablespace from dba_users;
alter user test02 default tablespace tbs_test_01;
alter user test02 quota unlimited on tbs_test_01;
commit;
conn test02/test02
create table test02.t72e1 (c1 varchar2(10) not null primary key, c2 varchar2(10) not null) tablespace tbs_test_01;
insert into test02.t72e1 (c1, c2)
values (100, 'Android');
insert into test02.t72e1 (c1, c2)
values (200, 'iOS');
insert into test02.t72e1 (c1, c2)
values (300, 'Bada');
select * from t72e1;
commit;
create table test02.t72e2 (c3 varchar2(10) not null primary key, c4 varchar2(10) not null, c1 varchar2(10) not null) tablespace tbs_test_01;
insert into test02.t72e2 (c3, c4, c1) values (1000, 'A1000', 100);
insert into test02.t72e2 (c3, c4, c1) values (2000, 'B2000', 100);
insert into test02.t72e2 (c3, c4, c1) values (3000, 'C3000', 200);
insert into test02.t72e2 (c3, c4, c1) values (4000, 'D3000', 300);
select * from test02.t72e2;
commit;
create table test02.t72e3 (c5 varchar2(10) not null primary key, c6 varchar2(10) not null, c3 varchar2(10)) tablespace tbs_test_01;
insert into test02.t72e3 (c5, c6, c3) values (11000, 'hong', 1000);
insert into test02.t72e3 (c5, c6, c3) values (12000, 'kang', NULL);
insert into test02.t72e3 (c5, c6, c3) values (13000, 'lee', NULL);
insert into test02.t72e3 (c5, c6, c3) values (14000, 'ann', 3000);
insert into test02.t72e3 (c5, c6, c3) values (15000, 'gou', 4000);
insert into test02.t72e3 (c5, c6, c3) values (16000, 'lees', 4000);
select * from test02.t72e3;
commit;
'SQL' 카테고리의 다른 글
[SQL] 부모 일반 컬럼에 FOREIGN KEY 속성 불가 (UNIQUE CONSTRAINT, ALTER PRIMARY KEY 실습 내용 추가) (0) | 2022.02.20 |
---|---|
[SQL] GROUP BY, ORDER BY 함께 사용 쿼리 주의 사항 (실습 스크립트 포함) (0) | 2022.02.19 |