Upload
chariehong
View
142
Download
9
Embed Size (px)
Citation preview
The Technique of Java Programming
들어가기
이 자료는 교육 등 비영리 목적으로만 사용해야 합니다 !!!!
만든사람 및 책 소개
• 오라클 SQL과 PL/SQL을 다루는 기술 : 오라클 프로그래밍 , 현장 밀착 입문서는 따로 있다 !
• 홍형경
• 주요 저서 : - 〈뇌를 자극하는 오라클 프로그래밍 SQL&PL/SQL
- Head First 시리즈를 비롯해 다수의 책 번역
조인과 서브쿼리첫째 마당 오라클 프로그래밍의 시작 , SQL
6 장
01 조인의 종류
내부조인과 외부조인
ANSI 조인
서브쿼리
02
03
조인과 서브쿼리
04
01
조인이란 ? : 테이블 ( 혹은 뷰 ) 간의 관계를 맺는 방법
조인의 종류
조인 연산자에 따른 구분 : 동등 조인 , 안티 조인
조인대상에 따른 구분 : 셀프 조인
조인 조건에 따른 구분 : 내부 조인 , 외부 조인 , 세미 조인 , 카타시안 조인 (CATASIAN PRODUCT)
기타 : ANSI 조인
조인의 종류
02
내부조인
내부조인과 외부조인
● 가장 기본적이고 일반적인 조인 방법
● WHERE 절에서 등호 (‘=’) 연산자를 사용해 2 개 이상의 테이블이나 뷰를 연결한 조인 조인조건
● 컬럼 단위로 조인조건 기술
● SELECT * FROM TAB1 a, TAB2 b WHERE a.col1 = b.col1 ….
동등 조인 (EQUI JOIN)
02
내부조인
내부조인과 외부조인
● 서브쿼리를 사용해 서브쿼리에 존재하는 데이터만 메인 쿼리에서 추출하는 조인
● WHERE 절에서 IN 과 EXISTS 연산자를 사용한 조인방법
● SELECT * FROM TAB1 a WHERE EXISTS ( SELECT 1 FROM TAB2 b WHERE a.col1 = b.col1 …. );
세미 조인 (SEMI JOIN)
02
내부조인
내부조인과 외부조인
● SELECT * FROM TAB1 a WHERE a.col1 IN ( SELECT b.col1 FROM TAB2 b WHERE …. …. );
● 세미 조인은 서브쿼리에 존재하는 메인쿼리 데이터가 여러 건 존재하더라도 최종 반환되는 메인쿼리 데이터에는 중복되는 건이 없다 일반 조인과의 차이점
세미 조인 (SEMI JOIN)
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)
02
내부조인
내부조인과 외부조인
● SELECT * FROM TAB1 a WHERE a.col1 NOT IN ( SELECT b.col1 FROM TAB2 b WHERE …. …. );
안티 조인 (ANTI JOIN)
02
내부조인
내부조인과 외부조인
● 서로 다른 두 테이블이 아닌 동일한 한 테이블을 사용해 조인
● SELECT * FROM TAB1 a, TAB1 b WHERE a.col1 = b.col1 …. ;
셀프 조인 (SELF JOIN)
02
외부조인
내부조인과 외부조인
● 일반 조인을 확장한 개념
● 조인 조건에 만족하는 데이터 뿐만 아니라 , 어느 한 쪽 테이블에 조인 조건에 명시된 컬럼에 값이 없거나 (NULL 이더라도 ) 해당 로우가 아예 없더라도 데이터를 모두 추출
● 조인조건에서 데이터가 없는 쪽 테이블의 컬럼 끝에 (+) 를 붙인다
● 조인조건이 여러 개일 경우 모든 조인조건에 (+) 를 붙여야 한다
외부 조인 (OUTER JOIN)
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)
02
외부조인
내부조인과 외부조인
● 한 번에 한 테이블에만 외부 조인 A 와 B 테이블을 외부 조인으로 연결했다면 , 동시에 A 와 C 테이블에 외부 조인을 걸 수는 없다 . ● (+) 연산자가 붙은 조건과 OR 를 같이 사용할 수 없다
● (+) 연산자가 붙은 조건에는 IN 연산자를 같이 사용할 수 없다 . 단 IN 절에 포함되는 값이
1 개인 때는 사용 가능하다 .
외부 조인 (OUTER JOIN)
02
외부조인
내부조인과 외부조인
● 조인조건이 없는 조인 ● FROM 절에 A 와 B, 2 개의 테이블을 명시했을 경우 , 추출되는 데이터는
A 테이블 데이터 건수 * B 테이블 데이터 건수
카타시안 조인 (CATASIAN PRODUCT)
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 내부조인
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 외부조인
03
ANSI 조인
● SELECT A. 컬럼 1, A. 컬럼 2, B. 컬럼 1, B. 컬럼 2 … FROM 테이블 A CROSS JOIN 테이블 B WHERE …. ;
● 카타시안 조인을 ANSI 조인에서는 CROSS 조인이라 함
● FROM 절에 CROSS JOIN 명시
ANSI CROSS 조인
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 조인
03
ANSI 조인
● FROM 절에 FULL OUTER JOIN 명시
● FULL OUTER JOIN 은 ANSI 조인에만 있다 (+) 를 붙이는 기존 형태로는 구현 불가
ANSI FULL OUTER 조인
04
서브쿼리
● 한 SQL 문장 안에서 보조로 사용되는 또 다른 SELECT 문
● 메인 쿼리를 기준으로 보조 역할을 한다
● SELECT, FROM, WHERE 절 뿐만 아니라 , INSERT, UPDATE, MERGE, DELETE 문에서도
서브쿼리를 사용할 수 있다
서브쿼리란 ?
04
서브쿼리
● 메인쿼리와의 연관성에 따라
- 연관성 없는 (Noncorrelated) 서브쿼리
- 연관성 있는 서브쿼리
● 형태에 따라
- 일반 서브쿼리 (SELECT 절 )
- 인라인 뷰 (FROM 절 )
- 중첩쿼리 (WHERE 절 )
서브쿼리의 종류
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);
연관성 없는 서브쿼리
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);
연관성 없는 서브쿼리
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 );
연관성 있는 서브쿼리
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 ) );
연관성 있는 서브쿼리
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;
인라인 뷰