<Database> DML

이제내손을java...·2024년 3월 21일

Database 개념정리

목록 보기
7/11

DML

ROW(DATA)를 삽입, 수정, 삭제하는 명령어이다.

  1. INSERT : 테이블에 새로운 ROW를 추가하는 명령어
  • 표현법
INSERT INTO 테이블명 [(컬럼명, 컬럼명 ...)] VALUES(값,값,값.....)

2. UPDATE : 테이블에 특정ROW의 컬럼값을 수정하는 명령어

  • 표현법
 UPDATE 테이블명 SET 컬럼명=값[,컬럼명=값...][WHERE 조건문]

3. DELETE : 테이블에 특정ROW를 삭제하는 명령어

  • 표현법
DELETE FORM 테이블명[WHERE 조건식]

INSERT

1. 전체컬럼에 값을 대입하기

INSERT INTO 테이블명 VALUES(값,...)-> VALUES값의 갯수는 테이블의 컬럼수와 같아야한다. 

✔️컬럼의 순서대로 매칭돼서 들어가서 순서를 맞춰서 INSERT 해줘야함

 CREATE TABLE TEMP_DEPT
 AS SELECT*FROM DEPARTMENT WHERE 1=0;
 INSERT INTO TEMP_DEPT VALUES('D1','자바학부','L3'); 
 --> 값이 3개가 아니면 오류가 발생한다. 

✔️컬럼의 타입에 맞춰서 INSERT 해줘야함

 CREATE TABLE TEMP_EMP
 AS SELECT EMP_NAME,SALARY,HIRE_DATE FROM EMPLOYEE WHERE 1=0;
 SELECT*FROM TEMP_EMP;
 INSERT INTO TEMP_EMP VALUES('TEST','101원','1234'); --수치가 부적합니다 오류가 뜸
--> 타입에 맞게 INSERT해줘야함 아니면 오류가 발생한다. 

2 .컬럼을 설정해서 값 대입하기

TEMP_DEPT테이블의 DEPT_ID,LOCATION_ID의 컬럼의 값을 'D2','L2' 로 대입하기

INSERT INTO TEMP_DEPT(DEPT_ID,LOCATION_ID) VALUES('D2','L2');

✔️ 지정안한 컬럼은 NULL로 들어가게된다.
✔️ NOT NULL제약조건이 있는 컬럼은 무조건 선택해서 값을 넣어줘야함
이유 : NOT NULL제약 조건을 설정하지 않았을 때 나머지는 NULL로 들어가는데 제약조건이 NOT NULL인값에 NULL을 넣을 수 없기 때문에 오류 발생한다. (DEFAULT값이 있는 경우 NULL이 아닌DEFAULT값으로 대체되기 때문에 제외)

SELECT 문을 이용해서 INSERT하기

  • 다른테이블에 있는값을 복사해서 대입하기
CREATE TABLE INSERT_SUB
AS SELECT EMP_ID,EMP_NAME,DEPT_TITLE,HIRE_DATE
    FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID WHERE 1=2;
    
SELECT*FROM INSERT_SUB;
INSERT INTO INSERT_SUB(
    SELECT EMP_ID,EMP_NAME,DEPT_TITLE,SALARY
    FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID
    WHERE SALARY>=3000000
);

✔️ 오류 발생 : DATE가 필요하지만 NUMBER임 -> 데이터 타입을 맞춰줘야한다.

컬럼을 선택해서 값을 복사하기

