28
The Technique of Java Programming

오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

Embed Size (px)

Citation preview

Page 1: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

The Technique of Java Programming

Page 2: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

들어가기

이 자료는 교육 등 비영리 목적으로만 사용해야 합니다 !!!!

Page 3: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

만든사람 및 책 소개

• 오라클 SQL과 PL/SQL을 다루는 기술 : 오라클 프로그래밍 , 현장 밀착 입문서는 따로 있다 !

• 홍형경

• 주요 저서 : - 〈뇌를 자극하는 오라클 프로그래밍 SQL&PL/SQL

- Head First 시리즈를 비롯해 다수의 책 번역

Page 4: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

조인과 서브쿼리첫째 마당 오라클 프로그래밍의 시작 , SQL

6 장

Page 5: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

01 조인의 종류

내부조인과 외부조인

ANSI 조인

서브쿼리

02

03

조인과 서브쿼리

04

Page 6: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

01

조인이란 ? : 테이블 ( 혹은 뷰 ) 간의 관계를 맺는 방법

조인의 종류

조인 연산자에 따른 구분 : 동등 조인 , 안티 조인

조인대상에 따른 구분 : 셀프 조인

조인 조건에 따른 구분 : 내부 조인 , 외부 조인 , 세미 조인 , 카타시안 조인 (CATASIAN PRODUCT)

기타 : ANSI 조인

조인의 종류

Page 7: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

내부조인

내부조인과 외부조인

● 가장 기본적이고 일반적인 조인 방법

● WHERE 절에서 등호 (‘=’) 연산자를 사용해 2 개 이상의 테이블이나 뷰를 연결한 조인 조인조건

● 컬럼 단위로 조인조건 기술

● SELECT * FROM TAB1 a, TAB2 b WHERE a.col1 = b.col1 ….

동등 조인 (EQUI JOIN)

Page 8: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

내부조인

내부조인과 외부조인

● 서브쿼리를 사용해 서브쿼리에 존재하는 데이터만 메인 쿼리에서 추출하는 조인

● WHERE 절에서 IN 과 EXISTS 연산자를 사용한 조인방법

● SELECT * FROM TAB1 a WHERE EXISTS ( SELECT 1 FROM TAB2 b WHERE a.col1 = b.col1 …. );

세미 조인 (SEMI JOIN)

Page 9: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

내부조인

내부조인과 외부조인

● SELECT * FROM TAB1 a WHERE a.col1 IN ( SELECT b.col1 FROM TAB2 b WHERE …. …. );

● 세미 조인은 서브쿼리에 존재하는 메인쿼리 데이터가 여러 건 존재하더라도 최종 반환되는 메인쿼리 데이터에는 중복되는 건이 없다 일반 조인과의 차이점

세미 조인 (SEMI JOIN)

Page 10: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

내부조인

내부조인과 외부조인

● 서브쿼리 테이블에는 없는 , 메인쿼리 테이블의 데이터만 추출하는 조인 방법

● WHERE 절에서 NOT IN 과 NOT EXISTS 연산자를 사용한 조인방법

● SELECT * FROM TAB1 a WHERE NOT EXISTS ( SELECT 1 FROM TAB2 b WHERE a.col1 = b.col1 …. );

안티 조인 (ANTI JOIN)

Page 11: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

내부조인

내부조인과 외부조인

● SELECT * FROM TAB1 a WHERE a.col1 NOT IN ( SELECT b.col1 FROM TAB2 b WHERE …. …. );

안티 조인 (ANTI JOIN)

Page 12: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

내부조인

내부조인과 외부조인

● 서로 다른 두 테이블이 아닌 동일한 한 테이블을 사용해 조인

● SELECT * FROM TAB1 a, TAB1 b WHERE a.col1 = b.col1 …. ;

셀프 조인 (SELF JOIN)

Page 13: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

외부조인

내부조인과 외부조인

