oracle 데이터베이스 제약 조건 (constraint)
테이블의 컬럼에 대하여 특정 조건을 부여하는 방식
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가 '강원도' 라는 이름을 포함하면 오름차순으로 출력
<결과>