DQL(Data Query Lenguage) - 데이터 질의어, SELECT

-> 

DML (Data Manipulation Language) - 데이터 조작어, INSERT, UPDATE, DELETE


DDL 정의

DCL 컨트롤





INSERT


1. INSERT 문은 테이블에 새 행(row)을 추가하는데 이용하며, single table insert 나 multi table insert를 수행할 수 있다.


single table insert : 오직 하나의 테이블이나 뷰에 오직 하나의 행(row)의 값들을 삽입할 수 있다.

multi table insert : 하나 이상의 테이블로부터 스브쿼리로 얻은 여러 행(row)을 삽입하는 경우이다.


2.

insert into 테이블명 (컬럼명1, 컬럼명2, ...) values (값1, 값2, ...);

-> 컬럼명과 값은 1:1 매칭이 되어야 한다. 자료형, 순서, 갯수.



insert into 테이블 values (값1, 값2, ...);

-> 테이블에 있는 모든 컬럼을 대상으로 값을 입력하는 경우 컬럼명 부분을 생략할 수 있다.








자료형


1. VARCHAR2, NVARCHAR2 : 문자열형. 길이 지정. 최대 4000자.

2. NUMBER : 숫자형(정수, 실수). 길이 지정. 최대 38자리

3. DATE : 날짜형. 날짜, 시간이 저장됨.






NUMBER 자료형 자료 입력 테스트


CREATE TABLE test1 (

col1 number -- 38자리까지 입력가능

,col2 number(3) -- 3자리까지만 입력가능

,col3 number(5, 2) -- 5자리인데, 소수이하 2자리 입력가능. (소수이하 자리 포함해서 5자리)

);


insert into test1 (col1, col2, col3) values (123, 123, 123); -- 123, 123, 123

insert into test1 (col1, col2, col3) values (123.45, 123.45, 123.45); -- 123.45, 123, 123.45

insert into test1 (col1, col2, col3) values (123.456, 123.456, 123.456); -- 123.456, 123, 123.46

insert into test1 (col1, col2, col3) values (1234, 1234, 1234); -- 입력시도하는 정수가 크므로 아예 입력 불가





DATE 자료형 자료 입력 테스트


CREATE TABLE test2 (

col1 date --날짜, 시간 저장

);


insert into test1 (col1) values (SYSDATE); -- 2012-10-25 10:05:30

insert into test1 (col1) values ('20121025'); -- 2012-10-25 00:00:00

insert into test1 (col1) values ('2012-10-25'); -- 2012-10-25 00:00:00

insert into test1 (col1) values ('2012/10/25'); -- 2012-10-25 00:00:00





VARCHAR2, NVARCHAR2 자료형 자료 입력 테스트


CREATE TABLE test3 (

col1 VARCHAR2(1) -- 1글자만 허용.

,col2 VARCHAR2(10) -- 10글자까지 허용. 영어는 1글자, 한글은 한글자당 3글자 차지

,col3 NVARCHAR2(10) -- 10글자까지 허용. 영어, 한글 상관없이 한글자당 1글자 차지

);


insert into test3(col1, col2, col3) values ('A', 'B', 'C'); --A, B, C

SELECT * FROM test3;

insert into test3(col1, col2, col3) values ('TEST', 'TEST', 'TEST'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col2, col3) values ('ORACLEDATA', 'ORACLEDATA'); -- 널, ORACLEDATA, ORACLEDATA

insert into test3(col2, col3) values ('ORACLEDATABASE', 'ORACLEDATABASE'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col2, col3) values ('오라클', '오라클'); -- 널, 오라클, 오라클,

insert into test3(col2, col3) values ('오라클데이터베이스', '오라클데이터베이스'); -- 허용 글자수 오버로 입력 불가.


insert into test3(col3) values ('오라클데이터베이스'); -- 널, 널, 오라클데이터베이스

insert into test3(col2) values ('오라클데'); -- 한글 하나당 3자리 차지하므로 입력 불가.