● 일반 조인을 확장한 개념

● 조인 조건에 만족하는 데이터 뿐만 아니라 , 어느 한 쪽 테이블에 조인 조건에 명시된 컬럼에 값이 없거나 (NULL 이더라도 ) 해당 로우가 아예 없더라도 데이터를 모두 추출

● 조인조건에서 데이터가 없는 쪽 테이블의 컬럼 끝에 (+) 를 붙인다

● 조인조건이 여러 개일 경우 모든 조인조건에 (+) 를 붙여야 한다

외부 조인 (OUTER JOIN)

Page 14: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

외부조인

내부조인과 외부조인

● SELECT a.department_id, a.department_name, b.job_id, b.department_id FROM departments a, job_history b WHERE a.department_id = b.department_id; 일반조인 , 결과는 10 건

● SELECT a.department_id, a.department_name, b.job_id, b.department_id FROM departments a, job_history b WHERE a.department_id = b.department_id(+); 외부조인 , 결과는 31 건

외부 조인 (OUTER JOIN)

Page 15: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

외부조인

내부조인과 외부조인

● 한 번에 한 테이블에만 외부 조인 A 와 B 테이블을 외부 조인으로 연결했다면 , 동시에 A 와 C 테이블에 외부 조인을 걸 수는 없다 . ● (+) 연산자가 붙은 조건과 OR 를 같이 사용할 수 없다

● (+) 연산자가 붙은 조건에는 IN 연산자를 같이 사용할 수 없다 . 단 IN 절에 포함되는 값이

1 개인 때는 사용 가능하다 .

외부 조인 (OUTER JOIN)

Page 16: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

02

외부조인

내부조인과 외부조인

● 조인조건이 없는 조인 ● FROM 절에 A 와 B, 2 개의 테이블을 명시했을 경우 , 추출되는 데이터는

A 테이블 데이터 건수 * B 테이블 데이터 건수

카타시안 조인 (CATASIAN PRODUCT)

Page 17: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

03

ANSI SQL 문법을 사용한 조인

ANSI 조인

● SELECT A. 컬럼 1, A. 컬럼 2, B. 컬럼 1, B. 컬럼 2 … FROM 테이블 A INNER JOIN 테이블 B ON ( A. 컬럼 1 = B. 컬럼 1) -- 조인 조건 WHERE …. ; ● 내부조인의 경우 FROM 절에 INNER JOIN 을 명시

● 조인조건은 ON 절에 명시

● 테이블간 조인조건 외의 다른 조건은 WHERE 절에 명시한다 .

ANSI 내부조인

Page 18: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

03

ANSI 조인

● SELECT A. 컬럼 1, A. 컬럼 2, B. 컬럼 1, B. 컬럼 2 … FROM 테이블 A LEFT(RIGHT) [OUTER] JOIN 테이블 B ON ( A. 컬럼 1 = B. 컬럼 1) -- 조인 조건 WHERE …. ; ● FROM 절에 LEFT(RIGHT) [OUTER] JOIN 을 명시 , 조인조건은 ON 절에 명시

● 일반외부조인에서는 기준 테이블과 대상 테이블 ( 데이터가 없는 테이블 ) 에서 대상 테이블쪽

조인 조건에 (+) 를 붙였지만 , ANSI 외부 조인은 FROM 절에 명시된 테이블 순서에 입각해

먼저 명시된 테이블 기준으로 LEFT 혹은 RIGHT 을 붙인다

● OUTER 는 생략 가능

ANSI 외부조인

Page 19: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

03

ANSI 조인

● SELECT A. 컬럼 1, A. 컬럼 2, B. 컬럼 1, B. 컬럼 2 … FROM 테이블 A CROSS JOIN 테이블 B WHERE …. ;

● 카타시안 조인을 ANSI 조인에서는 CROSS 조인이라 함

● FROM 절에 CROSS JOIN 명시

ANSI CROSS 조인

