Oracle

[Oracle] PK, FK

eunnys 2024. 2. 13. 14:52

*** PKFK의 관계를 가진 테이블을 생성하기

1) 생성은 부모테이블 → 자식테이블

2) 삭제와 수정은 자식테이블 → 부모테이블

 

 

** 부모테이블 생성하기

drop table members;



create table members

(

seqno number constraints member_seq_pk primary key,

user_id varchar2(10) constraints member_id_uq unique,

user_name varchar2(20) constraints member_name_nn not null,

birthday date constraints member_birthday_nn not null,

gender char(1) constraints member_gender_ck check(gender in('F', 'M'))

member_use char(1)

);



create sequence member_seq;

 

 

-- 데이터 추가하기

insert into members

values

(

member_seq.nextval,

'SON',

'손오공',

'00/01/23',

'M'

);





insert into members

values

(

member_seq.nextval,

'JEON',

'전우치',

'93/12/05',

'M'

);





insert into members

values

(

member_seq.nextval,

'KIM',

'김순희',

'99/01/03',

'F'

);





commit;

 

 

** 사용자가 입력한 제약조건명 확인

select * from user_constraints;

 

 

-- 부모테이블 확인

select * from members;

 

 

 

** 자식테이블 생성하기

--FK는 부모의 PK로 생성하는 것이 보통이나, unique도 가능하다.

 

drop table purchase;



create table purchase

(

seqid number constraints purchase_seq_pk primary key, -- 구매번호

item varchar2(50) constraints purchase_item_nn not null, -- 품명

price number(10) default 10000, -- 구매가격

pday date default sysdate, -- 구매일

quantity number(3) default 1, -- 수량

seqno number references members(seqno) on delete cascade -- 부모의 PK번호

);



create sequence purchase_seq;

 

 

-- 손오공이 '자바의 정석' 1권 구매

insert into purchase

(seqid, item, price, seqno)

values

(purchase_seq.nextval, '자바의 정석', 24000, 1);

 

 

-- 전우치가 '혼공파이썬' 2권 구매

insert into purchase

(seqid, item, price, quantity, seqno)

values

(purchase_seq.nextval, '혼공파이썬', 16000*2, 2, 2);

 

 

-- 김순희가 'V3' 1카피 구매

insert into purchase

(seqid, item, price, seqno)

values

(purchase_seq.nextval, 'V3 백신', 20000, 3);

 

 

-- 손오공이 '긱계식 청축 키보드' 1개 구매

insert into purchase

(seqid, item, price, seqno)

values

(purchase_seq.nextval, '기계식 청축 키보드', 320000, 1);

 

select * from purchase;



commit;

 

 

-- [문제] 구매번호, 구매인, 아이템명, 구매가격을 조회

select rownum, m.user_id, m.user_name, p.item, p.price

from members m join purchase p

using (seqno);

 

 

 

-- [문제] 다음과 같은 조건으로 3개의 테이블과 1개의 sequence 객체를 생성하는 쿼리문을 작성하시오.

 

-- 1) 테이블 : lunchbox (판매하는 도시락 정보)

drop table lunchbox;



create table lunchbox

(

lunchbox_id varchar2(10) constraints luncbox_id_pk primary key,

menu_title varchar2(50) constraints lunchbox_menu_nn not null,

price number(7) constraints lunchbox_price_nn not null

);

 

 

-- 2) 테이블 : customer (고객 정보 테이블)

drop table customer;



create table customer

(

cust_id varchar2(10) constraints customer_id_pk primary key,

cust_name varchar2(30) constraints customer_name_nn not null,

address varchar2(100) constraints customer_address_nn not null,

phone varchar2(20) constraints customer_phone_nn not null

);

 

 

-- 3) 테이블 : order (주문 정보 테이블)

drop table orders;



create table orders

(

order_id number constraints orders_id_pk primary key,

cust_id varchar2(10) references customer(cust_id),

lunchbox_id varchar2(10) references lunchbox(lunchbox_id),

order_count varchar2(20) default '1' not null,

order_date date default sysdate

);

 

 

--4) 시퀀스 : order_seq (주문 정보 테이블에서 사용할 일련번호를 위한 sequence 객체)

create sequence order_seq;

 

 

-- 5) lunchbox 테이블에 도시락 종류 5개 이상 필요한 만큼 입력하고 입력된 결과를 조회

insert into lunchbox values ('menu01', '숯불직화구이', 6500);

insert into lunchbox values ('menu02', '치킨제육', 4400);

insert into lunchbox values ('menu03', '돈까스도련님', 7000);

insert into lunchbox values ('menu04', '매화(치킨, 연어구이)', 10000);

insert into lunchbox values ('menu05', '순살 고등어 간장구이', 12000);

 

 

-- 6) 고객 정보 5명 이상 필요한 만큼 입력하고 입력된 결과를 조회

insert into customer values ('hong','홍길동','서울시 강남구 역삼동','010-1111-2222');

insert into customer values ('lim','임꺽정', '부산시 충장로1가','010-2222-1212');

insert into customer values ('son','전우치', '인천시 연수구','010-3333-3434');

insert into customer values ('park','박가가','광주시 무산대로 1234','010-1234-5656');

insert into customer values ('kim','김나나', '서울시 동작구 사당동','010-5678-8989');

 

 

-- 7) 고객이 도시락을 주문한 정보 10개 이상 필요한 만큼 order 테이블에 입력하고 입력된 결과를 조회

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'hong', 'menu01', 2);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'lim', 'menu02', 3);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'son', 'menu05', 1);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'kim', 'menu03', 1);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'hong', 'menu04', 5);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'hong', 'menu01', 1);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'son', 'menu02', 3);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'park', 'menu05', 1);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'kim', 'menu02', 1);

insert into orders (order_id, cust_id, lunchbox_id, order_count) values(order_seq.nextval, 'son', 'menu05', 1);

 

select * from lunchbox;

select * from customer;

select * from orders;

 

 

-- 8) “치킨이라는 단어가 포함된 도시락 종류를 조회하는 쿼리문을 작성하시오

select menu_title

from lunchbox

where menu_title like '%치킨%';

 

 

-- 9) 도시락 가격이 10,000원 이하인 도시락을 조회하는 쿼리문을 작성하시오

select menu_title, price

from lunchbox

where price < 10000;

 

 

-- 10) 고객이 자신이 주문한 도시락 내역을 아래와 같은 정보로 조회하는 쿼리문을 작성하시오.

select c.cust_name as 고객이름, 
       l.menu_title as 도시락이름, 
       l.price as 가격, 
       o.order_count as 주문수량, 
       o.order_count * l.price as 주문금액, 
       o.order_date as 주문날짜

from customer c join orders o

on c.cust_id = o.cust_id

join lunchbox l

on l.lunchbox_id = o.lunchbox_id;

 

 

'Oracle' 카테고리의 다른 글

[Oracle] 시퀀스  (0) 2024.02.13
[Oracle] DDL  (1) 2024.02.13
[Oracle] Join  (0) 2024.02.13
[Oracle] 서브쿼리  (0) 2024.02.13
[Oracle] 오라클 함수  (0) 2024.02.13