TIL 22.

Sol Karsian·2025년 3월 12일

📘 TIL - SQL 22일차: DML, TCL, 서브쿼리 완벽 정리
오늘은 SQL에서 실질적인 데이터 조작을 담당하는 DML, 트랜잭션을 제어하는 TCL, 그리고 복잡한 조건을 처리할 수 있는 서브쿼리에 대해 학습했습니다. 실무에서 꼭 필요한 핵심 SQL 개념들입니다.

🧩 DML (Data Manipulation Language)
데이터를 삽입(INSERT), 수정(UPDATE), 병합(MERGE), 삭제(DELETE) 하는 언어입니다.
→ 데이터 자체를 조작하는 명령어

✅ INSERT
sql
복사
편집
-- 모든 컬럼 삽입
INSERT INTO EMPLOYEE2
VALUES('900', '홍길동', '991215-1234567', 'hong@or.kr', '010...', 'D1', 'J7', 'S3', 4300000, 0.2, 200, SYSDATE, NULL, 'N');

-- 일부 컬럼만 삽입
INSERT INTO EMPLOYEE2 (EMP_ID, EMP_NAME, SALARY)
VALUES ('901', '김철수', 3000000);

-- 서브쿼리로 삽입
INSERT INTO EMP_01 (
SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE2
LEFT JOIN DEPARTMENT2 ON (DEPT_CODE = DEPT_ID)
);
✅ UPDATE
sql
복사
편집
-- 특정 행 수정
UPDATE DEPARTMENT2
SET DEPT_TITLE = '전략기획팀'
WHERE DEPT_ID = 'D9';

-- 여러 컬럼 동시 수정
UPDATE DEPARTMENT2
SET DEPT_ID = 'D0',
DEPT_TITLE = '전략기획팀'
WHERE DEPT_ID = 'D9' AND DEPT_TITLE = '총무부';
✅ MERGE
sql
복사
편집
MERGE INTO EMP_M01 USING EMP_M02 ON (EMP_M01.EMP_ID = EMP_M02.EMP_ID)
WHEN MATCHED THEN
UPDATE SET EMP_M01.SALARY = EMP_M02.SALARY
WHEN NOT MATCHED THEN
INSERT VALUES (EMP_M02.EMP_ID, EMP_M02.EMP_NAME, ...);
✅ DELETE & TRUNCATE
sql
복사
편집
-- 특정 행 삭제
DELETE FROM EMPLOYEE2 WHERE EMP_NAME = '홍길동';

-- 조건부 삭제
DELETE FROM EMPLOYEE2
WHERE EMP_ID IN (SELECT EMP_ID FROM EMPLOYEE2 WHERE SALARY >= 3000000);

-- 전체 삭제 (복구 불가)
TRUNCATE TABLE EMPLOYEE3;
🔁 TCL (Transaction Control Language)
데이터 조작 후 확정하거나 취소하기 위한 명령어

명령어 설명
COMMIT 작업 확정 (저장)
ROLLBACK 마지막 커밋 이전으로 되돌림
SAVEPOINT 저장 지점 설정 후 일부 롤백 가능
sql
복사
편집
-- 저장 지점 설정
SAVEPOINT "SP1";

-- 일부 롤백
ROLLBACK TO "SP1";
🔍 서브쿼리 (Subquery)
쿼리 안에 또 다른 쿼리를 작성하여 조건을 동적으로 조회

✅ 단일행 서브쿼리
sql
복사
편집
-- 평균 급여 이상인 직원
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEE);
✅ 다중행 서브쿼리
sql
복사
편집
-- 부서별 최고 급여자
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY IN (
SELECT MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE
);
✅ 다중열 서브쿼리
sql
복사
편집
-- 퇴사한 여직원과 같은 부서 + 직급
SELECT EMP_NAME, DEPT_CODE, JOB_CODE
FROM EMPLOYEE
WHERE (DEPT_CODE, JOB_CODE) = (
SELECT DEPT_CODE, JOB_CODE
FROM EMPLOYEE
WHERE ENT_YN = 'Y' AND SUBSTR(EMP_NO, 8, 1) = '2'
);
✅ 다중행 다중열 서브쿼리
sql
복사
편집
-- 직급별 평균 급여를 받는 직원
SELECT EMP_ID, EMP_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
WHERE (JOB_CODE, SALARY) IN (
SELECT JOB_CODE, TRUNC(AVG(SALARY), -4)
FROM EMPLOYEE
GROUP BY JOB_CODE
);
🧪 실전 연습 문제 (예시)
노옹철과 같은 부서, 같은 직급인 직원 조회 (노옹철 제외)

2000년 입사 직원과 같은 부서/직급 조회

77년생 여직원과 같은 부서, 같은 사수 조회

🔐 트랜잭션 주의사항
COMMIT 전까지는 데이터가 물리적으로 저장되지 않음

복구가 필요하면 ROLLBACK 또는 SAVEPOINT를 활용

DML 후 TCL 필수!

✨ 오늘의 키워드 정리
DML: INSERT, UPDATE, DELETE, MERGE

TCL: COMMIT, ROLLBACK, SAVEPOINT

서브쿼리 유형: 단일행 / 다중행 / 다중열 / 다중행다중열 / 상관 / 스칼라

실무 트랜잭션은 오류 방지 + 무결성 유지가 핵심!

profile
개발자 희망자 입니다.

0개의 댓글