반응형
DML (Data Manipulation Language)
데이터 조작 언어
테이블에 값을 삽입하거나, 수정하거나, 삭제하거나, 조회하는 언어
INSERT, UPDATE, DELETE, SELECT
1 . 다양한 INSERT 방법
- 서브쿼리 이용, INSERT ALL 이용, 조건이 있을 경우
1. VALUES 대신 서브 쿼리를 이용
CREATE TABLE EMP_01(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(30)
, DEPT_TITLE VARCHAR2(20)
);
INSERT
INTO EMP_01
(
EMP_ID
, EMP_NAME
, DEPT_TITLE
)
(
SELECT
EMP_ID
, EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
);
2. INSERT ALL : INSER시에 사용하는 서브쿼리가 같은 경우 두 개 이상의 테이블에
INSERT ALL을 이용하여 한 번에 데이터를 삽입할 수 있음
단, 서브쿼리의 조건절이 같아야 함.
테이블 1
CREATE TABLE EMP_DEPT_D1
AS
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
FROM EMPLOYEE
WHERE 1 = 0; --컬럼이름과 데이터 타입은 가져오고 행은 가져오지 않기 위해서
테이블2
CREATE TABLE EMP_MANAGER
AS
SELECT
EMP_ID
, EMP_NAME
, MANAGER_ID
FROM EMPLOYEE
WHERE 1 = 0;
EMP_DEPT_D1 테이블에 EMPLOYEE 테이블에 있는 부서 코드가 D1인 직원을 조회해서
사번, 이름, 소속부서, 입사일을 삽입하고
EMP_MANAGER 테이블에 EMPLOYEE 테이블에 있는 부서 코드가 D1인 직원을 조회해서
사번, 이름, 관리자 사번을 삽입해보자.
INSERT ALL
INTO EMP_DEPT_D1
VALUES
(
EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
)
INTO EMP_MANAGER
VALUES
(
EMP_ID
, EMP_NAME
, MANAGER_ID
)
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
, MANAGER_ID
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';
3. 조건이 있을 경우
INSERT ALL
WHEN 조건
THEN
INTO
VALUES 로 작성
2 . UPDATE
- 테이블에 기록 된 컬럼의 값을 수정하는 구문, 테이블의 전체 행 갯수는 변화 없음 / UPDATE 또한 제약 조건에 위배되 지 않아야 함.
UPDATE 테이블명
SET 컬럼명 = 바꿀값
, 컬럼명 = 바꿀값
WHERE 컬럼명 비교연산자 비교값;
(1) 업데이트 할 테이블
CREATE TABLE DEPT_COPY
AS
SELECT D.*
FROM DEPARTMENT D;
(2) 업데이트
UPDATE
DEPT_COPY
SET DEPT_TITLE = '전략기획팀'
WHERE DEPT_ID = 'D9';
- UPDATE시에도 서브쿼리를 사용할 수 있음
UPDATE 테이블명
SET 컬러명 = (서브쿼리)
CREATE TABLE EMP_SALARY
AS
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
, BONUS
FROM EMPLOYEE;
유재식 사원과 방명수 사원의 급여와 보너스율을 동일하게 변경하여 업데이트 하기.
UPDATE
EMP_SALARY
SET SALARY = (SELECT
SALARY
FROM EMP_SALARY
WHERE EMP_NAME = '유재식'
)
, BONUS = (SELECT
BONUS
FROM EMP_SALARY
WHERE EMP_NAME = '유재식'
WHERE EMP_NAME = '방명수';
다중열 서버쿼리로도 가능함.
UPDATE
EMP_SALARY
SET (SALARY, BONUS) = (SELECT
SALARY
, BONUS
FROM EMP_SALARY
WHERE EMP_NAME = '유재식'
)
WHERE EMP_NAME = '방명수';
예제) EMP_SALARY 테이블에서 아시아 근무 지역에 근무하는 직원의 보너스를 0.5로 변경하는
UPDATE 구문을 작성하세요.WHERE에서 다중행 서브쿼리를 사용하며 조건을 알아올 때는
EMPLOYEE, DEPARTMENT, LOCATION 테이블을 그대로 사용합니다.
UPDATE
EMP_SALARY ES
SET ES.BONUS = 0.5
WHERE ES.EMP_ID IN (SELECT E1.EMP_ID
(↑PRIMARY KEY) FROM EMPLOYEE E1
JOIN DEPARTMENT D1 ON (E1.DEPT_CODE = D1.DEPT_ID) LOCATTION_ID와 LOCAL_CODE를 연결하기 위해서 DEPARTMENT사용
JOIN LOCATION L1 ON (D1.LOCATION_ID = L1.LOCAL_CODE)
WHERE L1.LOCAL_NAME LIKE 'ASIA%'
);
3 . DELETE
- 테이블의 행을 삭제하는 구문. 테이블의 행의 갯수가 줄어듬.
- 기본 삭제룰이 삭제 제한으로 설정되어 있기 때문에 FOREIGN KEY 제약조건이 설정 되어 있는 경우 참조 되고 있는 값에 대해서는 삭제할 수 없음.
- FK 제약 조건이 설정되어 있어도 참조되고 있지 않은 값에 대해서는 삭제할 수 있음
DELETE
FROM 테이블명
WHERE 조건설정
=> WHERE 조건을 설정하지 않으면 모든 행이 다 삭제됨.
참고 )
TRUNCATE : 테이블의 전체 행을 삭제할 시 사용함.
DELETE보다 수행 속도가 더 빠르지만 DDL이기 때문에 ROLLBACK을 통해 복구할 수 없음
4. MERGE
- 구조가 같은 두 개의 테이블을 하나로 합치는 기능
- 테이블에서 지정하는 조건의 값이 존재하면 UPDATE
- 조건의 값이 없으면 INSERT됨
반응형
'프로그래밍 > SQL_Oracle' 카테고리의 다른 글
10_OracleDB SQL : SEQUENCE (시퀀스생성 및 삭제, NEXTBAL , CURRVAR 사용) (0) | 2022.07.20 |
---|---|
08 _OracleDB SQL : DDL ( ALTER, DROP) 명령어 정리 (0) | 2022.07.20 |
06_OracleDB SQL : DDL(CREATE TALBE) 및 제약조건_테이블만들기 (0) | 2022.07.20 |
05_OracleDB SQL : SUBQUERY(서브쿼리) (0) | 2022.07.20 |
04_OracleDB SQL : JOIN (오라클 전용 구문, ANSI 표준 구문) (0) | 2022.07.19 |