일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 배열
- forEach
- JSTL
- array
- set
- html
- table
- 원펀맨
- 맛집
- 스프링
- SQL
- url 치환
- Java
- JavaScript
- 자바
- 오라클
- url 변환
- 이름 마스킹
- spring
- JS
- Oracle
- React
- JSX
- 자바스크립트
- 개발
- 형변환
- jQuery
- 리액트
- 모바일게임
- 원펀맨: 최강의 남자
- Today
- Total
특별한 일상
[SQL] Oracle insert, update, merge ,delete 알아보기 본문
안녕하세요. 소다맛사탕 입니다.
지난 포스팅인 '테이블 생성(create table)'에 이어서 오늘은 데이터를 추가/수정 하거나 삭제하는 기본적인 DML을 알아 보겠습니다.
1. INSERT (신규 데이터 추가)
1-1. 기본적인 형태
INSERT INTO [스키마.]테이블명
(컬럼1, 컬럼2, 컬럼3, ...)
VALUES
('값1', '값2', '값3', ...);
-- ex)
INSERT INTO TEST_EXAMPLE_TB
(SEQ_NO, DATA1, DATA2)
VALUES
(1, 'test01', 'test02');
-- seq_no number 타입
데이터를 추가하는 가장 기본적인 형태로
나열하는 컬럼과 값의 수와 순서, 데이터 타입이 일치해야 한다.
컬럼 순서를 바꾸더라도 values 절에 있는 값을 바뀐 순서와 맞추기만 하면 문제가 되지 않는다.
1-2. 컬럼명 생략
INSERT INTO [스키마.]테이블명
VALUES
(값1, 값2, 값3, ...);
-- ex)
INSERT INTO TEST_EXAMPLE_TB
VALUES
(2, 'uu03', 'tt04');
-- test_example_tb 컬럼 seq_no, data1, data2
컬럼명을 생략하고 values 절에는 테이블의 컬럼 순서대로 값을 입력해야 한다.
기본적으로 select * from test_example_tb 를 실행했을때 나오는 순서이다.
테이블의 컬럼 순서를 바꾸면 안되고, 타입을 맞춰야 한다.
1-3. INSERT ~ SELECT
; insert문에 select절을 이용.
INSERT INTO [스키마.]테이블명
(컬럼1, 컬럼2, 컬럼3, ...)
SELECT문;
-- ex)
INSERT INTO TEST_EXAMPLE_TB
(SEQ_NO, DATA1, DATA2)
SELECT
NM_SEQ,
PK_DATA1,
DATA1
FROM TEST_EXAMPLE_CONT2
WHERE 1 = 1;
-- 적절한 조건절을 이용해 뽑아내고 싶은
-- 데이터를 잘 선정
insert문 안에 select문을 쓰는 경우는 다른 테이블이나 뷰의 데이터를
또다른 테이블에 삽입하는 방법이다.역시 insert문 테이블의 컬럼 순서와 타입을 맞춰야 한다.
또한, 타입 number <=> varchar2 데이터를 자동 변환해서 삽입한다.
2. UPDATE (기존 데이터 수정)
2-1. 기본적인 형태
UPDATE [스키마.]테이블명
SET 컬럼1 = 변경값1,
컬럼2 = 변경값2,
...
WHERE 조건;
-- ex)
UPDATE TEST_EXAMPLE_TB
SET SEQ_NO = 3,
DATA1 = 'test111',
DATA2 = 'uu11'
WHERE SEQ_NO = 1;
이미 입력된 테이블의 데이터를 수정하는 것이므로
수정할 컬럼, 변경할 값이 입력 되어야 한다.
그리고 조건절(where)을 사용해 수정할 조건을 기술한다.
2-2. set절 서브쿼리
; update문 set절에 select절을 이용.
UPDATE [스키마.]테이블명
SET (컬럼1, 컬럼2, 컬럼3, ...)
= (변경할값1, 변경할값2, 변경할값3, ...)
WHERE 조건;
-- ex)
UPDATE TEST_EXAMPLE_TB
SET (SEQ_NO, DATA1, DATA2)
= (SELECT * FROM TEST_EXAMPLE_CONT2 WHERE nm_seq = 3);
-- set 서브쿼리 select절이
-- 수정할 테이블의 컬럼수와 일치한다면 *를 써도 무방
-- 그렇지 않다면 set절의 컬럼들과 일치해야함
set절의 해당 컬럼을 변경할 때, 다른 테이블이나 뷰의 데이터를 이용하여 수정하는 방법이다.
수정하려는 테이블의 컬럼갯수, 타입이 select절과 일치하면 *써도 무방하다.
하지만, 문제는 서브쿼리는 다중 결과값을 가지고 있으면 안된다.
3. MERGE ( 조건에 따른 추가/수정)
merge문은 조건을 비교해서 테이블에 해당 조건에 맞는 데이터가 있으면 insert, 없으면 update를 수행.
MERGE INTO [스키마.]테이블명
USING (
대체적으로 SELECT절
)
ON (UPDATE될 조건)
WHEN MATCHED THEN
SET 컬럼1 = 변경할값1,
컬럼2 = 변경할값2,
...
WHERE UPDATE조건
DELETE WHERE UPDATE_DELETE 조건
WHEN NOT MATCHED THEN
INSERT
(컬럼1, 컬럼2, ...)
VALUES
(값1, 값2, ...)
WHERE INSERT조건;
-- ex)
merge into test_example_tb teb
using (
select
seq_num,
data1,
data2
from TEST_EXAMPLE_TB2
where seq_num = 1
) aa
on (teb.seq_no = aa.seq_num)
when matched then
update set
teb.data1 = aa.data1,
teb.data2 = aa.data2
when not matched then
insert
(seq_no, data1, data2)
values
(aa.seq_num, aa.data1, aa.data2);
-- ex2)
merge into test_example_tb teb
using (
select
seq_num,
data1,
data2
from TEST_EXAMPLE_TB2
where seq_num = 1
) aa
on (teb.seq_no = aa.seq_num)
when matched then
update set
teb.data1 = aa.data1,
teb.data2 = aa.data2
delete where (aa.seq_num = 2)
when not matched then
insert
(seq_no, data1, data2)
values
(aa.seq_num, aa.data1, aa.data2);
update절에 delete구문을 추가했는데, 이 경우는 update될 값을 판단해
조건에 맞는 데이터를 삭제하는 역할이다.
4. DELETE (기존 데이터 삭제)
-- FROM 생략 가능
DELETE [FROM] [스키마.]테이블
WHERE 조건;
-- ex)
delete test_example_tb where seq_no = 1;
-----------------------------------------
-- 특정 파티션만 삭제
DELETE [FROM] [스키마.]테이블 PARTITION (파티션명)
WHERE 조건;
※ 테이블을 생성할 때 파티션으로 테이블을 만들수 있는데, 파티션은 테이블에 있는 특정 컬럼 값을 기준으로 데이터를 분할해 저장해 놓은 것이다.
그래서 오늘은 간단하게 DML을 사용해 오라클에서 제공하는 기본적이 문법을 알아보았다.
추가적인 부분이나 설명이 더 필요한 경우는 생각날 때마다 고치겠습니다.
'IT•개발 끄적 > SQL' 카테고리의 다른 글
[SQL] 오라클 문자열 반환 (Oracle LTRIM, RTRIM, LPAD, RPAD) (0) | 2021.05.18 |
---|---|
[SQL] 오라클 트리거 생성, 삭제(oracle trigger) (0) | 2021.05.10 |
[SQL] 오라클 삽입문 반복 방법, Oracle insert LOOP FOR(PL/SQL) (0) | 2021.05.05 |
[SQL] 오라클 비밀번호 만료(ORA-28001: the password has expired) (0) | 2021.04.29 |
[SQL] oracle 테이블 생성(CREATE TABLE), 삭제(DROP), 변경/수정(ALTER) (0) | 2021.04.18 |