테이블 객체 관리


1. 새 테이블 생성

create table 테이블명 (

컬럼명 자료형 [제약조건]

,...

);



2. 기존 테이블 구조 확인

desc 테이블명;



3. 기존 테이블 구조 복사해서 새 테이블 생성

create table 새테이블명

as

select 컬럼리스트 from 기존테이블명 where 1=0;



4. 기존 테이블 구조 및 자료 복사해서 새 테이블 생성

create table 새테이블명

as

select 컬럼리스트 from 기존테이블명 [where 조건식]; -- 조건식이있을 경우 조건식에 만족하는 행만 복사



-- insa 테이블 복사해서 test4 테이블 생성. 구조와 자료 전체 복사.

create table test4 as 

select * from insa;



5. 기존 테이블에 새 열(column) 추가

alter table 기존테이블명

add (열이름 자료형, ....);



6. 기존 테이블에 기존 열(column) 자료형 변경

alter table 기존테이블명

modify 열이름 새로운자료형;



7. 기존 테이블에 기존 열(column) 이름 변경

alter table 기존테이블명

rename column 기존열이름 to 새열이름;



8. 기존 테이블에 기존 열(column) 삭제

alter table 기존테이블명

drop column (열이름, ....);


9. 기존 테이블의 이름 변경

rename 기존테이블명 to 새로운테이블명;


10. 기존 테이블 삭제 (휴지통 기능)

drop table 테이블명; -- 휴지통으로 이동한 상태


-- 휴지통에 있는 객체 확인.

select *

from recyclebin;


-- 휴지통에 있는 객체 복원.

flashback table 테이블명 to before drop;


-- 휴지통 비우기

purge recyclebin;


-- 완전 삭제(휴지통을 거치지 않고 바로 삭제)

drop table 테이블명 PURGE;







제약 조건


1. Primary Key(PK), Unique(UK), NOT NULL, Check(CK), Foreign Key(FK)


2. 무결성 유지를 위한 조건 추가. 개체 무결성, 참조 무결성, 도메인 무결성.


3. 제약조건 지정방법

- 컬럼레벨

CREATE TABLE 테이블명 (

컬럼명 자료형 [CONSTRAINT 제약명] 제약조건명  // [] 은 제약조건명이 제약명을 가진 객체로 오라클이 가지고 있게 하여, 추후 수정할때 사용함.

,...

);



- 테이블레벨 (권장)

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 제약조건명 (컬럼지정)

);



4. 제약조건 확인

select * from user_constraints;


-- 특정 테이블에 있는 제약조건 확인 (제약 종류만 확인)

select * from user_constraints 

where table_name = 'TEST7'; -- 테이블명 대문자로 표기



-- 특정 테이블에 있는 제약조건이 지정된 컬럼 정보 확인 (제약조건 걸린 컬럼명만 확인)

select *

from user_cons_columns

where table_name = 'TEST7';



-- 제약종류와 컬럼 정보를 동시에 확인. constraint_name 컬럼을 기준으로 join


select uc.owner, uc.table_name, column_name, constraint_type, uc.constraint_name

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name AND uc.table_name = '테이블명';


****

-> 자주 사용하는 select 쿼리는 view 객체로 등록


create view constraint_check

as

select uc.owner, uc.table_name as table_name, column_name, constraint_type, uc.constraint_name

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;


-> view 객체를 이용한 제약조건 확인


select * from constraint_check

where table_name ='테이블명';



-- 특정 테이블의 NOT NULL 제약 여부 확인


DESC 테이블명;




-- DEFAULT 제약 확인 

SELECT *

FROM user_tab_columns

where table_name = '테이블명';



-- 제약 확인용 VIEW 객체 수정 (CHECK 제약 확인 추가)


create or replace view constraint_check

as

select uc.owner, uc.table_name as table_name, column_name, constraint_type, uc.constraint_name, uc.search_condition

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;






◆ Primary Key(PK)

 * 특성

- PK가 지정된 컬럼에는 중복된 데이터 입력 불가.

