데이터 무결성 제약 조건이란?

DICR (Data Integrity Constraint Rule)

 

: 테이블에 올바른 데이터만 입력 받고 잘못된 데이터는 들어오지 못하도록 컬럼마다 정하는 규칙을 의미합니다.

   조건 이름                                                         의미
  Not null/null    이 조건이 설정된 컬럼에 null을 허용할 지 아니면 반드시 데이터를 입력받게 합니다.
  Unique    이 조건이 설정된 컬럼에는 중복된 값이 입려되지 못하도록 합니다.

  Primary key

  (기본키)

  이 조건은 NOT NULL + UNIQUE의 특징을 가지며 테이블 내에서 데이터들끼리의 유일성을 

  보장하는 컬럼에 설정합니다. 그리고 테이블당 1개만 설정할 수 있습니다.  

  Check    이 조건에서 설정된 값만 입력을 허용하고 나머지는 거부합니다.
  Default    이 조건이 설정된 커럼에 기본값으로 특정 값이 저장되도록 설정합니다.

  Foreign key

  (외래키) 

 이 조건이 다른 테이블의 컬럼을 참조해서 검사를 합니다.

 

● 데이터 무결성 제약 조건 확인 하기

desc USER_CONSTRAINTS

• owner : 제약 조건을 소유한 사용자명을 저장하는 컬럼입니다.

• constraint_name : 제약 조건명을 저장하는 컬럼입니다.  

• constraint_type : 제약 조건 유형을 저장하는 컬럼입니다.

▪ P : primary key. 

▪ R : foreign key. 

▪ U : unique 

▪ C : check, not null 

• table_name : 각 제약 조건들이 속한 테이블의 이름입니다. 

• search_condition : 어떤 내용이 조건으로 사용되었는지 설명입니다.

• r_constraint_name : 제약 조건이 foreignkey인 경우 어떤 primary key를 참조했는지를 대한 정보를 가집니다.

 

 

 

지금부터 각 조건들의 특징과 사용방법을 예시들을 통해서 설명하겠습니다.

 

 

1) Not null : 반드시 데이터를 입력

 

-- ex) 회사에서 사원을 관리 하기위해서는 이름이나 사원 번호 같은 컬럼에는 null 값이 들어가면 안됩니다. 

         null 이 들어가게 되면 누구인지 관리가 되지 않기 때문이다.

 

create table emp02(
    empno number(4) not null,
    ename varchar2(20) not null,
    job      varchar2(20),
    deptno number(2)
); 

 

사원 번호와 사원 이름 뒤에 not null 넣어서 null 값이 들어오지 못하도록 만듭니다.

insert into emp02 values(null, null, 'saleman', 40 ); -- 사원번호 & 사원이름에 null이 입력 : 오류
insert into emp02 values(null, '홍길동', 'saleman', 40 ); -- 사원번호에 null이 입력 : 오류
insert into emp02 values(1234, null, 'saleman', 40 ); -- 사원이름에  null이 입력 : 오류

 

 

 

2) Unique : 지정된 컬럼에 중복되지 않고 유일한 값만 저장

 

-- ex) 회사에서 사원을 관리 할 때, 이름과 사원 번호는 꼭 필요하다고 이야기 했습니다. 이름은 동명이인이 존재 할 수

있지만 사원 번호는 절대 중복되면 안됩니다.

 

create table emp03(
    empno number(4) unique,
    ename varchar2(20) not null,
    job      varchar2(20),
    deptno number(2)
); 

1차적으로 이름은 꼭 필요한 값이기 때문에 not null 을 사용합니다. 다음으로 unique을 사용함으로 사원 번호의 중복을 막습니다.

insert into emp03 values(1234, '홍길동', 'saleman', 40 );
insert into emp03 values(1234, '홍길서','관리부', 40 ); -- 사원 번호 중복 : error 

 

 

 

3) constraint : 제약을 지정해주는 명령어 ( 컬럼 레벨로 조건명 명시 )

 

-- 오류 보고 - ORA-00001: unique constraint (SCOTT.SYS_C007005) violated 에서
-- SCOTT.SYS_C007005 제약 조건명을 직접 입력해줄 수 있다.

create table emp04(
    empno number(4) constraint emp04_empmo_uk unique,    --  unique 약자 : uk
    ename varchar2(20) constraint emp04_ename_nn not null,  --  not null 약자 : nn
    job  varchar2(20),
    deptno number(2)
); 

-- emp04 라는 테이블에 값을 일부러 오류를 내보겠습니다.

insert into emp04 values(1234, '홍길동', 'saleman', 40 );
insert into emp04 values(1234, '홍길서','관리부', 40 ); -- 고의적으로 unique의 오류를 냈습니다. 

