DB - DAY 5

NewTypeAsuka·2023년 3월 9일
0

DB@

목록 보기
6/15

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; -- FROM절에 사용한 테이블 별칭 이용 가능

오라클 방식과 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);
  • 2) 오라클 방식(컬럼명이 다른 경우):
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);
-- EMPLOYEE 테이블 컬럼 수를 기준으로 모두 출력(EMPLOYEE 컬럼은 강제로 모두 출력됨)
-- OUTER는 생략 가능
  • 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);
-- DEPARTMENT 테이블 컬럼 수를 기준으로 모두 출력(DEPARTMENT 컬럼은 강제로 모두 출력됨)
-- OUTER는 생략 가능
  • 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);
-- OUTER는 생략 가능

교차 조인(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);
  • 2) 오라클 방식
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);
  • 2) 오라클 방식
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, ..)
-- 데이터 순서가 기본 컬럼순이라면 (컬럼1, 컬럼2, ..)는 생략 가능
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 = '유재식'; -- 3400000
-- 유재식의 보너스 조회
SELECT BONUS FROM EMPLOYEE2 WHERE EMP_NAME = '유재식'; -- 0.2
-- 방명수의 급여, 보너스를 유재식과 동일하게 수정
UPDATE EMPLOYEE2
SET SALARY = (SELECT SALARY FROM EMPLOYEE2 WHERE EMP_NAME = '유재식'), -- SET SALARY = 3400000
	BONUS = (SELECT BONUS FROM EMPLOYEE2 WHERE EMP_NAME = '유재식') -- BONUS = 0.2
WHERE EMP_NAME = '방명수';



MERGE

  • 구조가 같은 두 개의 테이블을 하나의 테이블로 합치는 기능 제공
  • 두 테이블에서 지정하는 조건의 값이 존재하면 UPDATE되고 조건의 값이 없으면 INSERT 함



DELETE

  • 테이블의 행을 삭제하는 구문으로 테이블의 행 개수가 줄어듦
  • 삭제 시 FOREIGN KEY 제약조건으로 컬럼 삭제가 불가능한 경우 제약조건을 비활성화 할 수 있음
  • SELECT 문의 SELECT * 자리를 DELETE로 대체하는 것뿐


TRUNCATE

  • 테이블 전체 행 삭제 시 사용 하는 DDL
    (DML이 아님)
  • DELETE보다 수행 속도가 빠르다.
  • ROLLBACK을 통해 복구 불가능
  • DELETE와 마찬가지로 FOREIGN KEY 제약조건일 때는 적용 불가능하기 때문에
    제약 조건을 비활성화 해야 삭제할 수 있음

0개의 댓글