- 테이블에는 PK를 한번만 지정가능.

- PK가 지정된 컬럼에는 NULL 값을 허용하지 않는다.

- PK가 지정된 컬럼에는 UNIQUE INDEX가 자동 생성된다.

- PK가 지정된 컬럼이 두 개 이상인 경우는 묶어서 하나로 처리해야 한다.

-- 컬럼지정시 컬럼을 다중으로 기재하면 복합키 처리가 됨.


 * 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 PRIMARY KEY (컬럼지정)

);



--PK 지정전

CREATE TABLE test6 (

col1 NUMBER

,col2 VARCHAR2(10)

);


INSERT INTO test6(col1, col2) values (1, 'hong'); -- 1, hong

INSERT INTO test6(col1, col2) values (2, 'kim'); -- 2, kim

INSERT INTO test6(col1, col2) values (2, 'park'); -- 2, park

INSERT INTO test6(col2) values ('choi'); -- NULL, choi

INSERT INTO test6(col1, col2) values (NULL, NULL); -- NULL, NULL



--PK 지정후

CREATE TABLE test7 (

col1 NUMBER

,col2 VARCHAR2(10)

,CONSTRAINT test7_col1_pk PRIMARY KEY (col1)

);


INSERT INTO test7(col1, col2) values (1, 'hong'); -- O

INSERT INTO test7(col1, col2) values (2, 'kim'); -- O

INSERT INTO test7(col1, col2) values (2, 'park'); -- X

INSERT INTO test7(col2) values ('choi'); -- X

INSERT INTO test7(col1, col2) values (NULL, NULL); -- X






◆ Unique(UK)

 * 특성

- UK가 지정된 컬럼에는 중복된 데이터 입력 불가.

- 테이블에 UK를 여러번 지정 가능.

- UK가 지정된 컬럼은 NULL 값을 허용한다.


 * 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 

,...

,CONSTRAINT 제약명 UNIQUE (컬럼지정)

);


-- UK 지정전

CREATE TABLE test8 (

col1 NUMBER -- PK 지정대상

,col2 VARCHAR2(10)

,col3 VARCHAR2(20) -- UK 지정대상

);


INSERT INTO test8 (col1, col2, col3) VALUES (1, 'kim', 'test@nate.com'); - 입력 가능

INSERT INTO test8 (col1, col2, col3) VALUES (2, 'park', 'test@nate.com'); - 입력 가능



--UK 지정 후

CREATE TABLE test9 (

col1 NUMBER

,col2 VARCHAR2(10)

,col3 VARCHAR2(20)

,CONSTRAINT test9_col1_pk PRIMARY KEY (col1)

,CONSTRAINT test9_col2_uk UNIQUE (col2)

);


INSERT INTO test8 (col1, col2, col3) VALUES (1, 'kim', 'test@nate.com'); - 입력 가능

INSERT INTO test8 (col1, col2, col3) VALUES (2, 'park', 'test@nate.com'); - 입력 불가






◆ NOT NULL 키워드


1. 특정 컬럼이 NULL 값이 가지지 못하도록 막는다. PK가 지정된 컬럼은 자동으로 NOT NULL 특성을 가진다.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 NOT NULL

,...

);



-- NOT NULL 지정


CREATE TABLE test10 (

col1 VARCHAR2(10) NOT NULL --NULL 허용안함

,col2 VARCHAR2(10) -- NULL 허용

);


INSERT INTO test10 (col1, col2) VALUES ('test', 'test'); --O

INSERT INTO test10 (col1, col2) VALUES (NULL, NULL); --X









◆ DEFAULT 키워드


1. 입력시 미리 약속된 값을 자동 삽입 하는 경우. 단, 명시적으로 값을 입력하는 경우는 무시됨.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형 DEFAULT 값

,...

);




CREATE TABLE test11 (

col1 NUMBER

,col2 VARCHAR2(10)

,col3 DATE DEFAULT SYSDATE

);