-- 명명한 것이 오류에 등장합니다. .
-- 오류 보고 - ORA-00001: unique constraint (SCOTT.EMP04_EMPMO_UK) violated 
-- 어떤 데이터가 오류인지 조금 더 직관력 있게 확인 할 수 있도록 해줍니다. 

 

 

 

4) Primary key(기본키) : not null + unique 

 

-- 사원 번호 같은 경우는 중복만 없으면 안되는 것이 아니라 값은 항상 존재해야 합니다. 그것을 충족해주는 명령어를

사용하겠습니다.

create table emp05(
    empno number(4) constraint emp05_empmo_pk primary key, --  primary key 약자: pk
    ename varchar2(20) constraint emp05_ename_nn not null,  
    job      varchar2(20),
    deptno number(2)
); 

사원번호에 primary key를 넣음으로써 항상 값을 취하고 또한 중복되지 않도록 만들었습니다.

nsert into emp05 values(null,'홍길동', 'saleman', 40 ); 
--  오류 보고 - ORA-01400: cannot insert NULL into ("SCOTT"."EMP05"."EMPNO")사원번호에 null 입력 
insert into emp05 values(1234, '홍길서','관리부', 10 ); 
-- 삽입OK
insert into emp05 values(1234,'홍길동', 'saleman', 40 ); 
--오류 보고 - ORA-00001: unique constraint (SCOTT.EMP05_EMPMO_PK) violated 사원번호 중복

 

 

 

5) Foreign key(외래키) : 다른 테이블이 칼럼에 들었있는 값만 저장을 허용

 

① 부서번호가 기본키인 dept06 이름의 테이블 생성

create table dept06(     
    deptno number(2) constraint dept06_deptno_pk primary key, -- 부서번호가 기본키
    dname varchar2(20),
    loc      varchar2(20)
);

② dept06 insert into 를 사용하여 내용 삽입

insert into dept06 values(10, '회계부','종로구');
insert into dept06 values(20, '연구서','서대문구');
insert into dept06 values(30, '영업부','영등포구');

③ 부서번호에 외래키를 넣어서 dept06 테이블의 내용의 값을 저장하도록 허용

create table emp06(
    empno number(4) constraint emp06_empno_pk primary key, --  primary key 약자: pk
    ename varchar2(20) constraint emp06_ename_nn not null,  
    job      varchar2(20),
    deptno number(2) constraint emp06_deptno_fk 
                                references dept06(deptno) -- foreign key 약자: fk
    );
 
insert into emp06 values(1234,'홍길동','세일즈맨',30);
insert into emp06 values(1235,'홍길남','점원',40);
-- 오류 보고 - ORA-02291: integrity constraint (SCOTT.EMP06_DEPTNO_FK) violated - parent key not found
-- dept06 안의 데이터에 40이라는 번호가 없기 때문에 오류가 생깁니다. 

-- 칼럼의 내용에 대한 정보만 들어갈 수 있도록 데이터베이스가 감시줍니다.

   그 외의 값이 들어가게 하려면 오류를 낸다.
-- 대상이 바라보는 테이블 (=부모 테이블), 대상을 바라보는 테이블(=자식 테이블)로 정해줍니다.
-- 외래키는 자식에게 걸어주는 것으로, 부모 키가 되기 위한 컬럼은 반드시 부모 테이블의

   기본키나 유일키로 설정 되어있어야 합니다.  

-- 부모데이블이 unique 의 특성이 필요한 이유는 중복성을 피하기 위함합니다.

 

 

 

6) Check : 저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만 허용

 

check 문제를 통해서 설명 하겠습니다.

-- 급여 컬럼을 생성하되 값은 500~5000 사이의 값만 저장 가능
-- 성별 저장 컬럼은 gender를 정의하고, 'M'/'F' 둘 중 하나의 값만 저장 가능

 create table emp07(
    empno number(4) constraint emp07_empno_pk primary key, 
    ename varchar2(20) constraint emp07_ename_nn not null,  
    sal       number(7,2) constraint emp07_sal_ck check(sal between 500 and 5000), 
    gender  varchar2(1) constraint emp07_gender_ck check(gendr in ('M','F'))
); 
-- check 의 약자: ck / 범위=  between A and B 
-- IN 이라는 키워드를 통해서 OR 의 역할을 할 수 있다. 'M','F' 외의 값이 들어가면 오류가 됩니다.
 
insert into emp07 values(1234,'홍길동',6000,'M');
-- 오류 보고 - ORA-02290: check constraint (SCOTT.EMP07_SAL_CK) violated / 급여가 5000이상

