23.7.5 DML Practice

오기·2023년 7월 5일
0

INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
                   VALUES (50    ,'ORACLE', 'BUSAN');
INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
                   VALUES (60    ,'SQL', 'ILSAN');
INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
                   VALUES (70    ,'SELECT', 'INCHEON');
INSERT INTO CHAP10HW_DEPT (DEPTNO, DNAME, LOC)
                   VALUES (80    ,'DML', 'BUNDANG');

INSERT INTO CHAP10HW_EMP
VALUES(7201, 'TEST_USER1', 'MANAGER', 7788, TO_DATE('2016-01-02', 'YYYY-MM-DD'), 4500, NULL, 50);

INSERT INTO CHAP10HW_EMP
VALUES(7202, 'TEST_USER2', 'CLERK', 7201, TO_DATE('2016-02-21', 'YYYY-MM-DD'), 1800, NULL, 50);

INSERT INTO CHAP10HW_EMP
VALUES(7203, 'TEST_USER3', 'ANALYST', 7201, TO_DATE('2016-04-11', 'YYYY-MM-DD'), 3400, NULL, 60);

INSERT INTO CHAP10HW_EMP
VALUES(7204, 'TEST_USER4', 'SALESMAN', 7201, TO_DATE('2016-05-31', 'YYYY-MM-DD'), 2700, 300, 60);

INSERT INTO CHAP10HW_EMP
VALUES(7205, 'TEST_USER5', 'CLERK', 7201, TO_DATE('2016-07-20', 'YYYY-MM-DD'), 2600, NULL, 70);

INSERT INTO CHAP10HW_EMP
VALUES(7206, 'TEST_USER6', 'CLERK', 7201, TO_DATE('2016-09-08', 'YYYY-MM-DD'), 2600, NULL, 70);

INSERT INTO CHAP10HW_EMP
VALUES(7207, 'TEST_USER7', 'LECTURER', 7201, TO_DATE('2016-10-28', 'YYYY-MM-DD'), 2300, NULL, 80);

INSERT INTO CHAP10HW_EMP
VALUES(7208, 'TEST_USER8', 'STUDENT', 7201, TO_DATE('2018-03-09', 'YYYY-MM-DD'), 1200, NULL, 80);

UPDATE CHAP10HW_EMP
   SET DEPTNO = 70
 WHERE SAL > (SELECT AVG(SAL)
                FROM CHAP10HW_EMP
               WHERE DEPTNO = 50);

제대로 잘 작성했는데 이런 결과가 나왔다. 원인이 뭘까?


13:56 해결 완료!

ROLLBACK을 사용해도 2번째 사진처럼 이미 망가진 데이터가 계속해서 출력이 됐기 때문에

문제를 해결하기 위해서 일단은 DROP을 사용해 문제가 발생한 테이블을 삭제했다.

DROP TABLE CHAP10HW_EMP;

그리고 CREATE로 실습용 테이블을 복사 생성 → Q2의 데이터를 입력해주니 값이 정상적으로

들어간 것을 확인. ORDER BY를 하지 않아서 순서가 뒤죽박죽이라 사용해서 정렬해줬다.

(ORDER BY도 사용이 계속 안되길래 원인을 보니 SELECT문과 따로 사용해서 그랬던 것 !

UPDATE CHAP10HW_EMP
   SET SAL = SAL * 1.1,
       DEPTNO = 80
 WHERE HIREDATE > (SELECT MIN(HIREDATE)
                     FROM CHAP10HW_EMP
                    WHERE DEPTNO = 60); 

SELECT * -- 항상 UPDATE를 실행하기 전에는 SELECT로 바뀌는 값이 잘 지정됐는지 확인해야한다
  FROM CHAP10HW_EMP
 WHERE DEPTNO = 80;

DELETE FROM CHAP10HW_EMP
      WHERE EMPNO IN (SELECT E.EMPNO
                        FROM CHAP10HW_EMP E, SALGRADE S
                       WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
                         AND S.GRADE = 5);
      
       
    SELECT * -- DELETE 전에 급여 등급이 5인 사원을 확인
      FROM CHAP10HW_EMP E, SALGRADE S
      WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL
       AND S.GRADE = 5;

처음에 서브쿼리의 SALGRADE를 어디의 SAL과 비교할 지 지정하지 않아서 오류가 났었다.

그 부분을 수정하고 CHAP10HW_EMP 의 EMPNO에 SELECT 해온 E.EMPNO를 IN연산자를 사용해서 DELETE의 WHERE을 지정해줬다!

아직은 책을 앞뒤로 찾으면서 문제를 풀어 나가고 있지만 계속 하다 보면 좋은 결과를 얻을 수 있지 않을까… ?

0개의 댓글

Powered by GraphCDN, the GraphQL CDN