INSERT INTO test11 (col1, col2, col3) values (1, 'hong', '20120101'); -- DEFAULT 값 무시됨

INSERT INTO test11 (col1, col2) values (2, 'kim');

INSERT INTO test11 (col1, col2) values (3, 'park', DEFAULT); -- DEFAULT값 자동 삽입.




-- DEFAULT 제약 확인 

SELECT *

FROM user_tab_columns

where table_name = '테이블명';







 CHECK 


1. 특정 컬럼에 입력되는 데이터에 대한 허용 범위를 지정할 때 사용.


2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료형

,...

,CONSTRAINT 제약명 CHECK (조건식)

);


CREATE TABLE test12 (

col1 VARCHAR2(10)

,col2 NUMBER(3) --점수 입력 컬럼(0~100)

,CONSTRAINT test12_col2_ck CHECK (col2 between 0 and 100)

);



INSERT INTO test12 (col1, col2) values ('hong', 100); --O

INSERT INTO test12 (col1, col2) values ('park', 200); --X



-- 제약 확인용 VIEW 객체 수정 (CHECK 제약 확인 추가)


create or replace view constraint_check

as

select uc.owner, uc.table_name as table_name as table_name, column_name, constraint_type, uc.constraint_name, uc.search_condition

from user_constraints uc, user_cons_columns ucc

where uc.constraint_name = ucc.constraint_name;



-- NOT NULL 지정을 CHECK 제약으로 하는 방법


CREATE TABLE test13 (

col1 VARCHAR2(10) --NULL 허용안함

,col2 VARCHAR2(10) -- NULL 허용

,CONSTRAINT test13_col1_NN CHECK (col1 IS NOT NULL)

);


INSERT INTO test10 (col1, col2) VALUES ('test', 'test'); --O

INSERT INTO test10 (col1, col2) VALUES (NULL, NULL); --X







 FOREIGN KEY


1. 관계 설정시 사용하는 제약.

- FK가 지정된 컬럼에는 자료 입력이 참조를 하고 있는 PK 또는 UK 컬럼의 값들로 제한된다.

- FK가 지정된 컬럼에 자료입력하려면 먼저 PK 또는 UK컬럼에 해당 자료가 존재해야 한다.

- FK가 지정되고 나면 참조 당하는 PK 또는 UK 컬럼의 테이블 또는 자료는 삭제가 안된다.



2. 형식

CREATE TABLE 테이블명 (

컬럼명 자료명

,...

,CONSTRAINT 제약명 FOREIGN KEY (컬럼지정)

REFERENCES 참조테이블명(참조컬럼지정)

);


-- PK 제약 지정된 테이블

CREATE TABLE test14 (

col1 NUMBER -- PK

,col2 VARCHAR2(10)

,CONSTRAINT test14_col1_PK PRIMARY KEY (col1)

);


-- FK 제약 지정된 테이블

CREATE TABLE test15 (

col3 NUMBER -- PK

,col4 VARCHAR2(10)

,col1 NUMBER -- FK

,CONSTRAINT test15_col3_PK PRIMARY KEY (col3)

,CONSTRAINT test15_col1_FK FOREIGN KEY (col1) REFERENCES test14 (col1)

);



-- PK 자료 입력

INSERT INTO test14 (col1, col2) values (1, 'kim');

INSERT INTO test14 (col1, col2) values (2, 'park');

INSERT INTO test14 (col1, col2) values (3, 'hong');


-- FK 자료 입력

insert into test15 (col3, con4, col1) values (1, 'kim', 1);

insert into test15 (col3, con4, col1) values (2, 'park', 3);

insert into test15 (col3, con4, col1) values (3, 'hong', 4);



-- PK 자료 삭제 테스트

delete from test14

where col1 = 1;  --X



delete fron test14

where col1 = 3; --O








제약 조건 관리


1. 테이블 생성 후 제약 조건 추가

ALTER TABLE 테이블명

ADD (CONSTRAINT 제약명 제약조건 (컬럼지정)

, ...);