Page 20: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

03

ANSI 조인

● 일반적인 외부 조인은 두 테이블 중 어느 한 테이블에 조인 조건에 만족하는 데이터가 없더라도

두 테이블 데이터 모두 조회되는 조인 한 쪽 이빨이 빠진 형태

● 한 쪽 테이블이 아닌 두 테이블 모두 데이터가 없는 경우 , 두 쪽 테이블 모두 이빨이 빠진 형태의

결과가 추출되는 외부조인이 FULL OUTER 조인이다 .

● 조인조건을 기준으로 두 테이블 중 어느 한 쪽에만 데이터가 있으면 조회된다

● SELECT a.emp_id, b.emp_id FROM hong_a a FULL OUTER JOIN hong_b b ON ( a.emp_id = b.emp_id);

ANSI FULL OUTER 조인

Page 21: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

03

ANSI 조인

● FROM 절에 FULL OUTER JOIN 명시

● FULL OUTER JOIN 은 ANSI 조인에만 있다 (+) 를 붙이는 기존 형태로는 구현 불가

ANSI FULL OUTER 조인

Page 22: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

04

서브쿼리

● 한 SQL 문장 안에서 보조로 사용되는 또 다른 SELECT 문

● 메인 쿼리를 기준으로 보조 역할을 한다

● SELECT, FROM, WHERE 절 뿐만 아니라 , INSERT, UPDATE, MERGE, DELETE 문에서도

서브쿼리를 사용할 수 있다

서브쿼리란 ?

Page 23: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

04

서브쿼리

● 메인쿼리와의 연관성에 따라

- 연관성 없는 (Noncorrelated) 서브쿼리

- 연관성 있는 서브쿼리

● 형태에 따라

- 일반 서브쿼리 (SELECT 절 )

- 인라인 뷰 (FROM 절 )

- 중첩쿼리 (WHERE 절 )

서브쿼리의 종류

Page 24: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

04

서브쿼리

● 메인쿼리와의 연관성이 없는 서브쿼리 메인 테이블과 조인 조건이 걸리지 않음

● 유형 1

SELECT count(*) FROM employees WHERE salary >= ( SELECT AVG(salary) FROM employees );

● 유형 2

SELECT count(*) FROM employees WHERE department_id IN ( SELECT department_id FROM departments WHERE parent_id IS NULL);

연관성 없는 서브쿼리

Page 25: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

04

서브쿼리

● 유형 3

SELECT employee_id, emp_name, job_id FROM employees WHERE (employee_id, job_id ) IN ( SELECT employee_id, job_id FROM job_history);

연관성 없는 서브쿼리

Page 26: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

04

서브쿼리

● 메인쿼리와의 연관성이 있는 서브쿼리 메인 테이블과 조인 조건이 걸려있다

● 유형 1

SELECT a.department_id, a.department_name FROM departments a WHERE EXISTS ( SELECT 1 FROM job_history b WHERE a.department_id = b.department_id );

연관성 있는 서브쿼리

Page 27: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

04

서브쿼리

● 유형 2

SELECT a.department_id, a.department_name FROM departments a WHERE EXISTS ( SELECT 1 FROM employees b WHERE a.department_id = b.department_id AND b.salary > ( SELECT AVG(salary) FROM employees ) );

연관성 있는 서브쿼리

Page 28: 오라클 SQL과 PL/SQL을 다루는 기술 - 6장.조인과 서브쿼리

04

서브쿼리

● FROM 절에 사용하는 서브쿼리를 말한다

SELECT a.employee_id, a.emp_name, b.department_id, b.department_name FROM employees a, departments b, ( SELECT AVG(c.salary) AS avg_salary FROM departments b, employees c WHERE b.parent_id = 90 -- 기획부 AND b.department_id = c.department_id ) d WHERE a.department_id = b.department_id AND a.salary > d.avg_salary;

인라인 뷰