5장 조인
두개 이상 테이블의 컬럼 출력 시 Join을 사용해 컬럼의 정보를 가져옴
- ANSI 호환 JOIN : 모든 SQL에서 공통으로 사용하는 JOIN구문 ( Oracle, MY_SQL(Maria DB), MS-SQL, IBM DB2, …)
EQUI JOIN
공통 키컬럼을 이용해 두 테이블의 교집합 출력
- 오라클 only ( 다른 SQL에서 호환 불가) ANSI 호환의 SQL구문에서 INNER JOIN과 같음
- select절에 공통 키 컬럼 출력시 반드시 테이블명을 명시 (if not 오류 발생)
- from절에 join할 테이블 명시, comma(,)를 사용해 나열
- using절에 공통 키 컬럼 지정
- where절에 두 테이블의 공통 키 컬럼을 찾아서 ‘=’
- and절에서 조건을 처리
- INNER JOIN (ANSI 호환 JOIN)
- from절에 INNER JOIN
- on절에 공통된 키 컬럼을 ‘=’로 처리
- where에서 조건을 처리함
`
select eno 사원번호, ename 사원명, employee.dno 부서번호, dname 부서명, loc 부서위치
from employee, department --조인할 테이블 나열
using (dno)
where employee.dno = department.dno --두 테이블의 공통 키컬럼을 찾아서 '=' 처리
and employee.dno >=20; --조건 처리
--inner join
select ena 사원번호, ename 사원명, dno 부서번호, dname 부서명, loc 부서위치
from employee e INNER JOIN department d -- inner join
on e.dno = d.dno --공통 키컬럼을 '=' 처리
where e.dno >=20; --where로 조건을 처리함
NATURAL JOIN
- 오라클 only (공통의 키 컬럼을 Oracle 내부에서 자동으로 공동 키컬럼을 찾아서 처리함) equi join과 같이 where 절에 두 테이블 공통 키 컬럼을 명시하지 않아도 됨
- 두 테이블의 공통 키 컬럼은 동일한 타입이어야 함
- select 절에서 공통 키컬럼 출력시 테이블명을 명시하면 오류 발생
- from 절에서 natural join 사용
select ename 이름, salary 월급, dno 부서번호, dname 부서명 --테이블 명을 명시하면 안됨
from employee e natural join department d
where salary >=2000;
NON EQUI JOIN
- 오라클 only
- from절에 테이블을 ,로 나열
- where 절에 비교구문(<, >=), between~and 사용(공통 키 컬럼 없이 join), ‘=’을 사용하지 않음
select eno, hiredate, e.dno, salary, grade, dname
from employee e, department d, salgrade s
where e.dno=d.dno
and salary between losal and hisal;
SELF JOIN
- 자신의 테이블(원본)을 가상의 테이블(원본을 복사한 테이블)에 join 반드시 별칭을 사용해 join, 상속관계 조회에 유용함
select e.ename 사원, e.manager 상관번호, m.eno 상관번호, m.ename 상관 from employee e, employee m -- 같은 테이블 사용, 반드시 별칭 적용 where e.manager = m.eno order by e.ename asc;OUTER JOIN
- 두 테이블에 공통적이지 않은 내용까지 출력 (null 포함) 오라클에서는 plus(+)를 사용해 outer join
- ANSI 호환 구문
- LEFT [OUTER] JOIN : 왼쪽 테이블 모든 레코드 출력
- RIGHT [OUTER] JOIN : 오른쪽 테이블 모든 레코드 출력
- FULL [OUTER] JOIN : 양쪽 테이블 모든 레코드 출력
카디시안 곱
- 모든 레코드 조합 출력 (한 쪽만 데이터 있을 경우 반대 측은 null)
6장 서브쿼리
단일행 서브쿼리
- 내부 쿼리문의 결과로 한 개의 행 반환
- 단일행 비교연산자 (>, >=, <, <=, =, <>)
다중행 서브쿼리
내부 쿼리문의 결과로 여러개 개의 행 반환
- 다중행 비교연산자 (IN, ANY, SOME, ALL, EXISTS)
--단일행
select ename, dno
from employee
where dno =
(select dno
from employee
where ename='SCOTT');
--다중행
select eno, ename
from employee
where salary in
(select min(salary)
from employee
group by dno);
select eno, ename, job, salary
from employee
where salary < any
(select salary
from employee
where job='SALESMAN')
and job <> 'SALESMAN';
7장 뷰
물리적인 테이블을 근거한 논리적인 가상테이블 (디스크 저장 공간이 할당되지 않음)
목적
- 보안 : 실제 테이블의 특정 컬럼을 숨겨서 처리
- 편의성 : 복잡한 구문을 view로 만들어서 처리
뷰 생성
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name [(alias, alias, alias, ...)]
AS subquery
[WITH CHECK OPTION]
[WITH READ ONLY];
- CREATE OR REPLACE VIEW : 이미 존재하는 뷰에 대해서 그 내용을 새롭게 변경하여 재 생성
- FORCE : 기본 테이블의 존재 여부에 상관없이 뷰 생성
- WITH CHECK OPTION : 해당 뷰를 통해서 볼 수 있는 범위내에서만 UPDATE 또는 INSERT 가능
- WITH READ ONLY : 해당 뷰를 통해서는 SELECT만 가능하며 INSERT/UPDATE/DELETE 불가
뷰 삭제
DROP VIEW {view} [,..n]
- USER_VIEWS 데이터 딕셔너리에 저장되어 있는 뷰의 정의를 삭제