2. 제약 조건 삭제

ALTER TABLE 테이블명

DROP CONSTRAINT 제약명;


3. 제약 조건 확인

SELECT uc.owner                         --소유자

, uc.constraint_name            --제약명

, uc.table_name AS table_name   --테이블명

, uc.constraint_type            --제약조건 종류(P, R, U, C)

, uc.search_condition           --CHECK 제약 조건식

, ucc.column_name               --지정된 컬럼

, (SELECT table_name 

FROM user_constraints 

WHERE constraint_name=uc.r_constraint_name) 

AS r_table_name --참조하는 테이블

, (SELECT column_name 

FROM user_constraints 

WHERE constraint_name=uc.r_constraint_name) 

AS r_conlumn_name --참조하는 컬럼

FROM user_constraints uc, user_cons_columns ucc

WHERE uc.constraint_name = ucc.constraint_name


4. NOT NULL, DEFAULT 지정은 별도 확인

--NOT NULL 확인

DESC 테이블명;


--DEFAULT 확인

SELECT *

FROM user_tab_columns

WHERE table_name='테이블명';







문제) emp, city, buseo, jikwi 테이블에서 제약 조건 추가할 것.

아래 형태의 테이블 생성이 된 후에 제약 조건 추가 명령을 내린다고 가정함.


--city 테이블 생성

CREATE TABLE city (

city_id NUMBER --PK

, city VARCHAR2(10) --CK. 서울,충남,인천,부산,제주,전북,강원,경북,전남,경기 한정

);


--buseo 테이블 생성

CREATE TABLE buseo (

buseo_id NUMBER --PK

, buseo VARCHAR2(15) --CK. 총무부,개발부,영업부,기획부,인사부,자재부,홍보부 한정

);


--jikwi 테이블 생성

CREATE TABLE jikwi (

jikwi_id NUMBER --PK

, jikwi VARCHAR2(15) --CK. 과장,대리,부장,사원,사장,이사 한정

);


--emp 테이블 생성

CREATE TABLE emp (

num NUMBER --PK

, name VARCHAR2(20) -- NOT NULL

, ssn  VARCHAR2(14) -- NOT NULL

, ibsaDate DATE

, city_id NUMBER --FK

, tel   VARCHAR2(15)

, buseo_id NUMBER --FK

, jikwi_id NUMBER --FK

, basicPay NUMBER(10) --CK. 0 이상

, sudang NUMBER(10) --CK. 0 이상

);



WRITTEN BY
빨강꼬마

,

