오늘은 이전에 배웠던 내용 JOIN과
select 구문을 이용한 insert, update, delete를
확인해보았다.
새로운 INDEX 구문을 배웠으나 아직은 많이 서툴고 어려운것 같다.
다시한번 확인해보자.
연습문제
create table school(
idx varchar2(3),
s_name nvarchar2(10),
age varchar2(2),
tel nvarchar2(13),
constraint school_idx_pk primary key(idx)
);
다른 표현 2가지
create table school2(
idx varchar2(5) primary key,
s_name nvarchar2(10),
--numeric, number = 숫자 실수형을 알려주는 명령어
age numeric(3),
tel char(13)
);
create table school3(
idx varchar2(5),
s_name nvarchar2(10),
--numeric, number = 숫자 실수형을 알려주는 명령어
age numeric(3), -
tel char(13),
primary key(idx)
);
insert into school(idx,s_name,age,tel)
values('101', '둘리', '12', '010-5037-6133');
insert into school(idx,s_name,age,tel)
values('102', '하니', '15', '011-1234-1212');
insert into school(idx,s_name,age,tel)
ues('104', '영심이', '17', '017-5555-0341');
insert into school(idx,s_name,age,tel)
values('105', 'young won', '20', '010-5555-6363');
insert into school(idx,s_name,age,tel)
values('107', '대한민국', '22', '019-3245-1234');
insert into school(idx,s_name,age,tel)
values('109', '아름이', '25', '070-1212-5555');
select * from school
order by s_name desc;
select * from school
where idx = '101' or idx = '104' or idx = '107';
다른표현
select * from school
where idx in ('101', '104', '107');
update school set s_name='영원'
where idx='105';
update school set age='15'
where idx='104';
update school set tel=' '
--공백인지 NULL 값인지 문의 필요
where s_name='아름이';
update school set age='19';
delete from school
where idx='102';
delete from school;
--레코드 삭제는 Delete
drop table school;
연습문제(2)
select sname,year from student
where year >= 3;
select sname,year from student
where year between '2' and '3';
다른표현
select sname,year from student
where year='2' or year='3';
다른표현
select sname,year from student
where year in ('2', '3');
-- 연산이 포함된 칼럼명은 별칭을 선언하는게 좋다
select sname, year, year +1 as 학년2
from student
where sno='200';
select sname, year from student
where sname like '%찬%' or sname like '%둘%';
-- 두번째 자리에 글자 찾을땐
-- '%_글자%' 같이 언더바=_ 를 활용
select * from student
order by sname desc;
연습문제(3)
-- 문제 풀기전 사전 확인
select * from student;
select * from enrol;
select * from course;
alter table student
rename column sno to ssno;
alter table enrol
rename column sno to esno;
select ssno, sname, midterm, final
from student s join enrol e
on ssno=esno;
select ssno, sname, grade
from student s join enrol e
on s.ssno = e.esno
order by sname desc;
select * from course c join enrol e
on c.cno = e.cno;
select * from enrol
where midterm between 81 and 90;
select midterm as "중간고사", midterm+3 as "중간고사추가"
from enrol;
select * from enrol
where esno='400';
select ssno, sname , year, cname, grade from
student s join enrol e
on s.ssno=e.esno join course c
on e.cno=c.cno;
select distinct ssno, sname from
student s join enrol e
on s.ssno=e.esno join course c
on e.cno=c.cno;
다른표현
select ssno, sname from
student s join enrol e
on s.ssno=e.esno join course c
on e.cno=c.cno
group by ssno, sname;
VIEW
-- VIEW 만들기
Create View V_BIGEMPLOYEES
as
select * from BIGEMPLOYEES
where EMP_NO <=11000
order by EMP_NO desc;
-- 만들어진 VIEW 테이블 확인하기
select count(*) "학생수 " from V_BIGEMPLOYEES;
-- VIEW 만들기
Create view v_SE_JOIN
as
select s.sno ssno , sname, year, dept,
e.sno esno, cno, grade, MIDTERM, final
from student s full join enrol e
on s.sno=e.sno;
-- 만들어진 VIEW 테이블 확인하기
select * from v_SE_JOIN;
-- 학생 테이블의 학번이 '700'인 학생의 학년을 '3'으로 수정하기
update student set year=3
where sno='700';
--2개 이상 join이 된 뷰테이블 v_SE_JOIN의
학번이 '700'인 학생의 학년은 '4'로 변경하여 출력
update v_SE_JOIN set year='4'
where ssno='700'; -- 수정 불가
--2개 이상 join이 된 뷰테이블 v_SE_JOIN의
학번이 '700'인 학생의 레코드를 삭제
delete from v_SE_JOIN
where ssno='700'; -- 삭제 불가
2개 이상의 조인테이블을 이용하여
만든 view 테이블은 수정, 삭제 할 수 없다.
-- JOIN이 된 VIEW 테이블을 사용하여 새로운 VIEW 테이블을 만들어라.
Create view v_v_SE_JOIN
as
SELECT ssno, sname, midterm , final
from v_SE_JOIN;
-- v_v_SE_JOIN 뷰테이블의 학생이름이 NULL값인 경우를 제외하여 출력
Create view V_v_v_SE_JOIN
as
select * from v_v_SE_JOIN
where sname is not null;
-- 만들어진 View 테이블 확인
select * from V_v_v_SE_JOIN;
-- 테이블 복사하기
Create table new_BIGEMPLOYEES
as
select * from BIGEMPLOYEES
where 1=2;
-- 새로운 테이블 만들고 복사하여 값 넣기
Create table new_BIGEMPLOYEES
as
select * from BIGEMPLOYEES
where EMP_NO <=11000
order by EMP_NO desc;
-- 기존 테이블에 레코드 추가하기
insert into new_BIGEMPLOYEES
select * from BIGEMPLOYEES
where EMP_NO <=12000
order by EMP_NO desc;
-- GROUP BY(동일한 레코드 중복제거하여 그룹화)
select ssno, sname, sum(MIDTERM) , sum(FINAL)
from V_v_v_SE_JOIN
where MIDTERM is not null and FINAL is not null
group by ssno, sname;
-- having을 이용한 그룹화
select ssno, sname, sum(MIDTERM) , sum(FINAL)
from V_v_v_SE_JOIN
group by ssno, sname
having sum(MIDTERM) is not null and
sum(FINAL) is not null
order by sum(MIDTERM) desc , sum(FINAL) desc;
-- 테이블 컬럼 추가 , 수정, 삭제
-- 추가
alter table student
add ( age number(3,1) DEFAULT '11' );
-- 수정
desc student;
--내림차순 정렬
alter table student
MODIFY (sno varchar2(4));
-- 삭제
alter table student
drop column age;
ALTER
-- 칼럼 이름 변경하기
alter table student
rename COLUMN sname to name2 ;
alter table student
rename COLUMN name2 to sname ;
스토어드 프로시저
단점 : 하나의 레코드만 생성가능
-- INSERT 적용하기
CREATE PROCEDURE MYPROC_INSERT1
(
SNO varchar2 ,
SNAME nvarchar2 ,
DEPT nvarchar2,
YEAR char
)
IS
BEGIN
INSERT INTO STUDENT(SNO, SNAME,DEPT,YEAR)
VALUES(SNO, SNAME ,DEPT ,YEAR );
END;
-- 프로시저 호출 삽입
EXECUTE MYPROC_INSERT1('705','지효','전산','4');
EXECUTE MYPROC_INSERT1('706','지솔','물리','3');
EXECUTE MYPROC_INSERT1('707','지윤','화학','2');
EXECUTE MYPROC_INSERT1('708','지민','전산','1');
-- 추가 확인
select * from STUDENT;
-- DELETE 사용하기
CREATE or replace PROCEDURE ps_DelStudent
(
mID char
)
IS
BEGIN
delete from student where sno=mID;
END;
select * from student;
-- 프로시저 호출 삭제
execute ps_DelStudent('705');
select * from student;
-- UPDATE 사용하기
CREATE or replace PROCEDURE ps_UpdateStudent
(
mSno char,
mSname nchar,
mYear char
)
IS
BEGIN
update student set sname=mSname , year=mYear
where sno=mSno ;
END;
select * from student;
-- 프로시저 호출 수정
execute ps_UpdateStudent('706','둘리','7' );
select * from student where sno='706';
-- DBMS_OUTPUT
-- DBMS로 출력 가능하게 on 설정
set serveroutput on;
-- DBMS로 출력
create or replace PROCEDURE select_student1
as
var1 int;
var2 int;
begin
select count(*) into var1 from student;
select count(*) as "컴퓨터학과 학생" into var2
from student where dept='컴퓨터';
DBMS_OUTPUT.PUT_LINE(var1 || ',' || var2);
-- 문자열 더하기는 || 사용 가능 or와는 다른것 + 표시
end;
execute select_student1;
-- DBMS로 출력
create or replace PROCEDURE select_student2
as
var1 VARCHAR2(4);
var2 NVARCHAR2(10);
var3 VARCHAR2(10);
var4 NVARCHAR2(10);
begin
select ssno, sname, year, dept
into var1, var2, var3, var4
from student where ssno='100';
DBMS_OUTPUT.PUT_LINE
(var1 || ',' || var2 || ',' || var3 || ',' || var4);
-- 문자열 더하기는 || 연산기호 사용 가능
end;
execute select_student2;
오늘은 스토어드 프로시저의 형식에 대해서 중점으로 배웠다.
스토어드 프로시저는 Oracle에서 제공되는 프로그래밍 기능으로 쿼리문의 집합으로 어떠한 동작을 일괄 처리하기 위한 용도로 사용하는 기능이다.
새로배운 내용이니 좀더 확실하게 형식과 동작을 위한 세부 내용을 인지하도록 해야겠다.