[Oracle] SQL 기초 - DML
데이터 다룰 때 사이클 기본 : CRUD
CREATE, READ, UPDATE, DELETE
데이터 처리 = 생성(CREATE) + 읽기(READ) + 수정(UPDATE) + 삭제(DELETE)
테이블, 사용자 … → DDL 명령어 | 레코드 → DML 명령어 | |
생성 | CREATE | INSERT |
읽기 | SELECT | SELECT |
수정 | ALTER | UPDATE |
삭제 | DROP | DELETE |
SQL 명령문 작성
SQL '명령문'과 '키워드'들은 대소문자 가리지 않는다
문자열은 홑따옴표 ' ' 로 감싼다
문자열 내의 내용은 대소문자 가린다
여러줄에 걸쳐 명령문을 입력할 수 있다
하나의 명령문 입력이 끝나면 반드시 ; (세미콜론) 입력해야한다
DML은 COMMIT 명령을 실행하기 전까지는 임시 저장만 되는 것이다
COMMIT; 를 해야만 database로 내용이 업데이트 된다
table record 추가
INSERT INTO [테이블명] (컬럼1, ...) VALUES (값1, ...);
* INSERT 결과 메시지 주목! DML 결과는 정수값으로 결과를 표현한다
table 내용 record 보기
SELECT 컬럼1, 컬럼2, .. FROM [테이블 이름]
SELECT * FROM [테이블 이름]
시퀀스(Sequence) 객체
oracle은 내부적으로 다양한 객체들을 제공한다
그 중 하나가 sequence 객체이다 -> 사용될 때마다 내부적으로 일정량씩 증가하는 객체'
숫자 타입 + PK로 정한 field는 일반적으로 sequence 객체와 연동하여 운용하여 INSERT될 때마다 항상 새로운 값 (중복되지 않은 값)이 부여될 수 있다
-생성
CREATE SEQUENCE [시퀀스 이름]
일정한 규칙에 의해 값이 연속적으로 자동 증가/감소할 때 사용하는 oracle 객체
일반적으로 table의 uid column 등 primary key의 역할을 하는 column에 적용시킨다
SQL> CREATE SEQUENCE phonebook_seq;
SQL> CREATE SEQUENCE phonebook_seq;
Sequence created.
SQL> DESC seq;
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
SEQUENCE_NAME NOT NULL VARCHAR2(30)
MIN_VALUE NUMBER
MAX_VALUE NUMBER
INCREMENT_BY NOT NULL NUMBER
CYCLE_FLAG VARCHAR2(1)
ORDER_FLAG VARCHAR2(1)
CACHE_SIZE NOT NULL NUMBER
LAST_NUMBER NOT NULL NUMBER
SQL> SELECT * FROM seq WHERE sequence_name = 'PHONEBOOK_SEQ';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY CY OR CACHE_SIZE
------------------------------------------------------------ ---------- ---------- ------------ -- -- ----------
LAST_NUMBER
-----------
PHONEBOOK_SEQ 1 1.0000E+28 1 N N 20
1
SQL> INSERT INTO phonebook (id, name, phone, email, regdate)
2 VALUES(phonebook_seq.nextval, '신데렐라', '010-3333-4444', 'sin@email.com', SYSDATE);
1 row created.
SQL> SELECT*FROM phonebook;
ID NAME PHONE EMAIL AGE MEMO REGDATE
---- -------- ------------- -------------------- --- ---------- ----------
23 홍길동 010-1111-1111 hong@email.com 39 안녕하세요 22/08/30
12 춘향이 010-8899-4435 eee@email.com 21
22 이순신 010-1111-2222 umm@email.com 23 반가워요
1 신데렐라 010-3333-4444 sin@email.com 21 22/08/30
SQL> INSERT INTO phonebook (id, name, phone, email, regdate)
2 VALUES(phonebook_seq.nextval, '신데렐라', '010-3333-4444', 'sin@email.com', SYSDATE);
1 row created.
SQL> SELECT*FROM phonebook;
ID NAME PHONE EMAIL AGE MEMO REGDATE
---- -------- ------------- -------------------- --- ---------- ----------
23 홍길동 010-1111-1111 hong@email.com 39 안녕하세요 22/08/30
12 춘향이 010-8899-4435 eee@email.com 21
22 이순신 010-1111-2222 umm@email.com 23 반가워요
1 신데렐라 010-3333-4444 sin@email.com 21 22/08/30
2 신데렐라 010-3333-4444 sin@email.com 21 22/08/30
-사용 주의
* sequence 없이도 INSERT가 가능하긴 하나, 나중에 다시 sequence 사용해 INSERT 할 시에 중복되는 값이 충돌되면 ERROR 나오니까 주의하기!
* INSERT에서 빈 문자열 주의!
인위적으로 NULL 허용 필드에 NULL 넣기
빈 문자열(empty string) 을 value 값으로 INSERT하면 된다
oracle에서는 빈 문자열이 null로 동작할 수 있음에 유의하자!!
단, 숫자 타입의 경우 빈 문자열을 입력하면 oracle은 null, sql server은 0, sql server decimal은 fails
TCL 명령어
INSERT, UPDATE, DELETE 등의 DML 명령은 메모리 상의 데이터에만 적용하므로 database에 저장하려면 반드시
SQL>COMMIT; 파일로 데이터 저장
SQL>ROLLBACK; 가장 최근에 COMMIT; 한 이후 적용된 DML 명령 취소하고 원위치 됨.
record(데이터) 수정 - update
update [테이블 이름]
set [컬럼 이름] = [데이터];
where [조건식];
* where 조건식이 없으면 모든 record에 적용된다
record(데이터) 삭제
DELETE (FROM) [테이블 이름] WHERE [조건식];