insert into emp07 values(1235,'홍길남',3000,'m');
-- 오류 보고 - ORA-02290: check constraint (SCOTT.EMP07_GENDER_CK) violated
   / 대소문자를 구분한다는걸 잊지말자!

 

 

 

7)  Default : 기본값으로 특정 값이 저장되도록 설정하는 조건

 

default 문제를 통해서 설명 하겠습니다. 

-- 지역명(loc) 컬럼에 아무 값도 입력하지 않을 때, 디폴트 값인  'SEOUL' 이 입력되도록 default 제약 조건 지정.

create table dept08(     
    deptno number(2) constraint dept08_deptno_pk primary key,
    dname varchar2(20) constraint dept08_dname_nn not null,
    loc      varchar2(20) default 'SEOUL'
);
insert into dept08 values(10,'회계부');--테이블에 3개의 값을 넣어야 하는데 2개만 들어가서 : ERROR
insert into dept08(deptno, dname) values(10,'회계부'); -- 결과값 = 10 회계부 SEOUL 로 나타난다. 

결과 값이 없어서  NULL 이 들어갈 자리에 SEOUL의 값이 출력되도록 한 것입니다.

 

 

 

 

8) 제약 조건 명시 방법

 

   ① 컴럼 레벨로 조건명 명시해서 제약 조건 설정

        - 지금까지 파일명 옆으로 조건을 넣었던 방법입니다.

 

   ② 테이블 레벨 방식 제약 조건 설정. 

      주의) not null 조건은 테이블 레벨 방식으로 제약 조건을 지정할 수 없습니다. 

create table emp09(
    empno number(4),
    ename varchar2(20) constraint emp09_ename_nn not null, -- not null은 무조건 옆으로만 작성이 가능하다.
    job      varchar2(20),
    deptno number(2),
    constraint emp09_empno_pk primary key(empno),
    constraint emp09_job_uk unique(job), 
    constraint emp09_deptno_fk foreign key(deptno) references dept06(deptno) 
);  
    -- 컬럼 레벨과 다르게 foreign fey(deptno)를 넣어줘야 한다. 

 

 

 

9) 제약 조건 추가하기

alter table emp10 add constraint emp10_empno_pk primary key(empno); 
alter table emp10 add constraint emp10_deptno_fk foreign key(deptno) references dept06(deptno);
ALTER을 통해서 수정을 하고 ADD 통해서 추가를 합니다. 

 

 

 

10) not null 제약 조건 추가하기

alter table emp10 add constraint emp10_ename_nn not null(ename); -- error 

alter table emp10 modify ename constraint emp10_ename_nn not null;
-- 원래 null 이라는 제약 조건이 default  로  되어있기 때문에 add가 아니라 modify 로 사용하면 됩니다.  

 

 

 

11) 제약 조건 제거하기

alter table emp10 drop primary key; -- 제거할 때는 drop을 사용

 

 

 

12) 제약 조건(외래키) 컬럼 삭제

delete from dept06 where deptno = 30;
-- 오류 보고 - ORA-02292: integrity constraint (SCOTT.EMP06_DEPTNO_FK) violated - child record found 
-- 자식 테이블이 있기 때문에 삭제 되지 않습니다. 
-- foreign key 로 연결 되어 있을 때는 삭제 되지 않습니다.( 기준이 되는 테이블이 삭제 되기 때문입니다.)  
-- 제약 조건의 비활성화 
-- 참조 하고 있는 대상(자식)을 다 삭제한후 제약 조건을 삭제합니다.

①
alter table emp06 disable constraint emp06_deptno_fk;  
-- DISABLE CONSTRAINT : 제약 조건의 일시 비활성화(자식들을 비활성화)

②
delete from dept06 where deptno = 30;
-- 삭제 완료
③
select * from dept06;
-- 삭제 완료 확인
④
alter table emp06 enable constraint emp06_deptno_fk; 
-- 오류 select * from emp06; -- deptno 값이 30이 있기  때문에 활성화 할 수 없습니다. 

-- ENABLE CONSTRAINT : 비활성화된 제약 조건을 해제하여 다시 활성화

--1)
insert into dept06 values(30,'총무부','중구');  -- 30번의 부서를 복귀 시킴

--2) 외래키를 가지고 있던 테이블을 찾아서 직접 변경시킵니다. 
alter table emp06 enable constraint emp06_deptno_fk; -- 변경 완료

 

 

 

13) Cascade : 부모를 잠깐 비활성화 하면서 자식들까지도 같이 비활성화 해줍니다.

alter table dept06 disable primary key cascade;
-- 부모가 자식까지 영향을 미쳐서 모두 비활성화 된다. 

