dataBase , vmware

oracle 데이터베이스 제약 조건 (constraint)

LRWoo 2023. 6. 30. 18:20
728x90
반응형
테이블의 컬럼에 대하여 특정 조건을 부여하는 방식


1) primary key
기본키, 여러 줄의 데이터 중에서 하나의 데이터만 가져올 수 있는 구분을 위한 키
다른 줄의 기본키값과 중복될 수 있으며, 빈 값을 넣을 수 없다.

2) unique
고유키, 중복값을 설정할 수 없다. 단 null은 설정할 수 있다.

3) not null
중복여부는 상관이 없고, 빈 값을 설정할 수 있다.

4) default
기본값을 지정한다. 값을 넣지 않아도 자동으로 입력되는 항목을 설정할 수 있다.
- 등록 시점의 날짜 및 시간
- 데이터의 기본키

5) check
컬럼의 값은 특정 조건을 만족해야만 한다.
-값의 크기, 범위 , 선택지 등. 자료형 외에도 특정 값만 넣을 수 있게 하기 위해 사용한다.
-가격의 범위는 0에서 100000 사이이다
-성별은 '남' 혹은 '여' 중에서만 선택 가능하다

6) foreign key
외래키, 컬럼의 값은 다른 테이블의 특정 컬럼이 이미 등록된 값이어야 한다.
-현재 테이블에서 다른 테이블을 참조하기 때문에 외래키 라고 한다.
-[상품] 테이블에 등록된 항목에 대해서만, [매출] 테이블에 등록할 수 있다
-[게시글] 테이블에 등록된 항목에 대해서만, [댓글] 테이블에 내용을 작성할 수 있다.

 

<제약조건을 걸어서 간단한 테이블을 생성해보자 >

 

 

 

시퀀스
지정한 범위 내에서 값을 순차적으로 내어주는 데이터베이스 객체 
주로 number 타입의 primary key 값을 관리하기 위해 사용한다. 

 

시퀀스 자주쓰이는 구문 


create sequence [시퀀스이름]
start with [시작값]
maxvalue [최대값]
increment by [증가값]
nocache   -- 이전 사용 값을 캐시에 저장하지 않는다.
nocycle    -- 최대값 이후 순환시키지 않는다 (값을 재활용하지 않는다. )  
 

 

 

이전에 생성돼있었던 제약조건, 시퀀스 제거

drop table product cascade constraints purge;
drop sequence product_seq;

 

테이블 product에 대한 시퀀스 생성 

create sequence product_seq
    start   with    1       --product 테이블에서 사용할 시퀀스 생성
    maxvalue        99999   --1부터 시작해서최대값 99999까지
    increment by    1       --1씩 증가한다.
    nocache                 --이전 값 기억x
    nocycle;                --최대값 도달시 처음부터 다시 x

 

테이블 제약조건을 걸어서 생성

create table product (
    idx     number          default product_seq.nextval primary key,
    name    varchar2(100)   unique,
    price   number          check(price >=100),
    expDate date            check(expDate > to_date('2023/07/01', 'YYYY/MM/DD')),
    memo    varchar2(1000)  not null
    );

 

 

같은 값을 넣으려고 하면 제약조건에 위배된다.  

name이 primary key(고유키)가 걸려있기 때문에 같은 값을 넣을 수 없다. 

 

 

이름을 '몽쉘' 로 바꾸면 값이 들어간다. 

 

 

 

페레로로쉐의 유통기한을 23년 6월 30일로 하면 체크제약조건에 위배되어서 값이 들어가지 않는다

expDate date            check(expDate > to_date('2023/07/01', 'YYYY/MM/DD')),

 

 

 

 

 

다시 유통기한을 7월2일로 바꿔서 넣으면 값이 들어가지만

컬럼 idx의 값은 5번이 된다.  idx 3번 4번이 제약조건에 위배되어서 걸러지고 5번부터 새로들어가는 것 

 

 

 

