Study/SQL

[SQL] 서브쿼리를 사용해 데이터 입력, 수정, 삭제하기

truthyun 2023. 1. 13. 14:34
728x90
반응형

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';

 

728x90

 

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);
728x90
반응형