database/Oracle

[Oracle] SQL 기초 - DML

솧이 2022. 8. 30. 22:20

데이터 다룰 때 사이클 기본 : 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 [조건식];