tip!

제약조건이 걸린 테이블에도 업데이트 쿼리문을통해서 price값을 바꿀 수 있다. 

 

update product
    set
        price = 1500 
    where
        idx = 5;

 

 

 

 

 

그럼 이제 워크시트를 열어서 drop과 create 시퀀스 제약조건을  이용해서 

어제 작업했던 phonebook의 내용을 날리고  phonebook의 구성을 바꿔보자 

 

기존에 있던 phonebook 테이블, 시퀀스 날리기 

--drop table
drop table phonebook cascade constraints purge;
--drop sequence
drop sequence phonebook_seq;

 

phonebook 테이블에 대한 시퀀스 새로 생성 

create sequence phonebook_seq 
    start   with      1
    maxvalue        99999
    increment by    1
    nocache
    nocycle ;

 

phonebook 테이블 생성시 걸린 제약조건 

--create table 
create table phonebook (
    idx       number            default phonebook_seq.nextval primary key,
    name      varchar2(100)     not null,
    age       number            check(age >0 and age<=120),
    pnum      varchar2(100)     unique
    );

 

 

insert로 더미데이터 넣기 

--insert into
insert into phonebook (name,age,pnum)
    values('나단비',5,'010-1234-5678');
insert into phonebook (name,age,pnum)
    values('마동석',42,'010-5678-4321');
insert into phonebook (name,age,pnum)
    values('이지은',30,'010-1111-1111');

 

이클립스에서 불러올 수 있게 commit

commit;

 

테이블에 채워진 값 

 

각 컬럼(객체) 에 대한 제약조건 

 

집계함수
여러 레코드의 값에 대한 합계, 평균, 개수, 최소, 최대 등을 연산하기 위한 내장함수 

 


select max(idx) from [테이블이름];
max ( )  :  지정한 컬럼중에서 최대값을 찾는다. 
min ( )   :  지정한 컬럼중에서 최소값을 찾는다. 
count ( ) : 지정한 컬럼의 총 개수를 찾는다 ( 레코드의 개수를 찾기 때문에 보통 *을 지정한다)
sum ( ) : 지정한 컬럼의 합계를 계산한다.
avg ( )  : 지정한 컬럼의 평균을 계산한다. 

 

 

product테이블을 이용해서 집계함수를 다뤄보자 

select * from product;
select max(price) as maxValue  from product;

select min(price) as minValue from product;

select sum(price) as total from product;

select avg(price) as average from product;

select count(*) as cnt  from product;

 

 

 

 

 

 

select max(price), expDate from product;

위 코드는 expDate를 넣는 시점에서 최대가격이 달라질 수 도 있다. 

ex) 유통기한이 24년 6월1일의 데이터가 여러개 있다면 24년 6월 1일의  상품에 대한 price 최대값을 가지고 올지 

     아니면 전체 유통기한에대한 price의 최대값을 가지고 올지  출력결과가 모호해진다. 

 

 

집계함수를 쓸때 특정 컬럼을 지정하면 특정컬럼을 기준으로 그룹을 나누어서 지정할 수 있다.

집계함수는 그룹으로 나누어서 각각의 데이터를 도출할 수 있다. 그러기 위해서는 group by를 추가로 명시해줘야한다. 

select expDate, max(price) from product
    group by expDate;

https://school.programmers.co.kr/learn/courses/30/lessons/131112#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

강원도에 위치한 생산공장 목록 출력하기

 

 

 

 

 

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
from FOOD_FACTORY where ADDRESS like '강원도%' order by FACTORY_ID

<코드 설명>

컬럼 FACTORY_ID , FACTORY_NAME, ADDRESS 컬럼을 출력 

FOOD_FACTORY 테이블로 부터  컬럼 ADDRESS가 '강원도' 라는 이름을 포함하면 오름차순으로 출력 

 

<결과>

 

 

 

 

728x90
반응형