alter table dept06 drop primary key; -- error 
alter table dept06 drop primary key cascade;
-- cascade 로 비활성화 시킨거라면 cascade를 넣어서 삭제한다.

alter table dept06 add constraint dept06_deptno_pk primary key(deptno);
-- 삭제를 하고 나서 원래있던 기본키를 넣어준다(원상복귀)

트랜잭션 이란 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻합니다.

 

 

- 하나의 동작을 수행했을 때, 처음 수행 동작부터 마지막까지 올바르게 수행했을 때, 반영하고 오류가 났을 때,

  전 상황으로 복귀해주는 역할을 합니다.

 

- 데이터베이스에서 작업의 단위로 트랜잭션이란 개념을 도입한 이유는 데이터의 일관성을 유지하면서 안정적으로

  데이터를 복구시키기 위함 입니다.

 

예시로 설명을 하겠습니다. 트랜잭션 이란 단어를 보면 현금을 인출하는 장면을 떠오려보세요.

현금 인출기에서 돈을 뽑을 때, 카드를 넣고 원하는 액수 만큼을 잔액에서 빼서 인출해줍니다.

또한 총 액수에서 인출이 된 만큼의 차익을 뺀 금액으로 바뀌도록 되어 있습니다.

어느 하나라도 문제가 일어나면 문제가 생기면 모든 동작이 수행 됐을 때 모든 과정이 완료 됩니다.

트랜잭션이 이러한 과정을 거치는 것이라고 생각하면 됩니다.

 

 

노란 창에서는 삭제했지만, 다른 검정 창에서는 삭제되지 않았습니다.

아직까지 데이터 베이스에 최종적으로 반영된 것이 아닌 상태이기 때문에 값이 나왔습니다.

 

 

 

      commit; -- 명령문을 실행하면 최종 반영 

 

노란 창에서 Commit; 을 사용했을 때, datebase의 내용이 반영이 되어서 검정 창에서도 입력 값이 출력되지 않습니다.

 

 

  • DDL 은 자동으로 트랜젝션이 적용(commit)

  • DML 은 정산적으로 종료(DB접속이 종료) 되었다면 자동으로 commit , 최종적으로 연결을 스스로 저장

  • 정전이 발생하거나 컴퓨터가 다운 시 자동으로 rollback

  • Rollback : 마지막 commit 한 시점으로 돌아가고, 한번도 commit 하지 않았다면 처음으로 돌아간다.

 

      되돌리기 – rollback

 

delete로 테이블을 삭제하지만 rollback 을 사용하여 테이블을 복귀 시킨 것입니다.

DML은 데이터 내용에 대해서  입력(insert) , 출력(select) , 수정(update) ,  삭제(delete) 등을 처리하는

명령어로 DDL 은 테이블 자체를 수행하는 명령어라면 DML은 그 안의 세부적인 것들을 수행하는

명령어로 생각해주시면 좋을것 같습니다.

DML은 CRUD라고 이야기 하는데 C- CREATE/ R- READ / U- UPDATE/ D- DELETE 의 약자 입니다.

 

 

1) insert into ~ values() - 삽입 : 데이터 입력 (저장)

형태 : insert into 테이블명(필드명1. 필드명2. 필드명3...) values(내용1. 내용2. 내용3);

insert into exam01(
                   deptno,dname,loc) 
                   values(10,'회계부','종로구'); -- 1행이 삽입이 됨

 

 

2)  insert into ~ values() - 삽입 : 필드명 입력 생략 / 가장 이용하는 방법 입니다.

형태 : insert into 테이블명 values(내용1, 내용2, 내용3);     --    단, 순서에 맞게 내용을 넣어야한다.

insert into exam01 values(30,'영업부', '용산구'); 

 

 

3) null 값 입력  

insert into exam01 values(40,'관리부',null);

NULL 이란?

null을 통해서 확정 되지 않은 정보 대신 입력 함으로 데이터가 저장될 수 있게 만듭니다.

즉, 입력 데이터가 없음에도 불구하고, error  방지를 위해 삽입한다고 보시면 됩니다.

 

 

4) UPDATE :  필드의 데이터를 변경 ,  부서번호 변경

형식 : update 테이블명 set 필드명 변경 내용

update exam01 set deptno = 30;   --deptno의 모든 번호를 30으로 만듬 
*** update ... set 함께 갑니다 ***

 

 

5) UPDATE를 활용 문제

- 급여 10% 인상 금액 반영 하기