- 데이터 타입의 종류
 - 숫자타입: number (정수 및 실수 모두 포함)
          표현범위: number(5) -> -99999 ~ 99999
                    number(3) -> -999 ~ 999
                    number(5,2) -> -999.99 ~ 999.99
                    number(6,3) -> -999.999 ~ 999.999


 - 문자타입
   ①char: 고정형 문자타입
     name char(10) -> name 컬럼에 입력되는 데이터의 크기는 무조건 10Byte로 들어온다. 단, 10Byte가 넘는 데이터는 입력이 불가함.
                          -> 한글의 경우 한글자당 2Byte 영문은 1Byte. (키보드에서 한키로 입력되는 숫자, 영어등은 1Byte. 없는 것은 2Byte)

            ex: '이순신'             -> 10바이트로 고정되서 들어옴
                '김구'               -> 10바이트로 고정되서 들어옴
                '이에리사'           -> 10바이트로 고정되서 들어옴
                '박차고나온애가이뻐' -> 18바이트이므로 입력불가


   ②varchar2: 가변형 문자타입
     name char(10) -> name 컬럼에 입력되는 데이터의 크기는 해당 데이터의 크기만큼 들어온다. 단, 10Byte가 넘는 데이터는 입력이 불가함.

            ex: '이순신'             -> 6바이트로 맞추어 들어옴
                '김구'               -> 4바이트로 맞추어 들어옴
                '이에리사'           -> 8바이트로 맞추어 들어옴
                '박차고나온애가이뻐' -> 18바이트이므로 입력불가

   ③Nchar , Nvarchar2: 크기의 단위가 Byte가 아니라 글자수를 나타냄
            name Nchar(10) -> name 컬럼에 입력되는 데이터의 크기가 유니코드등을 포함하여 글자수 최대 10글자까지 입력됨. 넘으면 당연히 입력 불가

            ex: '이순신'             -> 10개의 글자수로 고정되어 들어옴. -> 20Byte
                '김구'               -> 10개의 글자수로 고정되어 들어옴. -> 20Byte
                '박차고나온애가이뻐' -> 10개의 글자수로 고정되어 들어옴. -> 20Byte
                'John michael'       -> 12개의 글자수(공백포함)이므로 입력불가.
                           
            name Nvarchar2(10) -> name 컬럼에 입력되는 데이터의 크기가 유니코드등을 포함하여 글자수 최대 10글자까지 입력됨. 
                                              넘으면 당연히 입력 불가

            ex: '이순신'             -> 3개의 글자수로 들어옴. -> 6Byte
                '김구'               -> 2개의 글자수로 들어옴. -> 4Byte
                '박차고나온애가이뻐' -> 9개의 글자수로 들어옴. -> 18Byte
                'John michael'       -> 12개의 글자수(공백포함)이므로 입력불가.


 - 날짜타입: date
          date예문:
    select sysdate, current_date from dual;
    select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'),
    to_char(current_date, 'yyyy-mm-dd hh24:mi:ss')  from dual;

※ 컬럼명에 숫자가 들어온다 하더라도 가장 앞에 숫자 0이 들어올 수 있는 개연성이 있을 경우 number 형이 아닌 문자형으로 지정하여야 한다
※ 문자는 시작과 끝에 반드시 '을 사용해야 함. 사용하지 않을 경우 숫자로 인식함.


- table에 대한 comment 처리문
comment on table [table명] is '[주석내용]';

- table내 각 column에 대한 comment 처리문
comment on column [table명].[table내 주석처리할 column명] is '[주석내용]';


- 특정 테이블에 있는 각 컬럼에 대한 주석확인 처리문

select column_name, comments
from user_col_comments
where table_name = '[table명]';



- 특정 테이블의 컬럼명과 데이터 타입 조회 명령어

describe [table명];
혹은
desc [table명];



- 특정 테이블 데이터 조회
select * from [table명];



- 데이터 입력하기
insert into [table명] values([column1 데이터], [column2 데이터], ~~~~~~~, [마지막 column 데이터]);




※ insert 명령어로 입력한 데이터는 디스크에 기록되는 것이 아닌 메모리에 기록하는 것. commit으로 디스크에 기록함



- 데이터 변경하기
update [table명] set [변경할 컬럼명1] = [변경할 데이터], [변경할 컬럼명2] = [변경할 컬럼명2] + [변경할 데이터] where [변경대상인 컬럼행] = [변경대상의 컬럼 데이터];



※ where 구문이 없을 경우 모든 행의 해당 컬럼이 변경됨
※ 변경 데이터중, X = X + 200 으로 예를 들면 X컬럼에 있는 값과 200을 합산한 결과 데이터를 최종데이터로 치환한다는 의미임
※ update 명령어로 변경한 데이터는 디스크에 기록되는 것이 아닌 메모리에 기록하는 것. commit으로 디스크에 기록함



- 데이터 삭제하기
delete [table명] where [삭제할 컬럼행] = [삭제할 컬럼행에 있는 열 데이터];




※ delete 명령어로 삭제한 데이터는 디스크에서 삭제하는 것이 아닌 메모리에서 삭제하는 것. commit으로 디스크에서 삭제함.



- commit
메모리에 상주된 데이터를 디스크에 기록하는 명령어
ex: commit;

- rollback
메모리에 상주된 데이터를 삭제하는 명령어
ex: rollback;


WRITTEN BY
빨강꼬마

,