우와한 개발자

[SQL] Oracle DML 정리 - INSERT / UPDATE / DELETE 기본 문법과 서브쿼리 활용

by 우와한개발자

[ INSERT : 행 삽입 ]

  • 새로운 행 삽입하는 구문

 

1. 새로운 행 삽입

INSERT INTO 테이블명[(컬럼1, 컬럼2, ...)]
VALUES(값1, 값2,..);
  • 오라클은 하나의 행씩만 삽입 가능
구분 설명 비고
컬럼 명시 O 지정한 컬럼에만 값 삽입 안전하니 사용 지향
컬럼 명시 X 테이블 전체 컬럼 순서대로 삽입 순서 틀리거나 값이 전체 컬럼의 갯수와 다르면 오류 발생

 

2. 서브쿼리로 행 복사

  • VALUE 절 대신에 서브쿼리 이용해서 복사
  • 서브쿼리의 컬럼 갯수와 INSERT의 컬럼 개수가 일치해야함
INSERT INTO 테이블명[(컬럼1, 컬럼2, ...)]
SELECT문;
-- 다른 테이블에서 복사
INSERT INTO emp_backup (empno, ename, job, salary)
SELECT empno, ename, job, salary
FROM emp;

-- 조건에 맞는 행만 복사
INSERT INTO emp_backup (empno, ename, job, salary)
SELECT empno, ename, job, salary
FROM emp
WHERE deptno = 10;

 

❓ DESC 키워드
- 테이블 구조 확인
- DESCRIBE 약어
DESC 테이블명;​

 

[ UPDATE : 행 갱신 ]

  • 기존 행의 데이터를 갱신하는 구문
UPDATE 테이블명
SET 컬럼명1 = 값1[,컬럼명2 = 값2, ...] -- 해당 컬럼에 넣을 값
[WHERE 조건];

 

1. 기존 행 갱신

  • 조건에 맞는 행의 값을 직접 변경
-- 단일 컬럼 수정
UPDATE emp
SET salary = 4000
WHERE empno = 1001;

-- 여러 컬럼 수정
UPDATE emp
SET salary = 5000,
    job = 'MANAGER'
WHERE empno = 1002;

 

2. 서브쿼리로 다중 컬럼 갱신

  • 다른 테이블 또는 조회 결과를 이용해 값 변경
  • 서브쿼리는 반드시 단일 행만 반환하고, SET과 SELECT 컬럼의 갯수가 일치해야 함
UPDATE emp e
SET (salary, job) = (
    SELECT salary, job
    FROM emp_temp t
    WHERE t.empno = e.empno
)
WHERE e.empno = 1001;

 

[ DELETE : 행 제거 ]

  • 기존 행을 제거하는 구문
  • WHERE절 없이 실행하면 전체 데이터 삭제됨
DELETE	[FROM]	테이블명
[WHERE 조건];

 

1. 기존 행 삭제

  • 조건에 맞는 행 삭제
-- 특정 행 삭제
DELETE FROM emp
WHERE empno = 1001;

-- 조건 삭제
DELETE FROM emp
WHERE salary < 2000;

 

2. 서브쿼리로 행 삭제

  • 다른 조건을 기준으로 삭제
-- 특정 부서 사원 삭제
DELETE FROM emp
WHERE deptno IN (
    SELECT deptno
    FROM dept
    WHERE location = 'SEOUL'
);

 

3. 테이블에 저장된 중복 행 삭제

  • 동일한 데이터 중 1개만 남기고 나머지 삭제
DELETE FROM 테이블명
WHERE ROWID IN (
    SELECT rid
    FROM (
        SELECT ROWID rid,
               ROW_NUMBER() OVER (PARTITION BY 컬럼1, 컬럼2, 컬럼3 ORDER BY ROWID) rn
        FROM 테이블명
    )
    WHERE rn > 1
);
단계 설명
PARTITION BY 중복 기준 컬럼 그룹화
ROW_NUMBER() 그룹 내 순번 부여
rn > 1 중복 데이터만 선택
ROWID 실제 행 식별해서 삭제

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기