update exam02 set sal = sal 1*1 
-- sal:월급 / 월금 = 현재 월급의 1 x 1 (10% = 1.1) 
--  '='  같다는 의미도 있지만 프로그래밍에서는 대입의 의미도 가지고 있습니다. 
-- 그래서 sal*1.1 의 값을 sal에 저장되어진다. 

 

 

6) UPDATE를 활용 문제 :  where 사용하기

- 부서번호가 10 인 사원의 부서번호를 20 으로 변경

update exam02 set deptno = 20
where deptno = 10; 
-- where을 넣지 않으면 테이블의 deptno이 모두 20되지만 where 조건을 통해서 
-- deptno가 10인 사람만 20으로 변경된다. 

 

 

7) DELETE : 테이터 삭제

형태 : delete from 테이블명;

delete from kongcafe; 

 

TRUNCATE VS DELETE ???

truncate table kong; 같은 동작을 수행하지만 database 안에서는 truncate 은 테이블 전체를 삭제했다가

테이블만 다시 생성해주고 delete 은 안에 내용만 삭제 합니다. 결과는 같습니다, 그렇기 때문에 둘중에

필요한 아무거나 사용해도 괜찮습니다.

 

 

8) DELETE 를 활용 문제 :  where 사용하기 

- 30 번 부서 사원을 삭제

delete from  exam02  
where deptno = 30; 
-- delete 함수 이지만 delete from 으로 외워두는 것이 훨씬 편리합니다. 

 

 

 

DDL 명령를 통해서 테이블을 생성(CREATE) , 수정(ALTER)  ,잘라내기(TRUNCATE), 이름변경(RENAME), 삭제(DROP) 등을 수행 할 수 있습니다.  각각의 명령어들을 예시를 통해서 자세히 알아보겠습니다.

 

 

1) CREATE 문 : 새로운 테이블을 생성할 때 사용합니다.

형식 : create table 테이블 명( 필드명1 내용(숫자-NUMBER, 글자-VARCHAR2)1, 필드명2 내용2 ...);

 create table 문 
create table cafe(
    cono        number(4), -- 4자리까지 담을 수 있는 숫자의 저장 공간을 확보   
    coname    varchar2(20),  -- 문자를 담을 있는 저장소의 공간을 확보 
    cosal        number(6,2) -- 6자리까지 할당 할 수 있지만 4자리는 정수, 2자리는 실수의 자리로 저장 공간을 확보
);

TIP) varchar2(N) : N의 값을 너무 크게 저장공간을 잡으면 프로그램 진행 속도를 늦출 수 있습니다.
                   그렇기 때문에 적당한 수를 입력하시면 좋습니다. 

 

 

2) CREATE 문을 활용 : 기존 테이블과 동일하게 테이블 만들기

 

형태 : 형식 : create table 테이블 명 as select * from 복사할 테이블 명;

기존 테이블과 동일하게 테이블 만들기

create table kongcafe
as
select * from cafe;  -- cafe의 테이블과 동일한 값이 kongcafe에 그대로 복사가 됩니다. 

 

 

3) ALTER문 : 수정을 의미하는 명령어로 다양하게 사용됩니다.

 

- 기존 테이블에서 새로운 컬럼 추가 : alter 문(필드추가)

형태  :  alter table  테이블 이름 add (필드 명 필드 내용);

* 칼럼은 같은 이름으로 저장 되지 않습니다.

alter table kongcafe
add(                       -- 추가 할 때, add 사용 
    coloc     varchar2(10) -- 10자리 까지 문자를 담을 수 있는 공간 확보
);

 

 

4) ALTER 문을 활용 : 테이블 구조 수정 / 필드 수정

형태 :   alter table  테이블 이름 modify (필드 명 필드 내용); 

alter table kongcafe 
modify(                   -- 칼럼의 내용을 수정할 때 modify 사용
    coloc    varchar2(20) -- 20자리 까지 문자를 담을 수 있게 변경 
);

 

 

5)  ALTER 문을 활용 : 테이블 구조 수정 : 필드 삭제 

형태 : alter table 테이블명 drop column 필드명;

alter table kongcafe
drop column coloc; -- 필드 항목을 삭제시에는 drop 사용

 

 

6) RENAME : 이름변경

 

① alter table 테이블명 rename to 바꿀 테이블명 ( alter + rename)

alter table kongcafe rename to kimcafe;

 

② rename 테이블명 to 바꿀 테이블명

rename kongcafe to kimcafe

 

 

7) DROP : 테이블 삭제

형식 : drop table 테이블 명;

drop table kimcafe; 

-- 이렇게  삭제하게 되면 IN$Pf/4SJUDTGyOaorikmfynQ==$0 이러한 형태로 삭제 되지 않고

   로 스스로 이름을 임시로 하여해서 저장되어 있다.

 

