공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

DML관련 문제를 풀어보다가 나중에 보려고 추가로 정리했다.

 

 

 

 

INSERT문

다중행 한 번에 입력하기 (서브쿼리 X)

INSERT ALL
    INTO DEPT (DEPTNO, DNAME, LOC) VALUES (50, 'ORACLE', 'BUSAN') -- VALUES(열=값)형식은 x, 값만 넣어주어야 한다.
    INTO DEPT (DEPTNO, DNAME, LOC) VALUES (60, 'SQL', 'ILSAN')
    INTO DEPT (DEPTNO, DNAME, LOC) VALUES (70, 'SELECT', 'INCHEON')
    INTO DEPT (DEPTNO, DNAME, LOC) VALUES (80, 'DML', 'BUNDANG')
SELECT *
FROM DUAL;

(서브쿼리를 이용하지 않고) 다중행을 입력할 때  INSERT 문을 여러 번 사용하는 방법도 있지만  INSERT 문의  ALL 옵션을 사용하는 방법도 있다. 뒤에 따라오는  SELECT 문을 입력하지 않으면 오류가 난다.

 

 

 

테이블 복사할 때 특정 열을 NULL로 만들기

INSERT INTO EMP_HW (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO
      FROM EMP E;
      

-- INSERT INTO절에 열을 지정하지 않았으면 SEELCT문에 NULL을 넣어도 된다.
INSERT INTO EMP_HW 
SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, NULL 
  FROM EMP; 

  원래는  EMP_HW 라는 빈 테이블에  REMARK 라는 열까지 총  9 개의 열이 있었고, 이 테이블에  EMP 테이블의 데이터들을 복사해야 했다. ( EMP 에는  REMARK 라는 열이 없는 상태)

 

  → 테이블에 모든 열을 나열하고 (서브쿼리,  NULL )로 값을 맞춰줘야 하나 했지만 그냥 해당 열을 빼고  INSERT 문을 작성하면 값이 없는 열들은 자동으로  NULL 로 삽입된다. (+  INSERT INTO 문에 열을 지정하지 않았다면 서브쿼리의  SELECT 문에  NULL 을 넣어주어도 된다.)

 

 

 

UPDATE문

UPDATE EMP
SET SAL = SAL * 1.1,	-- 급여10%인상
    DEPTNO = 80
WHERE HIREDATE > (SELECT MIN(HIREDATE)	-- 입사일이 가장 빠른(오래된)사람 ( MAX(HIREDATE)하면 가장 최근에 입사한 사원)
                    FROM EMP
                   WHERE DEPTNO = 60);

서브쿼리에서 지금 현재 수정해야 될 테이블을 넣는 것도 가능해서 기억해두려고 정리했다.

 

위의 SQL문은  EMP 테이블에 속한 사원 중,  DEPTNO (부서)가  60 인 사원 중에 입사일이 가장 빠른 사원보다 늦게 입사한 사원의 급여를  10% 인상하고,  DEPTNO (부서)를  80 으로 옮기는 것이다.

 

수정되는 테이블이라 서브쿼리에서 못쓸 거 같은데 된다... ! 서브쿼리에서 조인이 먼저 되고 그다음 메인쿼리에서 사용하는 듯..?

 

 

 

DELETE문

조인한 뒤 삭제해야 할 때

위의 그림과 같은 두 테이블이 있고,  GRADE  5 인 사원들을  EMP 테이블에서 지워야 한다.

이런 경우  EMP 테이블만으로는  GRADE    5 에 해당하는 사원들을 알 수 없다. 조인과  DELETE 를 동시에 해야 한다.

 

DELETE FROM EMP
WHERE SAL IN (SELECT SAL
                FROM EMP E JOIN SALGRADE S ON (E.SAL BETWEEN S.LOSAL AND S.HISAL)
               WHERE GRADE = 5);

 위의 SQL문처럼  WHERE 절에서 서브쿼리로 조인을 해보았다. 서브쿼리에서 조인을 진행해준 다음 원래의 테이블( EMP )에만 있는 열들을  SELECT 로 반환해주면 메인쿼리에서 연산이 가능하다.

 

처음에는 DELETE에도 FROM절이 있어서 거기에 조인을 하면 되는 줄 알았다 ㅜ

 

+ Recent posts