[SQL] 서브쿼리를 사용해 데이터 입력, 수정, 삭제하기
1. 데이터 입력하기
INSERT () VALUES () 에서 VALUES절을 제외하고 서브쿼리를 사용하면 여러 개의 행을 한 번에 테이블에 입력할 수 있다.
EX ) EMP 테이블의 구조를 그대로 복제한 EMP2테이블에 부서 번호가 10번인 사원들의 사원 번호, 이름, 월급, 부서 번호를 한번에 입력하라
-- EMP2 테이블 생성 (EMP 테이블 구조 복사)
CREATE TABLE EMP2
AS
SELECT *
FROM EMP
WHERE 1 = 2;
INSERT INTO EMP2(EMPNO, ENAME, SAL, DEPTNO)
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP
WHERE DEPTNO = 10;
VALUES절에 VALUES 대신 입력하고자 하는 서브쿼리문을 기술한다. 서브 쿼리문의 컬럼 순서는 INSERT절 괄호 안의 컬럼 순서대로 작성한다.
2. 데이터 수정하기
UPDATE문에 서브 쿼리를 사용하여 데이터를 수정할 수 있다.
EX ) 직업이 SALESMAN인 사원들의 월급을 ALLEN의 월급으로 변경하라
UPDATE EMP
SET SAL = (SELECT SAL
FROM EMP
WHERE ENAME = 'ALLEN')
WHERE JOB = 'SALESMAN';
SET절에 서브 쿼리를 사용하여 직업이 SALESMAN인 사원들의 월급을 ALLEN의 월급으로 갱신한다.
SET절에 여러 개의 컬럼들을 기술하여 한번에 갱신할 수도 있다.
EX ) SOCTT의 월급과 커미션을 ALLEN의 월급과 커미션으로 변경하라
UPDATE EMP
SET (SAL, COMM) = (SELECT SAL, COMM
FROM EMP
WHERE ENAME = 'ALLEN')
WHERE ENAME = 'SCOTT';
3. 데이터 삭제하기
DELETE문의 WHERE절에 서브쿼리를 사용하여 데이터를 지울 수 있다.
EX ) SCOTT보다 더 많은 월급을 받는 사원들을 삭제하라
-- 서브쿼리를 사용하지 않을 경우
SELECT SAL
FROM EMP
WHERE ENAME = 'SCOTT';
-- SCOTT의 월급이 3000임을 확인 후 3000보다 더 많이 받는 사원들의 정보를 삭제한다
DELETE FROM EMP
WHERE SAL > 3000;
-- 서브쿼리를 사용할 경우
DELETE FROM EMP
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'SCOTT');
EX ) 사원의 월급이 해당 사원이 속한 부서 번호의 평균 월급보다 크면 삭제하라
DELETE FROM EMP M
WHERE SAL > (SELECT AVG(SAL) FROM EMP N WHERE M.DEPTNO = N.DEPTNO);
4. 데이터 합치기
MERGE문의 USING절에 서브쿼리를 사용하여 데이터를 합칠 수 있다.
EX ) 부서테이블에 숫자형으로 SUMSAL컬럼을 추가하고 사원테이블을 이용하여 SUMSAL컬럼의 데이터를 부서 테이블의 부서 번호별 토탈월급으로 갱신하라.
-- DEPT 테이블에 SUMSAL 컬럼을 추가한다
ALTER TABLE DEPT
ADD SUMSAL NUMBER(10);
-- MERGE문의 USING절에 서브쿼리를 사용해 EMP테이블의 데이터를 합친다
MERGE INTO DEPT D
USING (SELECT DEPTNO, SUM(SAL) SUMSAL
FROM EMP
GROUP BY DEPTNO) V
ON D.DEPTNO = V.DEPTNO
WHEN MATCHED THEN
UPDATE SET D.SUMSAL = V.SUMSAL
서브 쿼리와 MATCH되는 부서번호 10, 20, 30은 값이 갱신되고 40번은 MATCH하지 않으므로 갱신되지 않는다.
MERGE문으로 수행하지 않고 서브 쿼리를 사용한 UPDATE문으로 수행하면 다음과 같다.
UPDATE DEPT D
SET SUMSAL = (SELECT SUM(SAL)
FROM EMP E
WHERE D.DEPTNO = E.DEPTNO);