* 저장 되어 있는 임시 테이블들 한번에 삭제하기

purge recyclebin;

* 임시로 저장된 테이블 복원 하는 법

형태: flashback table 테이블 이름  to before drop

flashback table kimcafe to before drop; -- 삭제 전으로 돌려준다.
flashback table kimcafe to before drop rename to konfcafe; 
-- 복원시에 이름을 바꾸고 싶다면 rename을 사용하면 된다.

 

* 임시 테이블 만들지 않고 한번에 삭제 하기

형태 : drop table 파일명 purge;

drop table kimcafe purge;

 

 

 

8) TRUNCATE : 테이블 내의 모든 데이터 (레코드) 삭제

헝태: truncate table 파일명;

truncate table kongcafe;

 

오라클 자료형 타입 (타입에 타입) # 컴퓨터 공간은 한정 되어있습니다.

  1. 문자형

    CHAR(size) 고정형 문자열: size의 값은 데이터를 저장할 공간 확보/ 입력된 자료의 길이 상관 없이 정해진 길이 만큼 영역 차지합니다.

     

    VARCHAR2(size) 가변형 문자열: 10개의 공간만을 확보해주며, 가변성과 유동성을 가지고 할당 일반적으로 VARCHAR2을 사용합니다. .

     

    Ex) CHAR(10): (char ) -10개의 공간을 다 사용함

    Ex) VARCHAR2(10): (char) – 4개의 공간만 사용함

     

  2. 숫자형

    NUMBER, : 아무것도 지정하지 않을 때, 최고 40자리까지 저장할 수 있다. 저장소 공간을 40까지 사용하게 됩니다.

     

    NUMBER(w) 정수형 타입: 입력을 하나만 받을 수 있으며, w자리까지의 수치로 최대38자리까지 가능합니다.

     

    NUMBER(w,d) 실수형 타입: 입력을 2개 받을 수 있으며, w는 전체 길이, d는 소수점 이하 자릿수입니다.

    NUMBER(5,2) 전체는 5자리 인데 정수 값은 3자리, 소수 값은 2자리 입니다.

    (소수점이 생겼다고 해서 전체적인 자릿수는 변화하지 않습니다)

     

    Ex) NUMBER(5) = 10000

    Ex) NUMBER(5,3) = 10.000

  3. 날짜형 DATE

      - DATE 세기, , , , 시간, , 초의 날짜 시간 데이터를 저장하기 위한 데이터 형 입니다.

     

      - 날짜 타입 안에는 세기, , , , , , , 요일 등 여러 가지 정보가 들어 있지만 별다른 설정이 없으면

        년, , 일만 출력 됩니다.  

 

      - 기본 날짜 형식은 "YY/MM/DD"형식으로 “년//일”로 출력 됩니다.

DataBase는 저장공간으로서의 주된 역할을 가지고 있지만 사람들에게 편의를 주기 위해서

내장 되어있는 함수를 가지고 있습니다. 내장 함수에는 문자열 처리 함수 , 수식 처리 관련 함수 등

여러 함수들이 존재 합니다. 지금부터 예시를 통해서 하나씩 이야기해보겠습니다.

 

● 임시 데이터 출력

 

① select 1234 * 1234 from 테이블명;

각 테이블의 레코드 수 만큼 출력 되어집니다.

 


② select 1234 * 1234 from dual; select

문을 작성시 테이블이 필요없을 때 dual 을 사용합니다. 또한  필요한 결과만 얻을 수 있습니다.

 

 

dual은 이름만 가지고 있는 테이블을 만들 때 사용할 수 있습니다.

- select * from dual;

 

● 내장 함수 , 문자열 처리 관련 함수

(문자열 함수의 결과값을 편하게 보시게 하기 위해서 dual을 사용하겠습니다.)

-- 대부분 프로그래밍 언어에서 문자열에서 제공하고 있다. 

 

 

1) lower() : 모든 문자를 소문자로 변환합니다. 

형식 : select lower('문자열 데이터') from 테이블명;

 

 

2) upper() : 모든 문자를 대문자로 변환합니다.

형식 : select upper('문자열 데이터') from 테이블명;

 

 

3) initcap() : 첫문자만 대문자로 변환합니다.

형식 : select initcap('문자열 데이터') from 테이블명;

 

 

4) concat() : 문자열 연결 -- 많이 사용 되는 함수.
select concat('문자열 데이터1', '문자열 데이터2') from 테이블명;

* concat은 두 개의 문자열을 하나의 결과로 나오게 하며, 두개  까지만 연결 가능 합니다.

 

 

 

5)  length() : 문자열의 길이를 나타냅니다.

