1. 조인(Join)
JOIN
- 하나 이상의 테이블에서 데이터를 조회하기 위해 사용하고
수행 결과는 하나의 Result Set으로 나옴
- 간단하게 말해 여러 테이블을 하나의 합치는 명령어
- 두 테이블에서 같은 데이터를 저장하는 컬럼이 연결고리
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
오라클 방식과 ANSI 방식 비교
- JOIN은 크게 오라클 방식과 ANSI 방식으로 나뉜다.
- 오라클 방식은 조인을 사용하지 않는다는 것이 특징이다.
- 내부 조인, 외부 조인, 자체 조인이 가장 많이 사용된다.
2. 조인의 종류
내부 조인(Inner Join)
- 연결되는 컬럼의 값이 일치하는 행들만 조인된다.
- 1) ANSI 방식(컬럼명이 다른 경우):
연결고리인 컬럼명이 다른 경우 ON을 사용
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
- 3) ANSI 방식(컬럼명이 같은 경우):
연결고리인 컬럼명이 같은 경우 USING을 사용
ANSI 방식에서도 별칭을 사용해서 오라클 방식으로 사용할 수는 있음
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
- 4) 오라클 방식(컬럼명이 같은 경우):
테이블 구분을 위해 별칭을 이용함
SELECT EMP_ID, EMP_NAME, e.JOB_CODE, JOB_NAME
FROM EMPLOYEE e, JOB j
WHERE e.JOB_CODE = j.JOB_CODE;
외부 조인(Outer Join)
- 두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킨다.
(반드시 OUTER JOIN임을 명시)
- 1) ANSI 방식(왼쪽 외부 조인):
합치기에 사용한 두 테이블 중 왼쪽에 기술된 테이블의 컬럼 수를 기준으로 조인된다.
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
- 2) 오라클 방식(왼쪽 외부 조인):
왼쪽 테이블 컬럼의 값과 오른쪽 테이블 컬럼의 값이 일치하지 않아도
오른쪽 테이블 컬럼에 억지로 추가하는 개념
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
- 3) ANSI 방식(오른쪽 외부 조인):
합치기에 사용한 두 테이블 중 오른쪽에 기술된 테이블의 컬럼 수를 기준으로 조인된다.
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE RIGHT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
- 4) 오라클 방식(오른쪽 외부 조인):
왼쪽 테이블 컬럼의 값과 오른쪽 테이블 컬럼의 값이 일치하지 않아도
왼쪽 테이블 컬럼에 억지로 추가하는 개념
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
- 5) ANSI 방식(전체 외부 조인):
합치기에 사용한 두 테이블에 모두 기술된 테이블의 컬럼 수를 기준으로 조인된다.
(오라클은 전체 외부 조인 불가능)
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
교차 조인(Cross Join)
- 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 조인 방법(곱집합)
SELECT EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
비등가 조인(Non-equal Join)
- 지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식
SELECT EMP_NAME, SALARY, e.SAL_LEVEL, sg.SAL_LEVEL
FROM EMPLOYEE e
JOIN SAL_GRADE sg ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);
자체 조인(Self Join)
- 같은 테이블인 자기 자신과 조인을 맺는 방식
- 같은 테이블이 2개 있다고 생각하면 쉽다.
- 1) ANSI 방식
SELECT e.EMP_ID, e.EMP_NAME,
NVL(e.MANAGER_ID, '없음'), NVL(m.EMP_NAME, '없음')
FROM EMPLOYEE e
LEFT JOIN EMPLOYEE m ON (e.MANAGER_ID = m.EMP_ID);
SELECT e.EMP_ID, e.EMP_NAME,
NVL(e.MANAGER_ID, '없음'), NVL(m.EMP_NAME, '없음')
FROM EMPLOYEE e, EMPLOYEE m
WHERE e.MANAGER_ID = m.EMP_ID(+);
자연 조인(Natural Join)
- 동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 자동으로 처리하는 방법
- 반드시 두 테이블 간의 동일한 컬럼명, 타입을 가진 컬럼이 필요
(없을 경우 교차 조인)
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;
다중 조인(Multiple Join)
- N개의 테이블을 조회할 때 사용
- 조인 순서가 중요하다.
- 1) ANSI 방식
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE;
3. DML(Data Manipulation Language)
DML
- 데이터 조작 언어로 테이블에 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 구문을 말함
- CRUD:
1) CREATE: INSERT
2) READ: SELECT
3) UPDATE
4) DELETE
- ROLLBACK:
마지막 COMMIT 시점으로 돌아가는 명령어
- COMMIT:
수행된 DML의 결과를 DB에 반영하는 명령어
INSERT
- 테이블에 새로운 행을 추가하여 테이블의 행 개수를 증가시키는 구문
INSERT INTO (테이블명) [컬럼1, 컬럼2, 컬럼3, ..]
VALUES(데이터1, 데이터2, 데이터3, ..)
INSERT INTO (테이블명) (컬럼3, 컬럼5, 컬럼1, ..)
VALUES(데이터3, 데이터5, 데이터1, ..)
INSERT ALL
- INSERT 시 서브쿼리가 사용하는 테이블이 같은 경우
두 개 이상의 테이블에 INSERT ALL을 이용하여 한 번에 삽입 가능
(각 서브쿼리의 조건절이 같아야 함)
UPDATE
- 테이블에 기록된 컬럼의 값을 수정하는 구문으로 테이블의 전체 행 개수에는 변화가 없음
UPDATE (테이블명)
SET (컬럼명) = (바꿀 값)
[WHERE 컬럼명 비교연산자 비교값];
- 서브쿼리나 다중 서브쿼리를 이용한 UPDATE도 유용하게 사용
SELECT SALARY FROM EMPLOYEE2 WHERE EMP_NAME = '유재식';
SELECT BONUS FROM EMPLOYEE2 WHERE EMP_NAME = '유재식';
UPDATE EMPLOYEE2
SET SALARY = (SELECT SALARY FROM EMPLOYEE2 WHERE EMP_NAME = '유재식'),
BONUS = (SELECT BONUS FROM EMPLOYEE2 WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';
MERGE
- 구조가 같은 두 개의 테이블을 하나의 테이블로 합치는 기능 제공
- 두 테이블에서 지정하는 조건의 값이 존재하면 UPDATE되고 조건의 값이 없으면 INSERT 함
DELETE
- 테이블의 행을 삭제하는 구문으로 테이블의 행 개수가 줄어듦
- 삭제 시 FOREIGN KEY 제약조건으로 컬럼 삭제가 불가능한 경우 제약조건을 비활성화 할 수 있음
- SELECT 문의 SELECT * 자리를 DELETE로 대체하는 것뿐
TRUNCATE
- 테이블 전체 행 삭제 시 사용 하는 DDL
(DML이 아님)
- DELETE보다 수행 속도가 빠르다.
- ROLLBACK을 통해 복구 불가능
- DELETE와 마찬가지로 FOREIGN KEY 제약조건일 때는 적용 불가능하기 때문에
제약 조건을 비활성화 해야 삭제할 수 있음