
우선 명령어의 종류는 아래와 같습니다.
DQL(QUERY 데이터 정의어) : SELECT
DML(MANIPULATION 데이터 조작어) : INSERT, UPDATE, DELETE
DDL(DEFINITION 데이터 정의어) : CREATE, ALTER, DROP
DCL(CONTROL 데이터 제어) : GRANT, REVOKE
TCL(TRANSACTION 트랜잭션 제어) : COMMIT, ROLLBACK
여기서 DML에 대해 알아보는 파트입니다.
데이터 조작 언어로 테이블 값을 삽입(INSERT)하거나, 수정(UPDATE)하거나, 삭제(DELETE)하는 구문입니다.
테이블에 새로운 행을 추가하는 구문으로 여러가지 방식을 사용합니다.
INSERT INTO 테이블명 VALUES(값,값,값....)
이 때, 테이블의 모든 컬럼에 대한 값을 직접 제시해서 한 행을 INSERT하고자 할 때 컬럼의 순번을 지켜서 VALUE에 값을 나열해야합니다.
또한 부족하게 값을 제시할 경우 not enough values 오류가 발생하고,
값을 더 많이 제시한 경우 too many values 오류가 발생합니다.
SELECT * FROM EMPLOYEE;
INSERT INTO EMPLOYEE VALUES(900, '이소근', '880914-1456789', 'SG8809@naver.com', '01075966990', 'D7', 'J5', 4000000, 0.2, 200, SYSDATE, NULL, 'N');
INSERT INTO 테이블명(컬럼, 컬럼, 컬럼) VALUES(값, 값, 값)
테이블에 내가 선택한 컬럼에 대한 값만 INSERT할 때 사용합니다.
당연히 NOT NULL 제약조건 칼럼은 반드시 작성해줘야 하며 DEFAULT 값이 있는 경우는 DEFAULT가 들어갑니다. 그리고 나머지 안적어준 컬럼은 NULL이 들어갑니다.
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, HIRE_DATE)
VALUES(901, '최지원', '440701-1234567', 'J7', SYSDATE);
INSERT INTO 테이블명 (서브쿼리);
VALUES로 값을 직접 명시하는 것 대신 서브쿼리로 조회된 결과값을 INSERT 가능합니다.
--테이블 새로 만들기
CREATE TABLE EMP_01(
EMP_ID NUMBER,
EMP_NAME VARCHAR2(20),
DEPT_TITLE VARCHAR2(20)
);
INSERT INTO EMP_01 (SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID));
두개 이상의 테이블에 각각 INSERT할 때 사용되는 서브쿼리가 동일한 경우 사용합니다.
INSERT ALL
INTO 테이블명1 VALUE(컬럼, 컬럼, 컬럼...)
INTO 테이블명2 VALUE(컬럼, 컬럼...)
서브쿼리;
우선 테스트를 위해 테이블을 만들어 주는데, 데이터를 넣지 않고 컬럼만 만들어주고 싶으면 WHERE 조건절에 말도 안되는 조건을 하나 넣어주면 됩니다.
CREATE TABLE EMP_DEPT
AS (SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE
FROM EMPLOYEE
WHERE 1 = 0); -- 말도 안되는 조건 넣어주기 -> 데이터가 없는 테이블이 생성됨
CREATE TABLE EMP_MANAGER
AS (SELECT EMP_ID, EMP_NAME, MANAGER_ID
FROM EMPLOYEE
WHERE 1 = 0);
부서코드가 D1인 사원들의 사번, 이름, 부서코드, 입사일, 사수사번 조회하는 쿼리를 우선 작성해봅니다.
SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE, MANAGER_ID
FROM EMPLOYEE
WHERE DEPT_CODE = 'D1';
위 서브쿼리를 방금 만든 컬럼만 있는 테이블에 넣으려면 아래와 같은 쿼리를 작성하면 됩니다.
INSERT ALL
INTO EMP_DEPT 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');
테이블에 기록되어있는 기존의 데이터를 수정하는 구문입니다.
UPDATE 테이블명
SET 컬럼 = 값,
컬럼 = 값,
... -- AND로 연결하는 것이 아니라 그냥 ','로 연결합니다.
[WHERE 조건]
우선 테이블을 하나 만들어 준 다음 진행합니다.
CREATE TABLE DEPT_TABLE
AS (SELECT * FROM DEPARTMENT);
D9부서의 부서명을 '전략기획팀'으로 변경
UPDATE DEPT_TABLE
SET DEPT_TITLE = '전략기획팀'
WHERE DEPT_ID = 'D9';
우선 테이블을 하나 만들어 준 다음 진행합니다.
CREATE TABLE EMP_SALARY
AS (SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS
FROM EMPLOYEE);
EMP_SALARY 테이블에서
노옹철 사원의 급여를 100만원으로 변경
UPDATE EMP_SALARY
SET SALARY = 1000000
WHERE EMP_NAME = '노옹철';
선동일 사원의 급여를 700만원, 보너스를 0.2로 변경
UPDATE EMP_SALARY
SET SALARY = 7000000,
BONUS = 0.2
WHERE EMP_NAME = '선동일';
전체사원의 급여를 기존 급여에 10프로 인상된 금액으로 변경(기존급여 * 1.1)
UPDATE EMP_SALARY
SET SALARY = SALARY * 1.1;
UPDATE시 서브쿼리 사용하기
UPDATE 테이블명
SET 컬럼명 = (서브쿼리)
WHERE 조건
방명수 사원의 급여와 보너스값을 유재식 사원의 급여와 보너스 값으로 변경
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 = '방명수';
ASIA 지역에서 근무하는 사원들의 보너스값을 0.3으로 변경
UPDATE EMP_SALARY
SET BONUS = 0.3
WHERE EMP_ID IN (SELECT EMP_ID
FROM EMP_SALARY
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
WHERE SUBSTR(LOCAL_NAME, 1, 4) = 'ASIA');
그리고 이런 DML들을 실제 데이터베이스 저장공간에 실제로 반영하기 위해서는 트랜잭션 처리를 반드시 해줘야합니다. 트랜잭션 데이터를 실제로 저장공간에 저장하는데 사용하는 명령어는 바로 COMMIT, 오류 등으로 인해 원상태로 복구하려면 ROLLBACK을 사용합니다.
COMMIT;
테이블에 기록된 데이터를 한 행 단위로 삭제하는 구문입니다.
DELETE FROM 테이블명
[WHERE 조건]
DELETE FROM EMPLOYEE; -- 데이터 전체 삭제
ROLLBACK; -- 되돌리기
DELETE FROM EMPLOYEE
WHERE EMP_NAME = '이소근';
DELETE FROM EMPLOYEE
WHERE EMP_ID = 901;
COMMIT; -- 데이터베이스 저장공간에 실제로 반영
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D1';
--D1의 값을 가져다 쓰는 자식 데이터가 있으면 삭제되지 않습니다.