형식 : select length('문자열 데이터') from 테이블명;

* 띄어쓰기까지 길이의 결과로 출력됩니다.

 

 

6) substr() : 문자열 추출을 합니다.

형식 : select substr('문자열 데이터', 첫번쨰 시작 자리수 , 끝나는 자리수) from 테이블명;

* 문자열에서 특정 위치만 추출하고 싶을 때 사용됩니다.  단, 띄어쓰기 및 공백도 포함 합니다.

 

 

7) instr() : 문자열 시작 위치를 알려줍니다.

형식 : select instr('문자열데이터', '시작문자') from 테이블명;

* 전달 된 데이터 에서 필요한 정보를 적으면 위치 정보를 추출합니다.

추가적으로 select instr('seven','e') from dual; -- 중복되는 값이 있으면 첫번째 글자의 자리수만 반환합니다.

 

 

8)  trim() : 컬럼, 대상 문자열에서 특정 문자가 첫번째 글자이거나 마지막글자이면 잘라내고남은 문자열만 반환합니다.

형식 : select trim('특정문자 ' from '문자열데이터')from 테이블명;

* 실수로 빈 여백을 넣어서 회원가입을 했을 때, 빈칸까지 아이디 혹은 비밀번호로 받아드리는 상황을 방지 하기 위해서 많이 사용됩니다.

 

 

 

 

 

● 내장 함수 , 수식 처리 관련 함수

 

1) round() : 반올림(음수: 소숫점 이상 자리)

형식: select round(숫자 데이터,n) from 테이블명;

* round(1234,-3) 의 결과값은 1000 세번째 자리인 2가 반올림 되지 않기 때문입니다.

양수일 때는 소수점을 기준으로 뒤로 가지만, 음수일때는 소수점을 기준으로 앞으로 감니다.. 

 

 

2) abs() : 절대값

형식 : select abs(n) from 테이블명;

* n의 값에 음수, 정수 같은 값이 나옵니다.

 

 

 

3) floor() : 소수자리 버리기

형식 : select floor(n.nnn) from 테이블명;

* 가장 근접해 있는  정수 값을 취합니다.

 floor(-12.1234) 의 결과 값을 -13이 됩니다.

 

 

4) trunc() : 특정 자리 자르기

형식: select trunc(12.1234567,3) from 테이블명; 

* round 와의 차이를 명확하게 봐야합니다.  round()는 반올림을 해주고, trunc()는 그냥 자리수 만큼 버려줍니다.

 

 

5) mod() : 나머지

형식: select mod(n,나누기할 수) from 테이블명;

 

 

 

 

 

 

 

오늘은 그룹 함수에 대해서 알아보겠습니다.

 

● 그룹 함수란 무엇일까요?

: 그룹 함수는 하나 이상의  테이블 값(행)을  그룹으로 묶어 연산을 통해서  합계, 평균 최대값 등  하나의 결과로  나타낼 수 있도록 도와주는 함수의 종류 입니다.

 

● 그룹 함수 종류

 

 

예시를 통해서 각 함수들을 설명하겠습니다.

 

1) 합계 : sum() / 형식 : select sum(수치형 데이터가 들어있는 필드명) from 테이블명;

 

 

2) 카운트 : count()  / 형식 : select count(필드명) from 테이블명;

 

 

3) 평균 : avg() / 형식 : select avg(수치형 데이터가 들어있는 필드명) from 테이블명;

 

 

4) 최대값 : max() / 형식 : select max(수치형 데이터가 들어있는 필드명) from 테이블명;

 

 

5) 최소값 : min() / 형식 : select min(수치형 데이터가 들어있는 필드명) from 테이블명;

 

 

6) Group by 절

* Group by 절은 문제를 통해서 설명하겠습니다.

  

    Q) 직업별 급여 평균( select avg(sal) from emp; )

 

 

문제를 잘 푼거 같은데 오류가 나왔습니다. 왜 오류가 났을까요?

job이라는 테이블에는 14개의 값이 출력 되고, avg(sal)은 1개의 값이 출력 되기 때문입니다.

database는 정형의 데이터(테이블)로 되어 있기 때문에 출력하는 값의 개수를 맞춰주어야 합니다. 

이런 상황에서 Group by 절을 통해서 문제를 해결할 수 있습니다.

 

group by절을 통해서 결과 값이 5개의 그룹의 평균 급여로 정형화된 형식으로 출력 되었습니다.

 

7) Having 절 : group by 절을 having 절을 통해서 추가적 조건을 가능하게 해줍니다

 

*  Having 절도 문제를 통해서 설명하겠습니다. 

 

     Q) 직업별 급여 평균(단, 급여 평균 2000이상 직업)

 