INSERT INTO INSERT_SUB(EMP_ID,EMP_NAME)(
SELECT EMP_ID,EMP_NAME FROM EMPLOYEE;

INSERT ALL이용하기

한개의 SELECT문의 데이터를 다수 테이블 저장하는 명령어

  • 표현법
 INTO 테이블명 VALUES(컬럼명, 컬럼명,.....)
 INTO 테이블명 VALUES(컬럼명, 컬럼명,.....)
 SELECT 문
  • EMPLOYE테이블에서 EMP_ID,EMP_NAME,HIRE_DATE 의 구조만 가져와서 EMP_HIRE_DATE테이블 생성하기
    ✔️ WHERE 1=0 -> 구조만 가져온다.
CREATE TABLE EMP_HIRE_DATE
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE FROM EMPLOYEE WHERE 1=0;
  • EMPLOYEE테이블에서 EMP_ID,EMP_NAME,MANAGER_ID 의 구조를 EMP_MANAGER 테이블에 저장해서 생성한다.
CREATE TABLE EMP_MANAGER
AS SELECT EMP_ID,EMP_NAME,MANAGER_ID FROM EMPLOYEE WHERE 1=0;

각각의 데이터를 분활해서 저장한다.

  • EMPLOYEE의 EMP_ID,EMP_NAME,HIRE_DATE,MANAGER_ID를 가져와서
    각각 EMP_HIRE_DATE,EMP_MANAGER에 가져온값에서 필요한값을 넣어준다.
INSERT ALL 
    INTO EMP_HIRE_DATE VALUES(EMP_ID,EMP_NAME,HIRE_DATE)
    INTO EMP_MANAGER VALUES(EMP_ID,EMP_NAME,MANAGER_ID)
SELECT EMP_ID,EMP_NAME,HIRE_DATE,MANAGER_ID FROM EMPLOYEE;

조건에 따라 각 테이블에 저장하기

WHEN을 사용해준다.

  • 표현식
INSERT ALL
  WHEN 조건식 THEN INTO 테이블명 VALUES(값, 값...)
  WHEN 조건식 THEN INTO 테이블명 VALUES(값, 값...)
  WHEN 조건식 THEN INTO 테이블명 VALUES(값, 값...)
 SELECT문

🖐️문제풀이

  • 00년 이전 입사자,00년 이후 입사자를 분리저장하기

1. 테이블 생성
CREATE TABLE OLD_EMP
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE FROM EMPLOYEE WHERE 1=0;
CREATE TABLE NEW_EMP
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE FROM EMPLOYEE WHERE 1=0;

2. 데이터 삽입(저장) -> 입사일이 00/01/01이전인 사람과 이후인 사람으로 나뉘어서 OLD_EMP, NEW_EMP 에 저장된다. (아이디, 이름,입사일)
INSERT ALL
WHEN HIRE_DATE<'00/01/01' THEN INTO OLD_EMP VALUES(EMP_ID,EMP_NAME,HIRE_DATE)
WHEN HIRE_DATE>='00/01/01' THEN INTO NEW_EMP VALUES(EMP_ID,EMP_NAME,HIRE_DATE)
SELECT*FROM EMPLOYEE;

3. 조회
SELECT FROM OLD_EMP; --00/01/01 이전 입사한사람
SELECT
FROM NEW_EMP; --00/01/01 이후 입사한사람

UPDATE문 활용하기

  • 표현법
UPDATE 테이블명 SET 컬럼명= 값[,컬럼명=값][WHERE 조건식]
  • 정형돈의 급여를 300만원으로 수정하기
UPDATE EMP_SALARY SET SALARY=3000000 WHERE EMP_NAME='전형돈';
ROLLBACK; -- 다시 돌아가기 -- 주의해야할 점 WHERE절 안쓰면 월급이 모두 300만원으로 바뀜
  • 다수의 컬럼값 수정하기
    -- 전형돈 월급200원, 보너스0.5로 업데이트 하기
UPDATE EMP_SALARY SET SALARY=200,BONUS=0.5 WHERE EMP_NAME='전형돈';
  • 이전값을 가지고 컬럼값 수정하기
    -- 전체 사원의 급여를 100원 증가
UPDATE EMP_SALARY SET SALARY=SALARY+100;

🖐️ 문제 풀이

  • 유씨성을 가진 사원의 급여를 50만원 올리고 보너스는 0.4로 수정하기
UPDATE EMP_SALARY SET SALARY=SALARY+500000,BONUS=0.4 WHERE SUBSTR(EMP_NAME,1,1)='유';

UPDATE문 SELECT문 이용하기

  • 방명수의 급여,보너스를 심봉선과 동일하게 수정하기
    -- 심봉선의 급여를 가져와서 저장을 시켜주면 됨!
UPDATE EMP_SALARY 
SET SALARY=(SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME='심봉선'),
    BONUS=(SELECT BONUS FROM EMPLOYEE WHERE EMP_NAME='심봉선') 
    -- 이렇게 두줄 써도되지만 아래 구문처럼도 씀
SET(SALARY,BONUS)=(SELECT SALARY,BONUS FROM EMPLOYEE EMP_NAME='심봉선'); 
WHERE EMP_NAME='방명수';

MERGE

두 테이블의 데이터를 합치는 명령어이다.

기준테이블에 다른 테이블의 값을 저장 -> 동일값은 수정(UPDATE), 동일하지 않은 값은 추가(INSERT)

  • 표현법
MERGE INTO 기준테이블 USING 다른테이블 ON 조건
WHEN MATHCED/NOT MATHCED THEN 실행할 DML구문(UPDATE,INSERT)
CREATE TABLE EMP_M1
AS SELECT*FROM EMPLOYEE;
CREATE TABLE EMP_M2
AS SELECT*FROM EMPLOYEE WHERE JOB_CODE='J4';
INSERT INTO EMP_M2 VALUES(999,'전승우','961028-1234567','JEON@JOEN.COM','01012341234','D3','J4','S1',30,0.5,NULL,SYSDATE,DEFAULT,DEFAULT);
UPDATE EMP_M2 SET BONUS=0.3,SALARY=20 WHERE EMP_NAME!='전승우';

UPDATE SET
일치할 때는 합치고 일치하지 않을 때는 어떤걸로 바꿀지 결정할때 사용한다.

MERGE INTO EMPI_M1 USING EMP_M2 ON(EMP_M1,EMP_ID=EMP_M2,EMP_ID)
WHEN MATCHED THEN
 UPDATE SET 
  EMP_M1.BONUS=EMP_M2.BONUS,
  EMP_M1.SALARY=EMP_M2.SALARY
WHEN NOT MATCHED THEN 
  INSERT VALUES(EMP_M2.EMP_ID,EMP_M2.EMP_NAME,EMP_M2.EMP_NO,EMP_M2.EMAIL,
                 EMP_M2.PHONE,EMP_M2.DEPT_CODE,EMP_M2.JOB_CODE,EMP_M2.SAL_LEVEL,EMP_M2.BONUS,
                EMP_M2.MANAGER_ID,EMP_M2_HIRE_DATE,EMP_M2.ENT_DATE,EMP_M2.ENT_YN);

DELETE

ROW를 삭제하는 명령어이다.

  • 표현법
DELETE FROM 테이블명[WHERE 조건식]
  • 전체를 삭제하고 싶을 때
DELETE FROM EMP_M1;  
  • 조건에 따라 삭제하고 싶을 때(JOB_CODE의 값이 'J4'인 값을 삭제하고 싶을 때)
DELETE FROM EMP_M1 WHERE JOB_CODE='J4'; 

TRUNCATE

전체 ROW를 삭제할 때 사용한다.

  • 표현법
TRUNCATE TABLE EMP_M1; 

✔️ 삭제했습니다가아닌 잘렸습니다로 출력됨(DELETE보다 속도가 더 빠름)
✔️
ROLLBACK 안됨(완료라고 뜨긴뜨지만 실행되지 않는다)

외울게 너무 많네욥 ... 화이팅입니당

0개의 댓글