오늘은 예비군으로 인해서 수업을 듣지 못했다,
우선 내일 수업에서 질문을 찾기위해서 수업진도 내용을
보고 따라 작성해 보았다.,
create table enrol(
sno varchar2(3) ,
cno varchar2(5) ,
grade varchar2(3),
midterm int,
final int ,
constraint enrol_sno_fk foreign key(sno) references student(sno),
constraint enrol_cno_fk foreign key(cno) references course(cno)
);
트리거란
데이터베이스가 미리 정해 놓은 조건들을 만족하거나
특정 이벤트가 발생하면 자동적으로 수행되는 동작(PL/SQL 블록)
개발자가 호출하여 사용할 수 없다. (오라클에서 자동으로 실행)
가장 많이 사용되는 트리거의 유형은
insert, update, delete의 결과로 실행되는 DML트리거
기본 형식으로는
테이블 작성
Create table deleteStudent( -- 테이블명
sno varchar2(3), -- 칼럼명 데이터형
sname nvarchar2(10),
year varchar2(10),
dept nvarchar2(10) ,
deleteDate date
)
Create (or replace)TRIGGER trg_deleteStudent
-- 트리거명, 괄호는 생략가능
after delete
on student
for each row
begin
insert into deleteStudent
(sno, sname, year, dept, deleteDate )
values
(:old.sno, :old.sname, :old.year, :old.dept, sysdate());
end;
delete from student where sno='100';
student 테이블의 sno칼럼에서 100 값을 가지고 있는 레코드를 삭제.
삭제 여부 확인
select * from deleteStudent;
--update 트리거
Create table updateStudent(
sno varchar2(3) ,
sname nvarchar2(10),
year varchar2(10),
dept nvarchar2(10) ,
updateDate date
)
Create TRIGGER trg_updateStudent
after update
on student
for each row
begin
insert into updateStudent
(sno, sname, year, dept, updateDate )
values
(:old.sno, :old.sname, :old.year, :old.dept, sysdate());
end;
update student set dept='컴퓨터' where dept='전산과';
select * from updateStudent;
시퀀스(Sequence)
: 자동 순번을 반환하는 데이터베이스 객체
-- 방법1
insert into student(sno,sname,year,dept)
values((select max(sno)+ 1 from student ) ,'영심이2','2','산공');
--방법2
Create sequence idx_student
start with 101 -- 초기값
increment by 1; -- 증가 크기
drop sequence idx_student;
-- 방법1
Create table user0(
id nvarchar2(5) ,
name nvarchar2(10)
);
user0_id에 P.K 부여
alter table user0
add constraint user0_id primary key(id);
테이블을 생성하며 P.K 부여
-- 방법2
Create table user1(
id nvarchar2(5) not null primary key,
name nvarchar2(10)
);
-- 방법3 .
Create table user2(
id nvarchar2(5) not null,
name nvarchar2(10),
primary key(id)
);
-- 방법4 .
Create table user3(
id nvarchar2(5) not null,
name nvarchar2(10),
constraint pk_id primary key(id)
);
제약조건 확인
select * from ALL_constraints
where table_name='USER3';
제약조건 삭제
alter table user3
drop constraint pk_id;
제약조건 수정
insert into user2(id, name)
values('AAA','순심이');
Create table fk_user00(
id nvarchar2(5) ,
age number(3),
FOREIGN key(id) REFERENCES user00(id)
);
--부모테이블 user00 id 칼럼을 참조하여 F.K 부여
Create table fk_user01(
id nvarchar2(5) REFERENCES user00(id) ,
age number(3)
);
Create table fk_user02(
id nvarchar2(5) ,
age number(3),
constraint fk_user02_id FOREIGN key(id) REFERENCES user00(id)
);
Create table fk_user03(
id nvarchar2(5) ,
age number(3)
);
alter table fk_user03
add constraint fk_user03_id
FOREIGN key(id) REFERENCES user00(id);
insert into user00(id, name)
values('a001','영심이');
insert into fk_user00(id, age) values('a001',13); -- 가능
insert into fk_user00(id, age) values('a002',13);
-- 오류
insert into fk_user00(id, age)
values('',13); -- null 가능
유니크란
고유값을 의미
즉, 유일한 값만 들어가도록 하고 싶을 때 사용하는 제약조건
Create table uk_user1 (
id nchar(10) UNIQUE ,
name varchar(20)
);
insert into uk_user1(id, name) values('100','영심이');
insert into uk_user1(id, name) values('100','둘리'); -- 에러
insert into uk_user1(id, name)
values('','둘리'); -- 가능
insert into uk_user1(id, name)
values('','둘리'); -- 가능
select * from uk_user1;
Create table uk_user2 (
id nchar(10) not null UNIQUE,
name varchar(20)
);
insert into uk_user2(id, name) values('100','영심이');
insert into uk_user2(id, name) values('100','둘리'); -- 에러
insert into uk_user2(id, name)
values('','둘리'); -- 에러
select * from uk_user2;
DEFAULT는 아무 값도 입력하지 않아도 NULL 값이 아닌,
기본 값으로 설정한 값이 자동으로 입력되도록 하는 제약조건
Create table default_user1 (
id nchar(10) ,
name varchar(20)
);
insert into default_user1(id, name) values('100','영심이');
insert into default_user1(id, name) values('','둘리'); -- null 유지
alter table default_user1
modify id default 'A001';
select * from default_user1;
insert into default_user1(id,name) values('','kkk1'); -- null 추가
insert into default_user1(name) values('kkk1'); -- A001
체크(CHECK)
입력할 수 있는 값의 범위를 설정해 주는 제약조건
특징
1.입력 값이 조건에 맞지 않으면 오류가 발생한다.
2.입력 값의 범위를 지정할 수 있다.
Create table check_user1 (
id nchar(10) ,
name varchar(20) check
( name in ('영심이','하늘이','둘리'))
);
Create table check_user2 (
id nchar(10) ,
name varchar(20) ,
check ( name in ('영심이','하늘이','둘리'))
);
Create table check_user4 (
id nchar(10) ,
name varchar(20) ,
CHECK (id in ('A','B','C') and name in ('AAA','BBB'))
);
insert into check_user4(id, name)
values('A','AAA');
insert into check_user5(id, name)
values('A','CC');
Create table check_user6 (
id nchar(10) ,
name varchar(20)
);
alter table check_user6
add CONSTRAINT check_user6_id1 CHECK (id in ('A','B','C'));
alter table check_user6
add CONSTRAINT check_user6_name1 CHECK (name in ('AA','BB','CC'));
alter table check_user3
drop CONSTRAINT check_user3_id;
============================================================================
select * from enrol;
update enrol set MIDTERM = MIDTERM-1, FINAL=FINAL-1
where sno in (
select sno from student where dept='컴퓨터'
);
select avg(MIDTERM) , avg(FINAL) from enrol
where cno = (
select cno from course where cname='화일처리'
);
select avg(MIDTERM) , avg(FINAL) from enrol e join course c
on e.cno = c.cno
where cname='화일처리';
select sname , dept from student
where sno in (
select sno from enrol
group by sno
having avg(FINAL) >= 85
);
-- 다른표현
select sname , dept from student s join enrol e
on s.sno = e.sno
group by sname , dept
having avg(FINAL) >= 85;
select sname from student
where sno in (
select sno from enrol
group by sno
having avg(final) > (select avg(final) from enrol)
);
==========================================================
select sname, cno, midterm
from student s join enrol e
on s.sno = e.sno
where midterm >= 90 ;
select sname, cno, grade
from student s join enrol e
on s.sno = e.sno
where YEAR in( 3, 4) ;
-- 다른표현
select sname, cno, grade
from student s join enrol e
on s.sno = e.sno
where YEAR = 3 or YEAR = 4 ;
select sno, grade from enrol e join course c
on e.cno = c.cno
where cname='자료구조';
select dept, count(*) as "학생수"
from student
group by dept;