여기 까지는 앞에 group by 절을 통해서 급여의 평균을 구하는 것이 같습니다.

이제 추가 적인 조건인 2000이상인 급여를 추가해 보겠습니다.

 

 

 

 

 

SELECT문(검색, 추출): select 문은 데이터를 조회 하기 위한 sql 명령어 입니다.

 

SELECT 문을 갈략하게 알아보겠습니다.

 

1. SELECT * FROM TABLE_NAME; 이런 대표적인 형식을 가지고 있습니다.

 -  select 와 from 언제나 함께 있어야 합니다.

 -  마지막은 반드시 ; (세미콜론) 으로 끝내야 합니다.

 

2. SELECT문 안에는 각종 명령어들이 함께 사용합니다.

 - desc : 데이터의 특징을 보여줍니다.

 - as: 생략 할 수 있지만 별칠을 만들 때 사용합니다.

 - distinct : 중복 된 데이터를 필터링해 한번만 사용합니다.

 - whrer :  문장에서 조건을 넣어줄 때 사용합니다.

 

이외에도 다양한 명령어를 통해서 결과물을 추출합니다. 뒤에서 예시를 통해서 자세히 설명하겠습니다.

 

 

우선 select 문을 자세히 들어가기 전 가장 기본적인 연산자 3가지을 알아보고 시작하겠습니다.

 

1. 산술 연산자

산술 연산자는 우리가 많이 알고 배워왔던 것들입니다.

● ( + ,  -  ,  *  ,  / ) 입니다.

 

 

2. 비교 연산자

비교 연산자는 조건을 주어질 때 많이 사용 됩니다.

 

● = 같다

● > 보다 크다

● < 보다 작다

● >= 보다 크거나 같다

● <= 보다 작거나 같다

● <>, !=, ^= 다르다

 

3. 논리 연산자

논리 연산자 또한 조건을 주어질 때 많이 사용 하니 꼭 기억해야합니다.

 

●AND :  두 가지 조건을 모두 만족하는 값을 출력합니다.

●OR : 두 가지 조건 중에서 한가지라도 만족한다면 값을 출력합니다.  

●NOT : 조건에 만족하지 못하는 값을 출력합니다.

 

이제 본격적으로 SELECT 문과 다양한 명령어들을 통해서 결과를 출력해보겠습니다.

 

1) 테이블 목록 출력 ( select * from 파일이름;)

 

 

 

 

2) 테이블의 특징 출력  ( desc 파일명:)

 * NUMBER = 숫자 , VARCHAR2 = 글자

 

 

3) 테이블에서 필요한 요소만 출력 (select 칼럼1, 칼럼2... from 테이블이름;)

칼럼 : 결과 값같이 열의 위치에서 테이블의 필드명을 나타내주는 것입니다(dname, loc)

 

 

4)필드명에 별칭 붙여주기 (select 필드명1 as " 별칭 1" , 필드명2 as " 별칭2", 필드명3 as "별칭3"... from 테이블 이름;)

* as 는 생략이 가능, 별칭의 띄어쓰기를 하고 싶을때는 "" (큰 따옴표) 를 사용합니다.

TIP) 별칭을 붙있 때는 항상 "별칭" 이렇게 큰 따옴표를 붙이는게 나중에 실수를 줄일 수 있습니다.

 

 

 

 

5) 필드명을 중복 제거 후 출력(select distinct 필드명 from 파일명;)

 

 

 

6)where조건문 만들기 

( select 필드명1, 필드명2, 필드명3 ... from 파일명 where 조건;)

 

ex 1) 급여가 3000 이상인 사원 정보 출력 (급여 - sal/ 사원번호 - empno/  사원이름 - ename)

 

 

 

ex 2) 급여가 1000 ~ 3000 사이인 사원을 출력  

*  between ~ 사이의 값을 보여줍니다. (between  A and B)

 

 

 

ex 3) 2번째 자리에 'A'가 들어가 있는 사원 출력

* like 조건에 부합한걸 연결해줍니다.

  '%' = 어떤 문자가 와도 되고, 아무것도 안와도 됩니다.

  '_' = 어떤 문자라도 와야합니다. (아무것도 오지 않으면 안됩니다)

 

 

 

 

 

7) 오름차순으로 정렬하여 출력 (select * from 파일명 order by 필드명 asc;)

* order by 정렬하여 출력 합니다.

* asc 오름 차순으로 나열 합니다. 단 asc 자체는 생략을 해도 오름차순으로 출력됩니다.

* desc 내림 차순으로 나열 합니다.

 

 

 

 

+ Recent posts