Oracle 이론 총 정리 Oracle 2011. 11. 21. 00:33

정리라기 모호한... ㅎㅎ  

자료를 찾기 좋게만 만들어 놓은 페이지(첨부파일: 하단에 파일 링크)입니다.

암기도 중요하지만 그 많은 것들 암기해서 응용하기엔 너무도 짧은시간!

 

잘 찾아서 응용하는 것도 괜찮은 방법이 아닐까 싶어

잘 찾기만이라도 할 수 있도록 집약하여 한 페이지에 넣고

 

목차내에 있는 내용만을 위한 검색기능목차 클릭시 해당 내용으로 이동하고

 

다시 목차로 올라오기 위한 top버튼을 구현하였고..

이런식으로 자료를

찾아서 쓰기 좋게(??) (정말 대충)만들었습니다~

 

검색은 Ctrl+F로 해도 무방하긴 하지만요;;

목차만을 위한 검색으로 검색박스 만들었구요. 사용하려면 브라우저 상단에서

스크립트를 허용해주셔야 정상 작동 합니다.

 

단지 잘 찾기 위한 기능만 넣었을 뿐인데 시간이 엄청 걸리네요....-. -) 그냥

제가 찾기 좋으려고 만들어야겠다! 싶어서 해보긴 했는데 완전 초노가다 ㅋㅋㅋ 

(몇일 걸린건지.....-_-;;)

그만큼 암기할 내용이 많은 과목인가봅니다;;

 

저 편하자고 만든 파일이라 필요하신 분은 수정하여 사용하셔도 무방합니다만 덧글이라도...;

(워낙에 방대해서;; 수정이 가능하실련지 모르겠지만....-ㅅ-a

뭔 텍스트만 담겨있는 파일이 이리 용량이 많은지..)

 

아..이제 자바 복습/예습 해야지요 (이미 주말을 다보내버렸지만...-_-;;ㅋㅋㅋ) 

 

이번주도 홧팅~!






사용 방법(?) 아래 첨부 (gif 이미지가 깨져 보일 수 있으니 클릭하여 원본으로 볼 것: 봐야만 알수 있다면..;)



 


'Oracle' 카테고리의 다른 글

ROW_NUMBER() 그룹에서의 정렬순서  (0) 2012.05.22
11g R2 - LISTAGG 함수  (0) 2012.05.21
Oracle 이론 총 정리  (2) 2011.11.21
Oracle 실습문제 (8)  (0) 2011.11.17
Oracle_03  (0) 2011.11.09
Oracle_02  (0) 2011.11.09
Oracle 실습문제 (8) Oracle 2011. 11. 17. 00:43

-- [1] 테이블 작성
-- 1. sung 테이블 작성
create table sung(
 hak number(1) not null
  , ban number(2) not null
  , beonho number(2) not null
  , name varchar2(20) not null
  , com number(3) not null
  , excel number(3) not null
  , word number(3) not null
  , constraint sung_id_PK primary key(hak, ban, beonho)
  , constraint sung_id_CK check ((hak between 1 and 3) and (ban between 1 and 10) and (beonho between 1 and 50))
);

-- 2. sung_tot 테이블 작성
create table sung_tot(
  hak number(1) not null
  , ban number(2) not null
  , com number
  , excel number
  , word number
  , constraint sung_tot_id_PK primary key(hak, ban)
);

/*
[2] 뷰 작성
sung 테이블을 이용하여 다음의 필드를 갖는 viewSung라는 이름으로 view를 작성한다.

?출력할 필드
  hak, ban, beonho, name, com, excel, word, tot, ave, banrank, hakrank
?처리 조건
  tot = com+excel+word
  ave = (com+excel+word) / 3
  banrank : 반별 석차
  hakrank : 학년별 석차
*/
select * from sung_tot;
select * from sung;
-----------------------데이터 입력--------------------------------
insert into sung(hak, ban, beonho, name, com, excel, word) values(1, 1, 1, '홍길동', 100, 90, 80);
insert into sung(hak, ban, beonho, name, com, excel, word) values(1, 1, 2, '김길동', '90', '80', '70');
insert into sung(hak, ban, beonho, name, com, excel, word) values(1, 1, 3, '이길동', '80', '70', '60');
insert into sung(hak, ban, beonho, name, com, excel, word) values(1, 1, 4, '권길동', '70', '60', '50');
insert into sung(hak, ban, beonho, name, com, excel, word) values(1, 2, 5, '박길동', '60', '50', '40');
insert into sung(hak, ban, beonho, name, com, excel, word) values(1, 2, 6, '최길동', '50', '40', '30');
insert into sung(hak, ban, beonho, name, com, excel, word) values(1, 2, 7, '국길동', '40', '30', '20');
commit;
------------------------------------------------------------------
create or replace view viewSung
as
select hak, ban, beonho, name, word, (com+excel+word) as tot, trunc((com+excel+word)/3, 1) as ave,
rank() over(partition by ban order by com+excel+word desc) banrank,
rank() over(partition by hak order by com+excel+word desc) hakrank
from sung;

select * from viewsung;
/*
[3] 트리거 작성
sung 테이블에 자료가 추가되거나 변경되는 경우 각 학년, 반별 각 과목의
합을 sung_tot 테이블에 계산되도록 트리거를 작성한다.
(추가, 수정, 삭제 트리거 작성)*/

create or replace trigger insert_sung_tot
after insert on sung
for each row
declare
vcount number;
begin
select count(*) into vcount from sung_tot where hak=:new.hak and ban=:new.ban;
if vcount=0 then
insert into sung_tot(hak, ban, com, excel, word) values(:new.hak, :new.ban, :new.com, :new.excel, :new.word); 
else
update sung_tot set com=com+:new.com, excel=excel+:new.excel, word=word+:new.word where hak=:new.hak and ban=:new.ban; 
end if;
end;

--프로시져 insert_sung_tot 테스트
insert into sung (hak, ban, beonho, name, com, excel, word) values (1,1,1,'a1',1,2,3);
insert into sung (hak, ban, beonho, name, com, excel, word) values (1,1,2,'a2',4,5,5);
insert into sung (hak, ban, beonho, name, com, excel, word) values (1,1,3,'a3',15,5,4);
insert into sung (hak, ban, beonho, name, com, excel, word) values (1,1,4,'a4',1,1,1);
commit;

select * from sung;
select * from sung_tot;
select * from viewSung;
-- 수정 트리거
create or replace trigger update_sung_tot
after update on sung
for each row
begin
update sung_tot set com=com+:new.com-:old.com, excel=excel+:new.excel-:old.excel, word=word+:new.word-:old.word 
where hak=:old.hak and ban=:old.ban;
end;

--프로시져 update_sung_tot 테스트
update sung set com=2, excel=2, word=2 where hak=1 and ban=1 and beonho=4;
commit;
select * from sung;
select * from sung_tot;
-- 삭제 트리거
create or replace trigger delete_sung_tot
after delete on sung
for each row
begin
update sung_tot set com=com-:old.com, excel=excel-:old.excel, word=word-:old.word
where hak=:new.hak and ban=:new.ban;
end; 

--프로시져 delete_sung_tot 테스트
delete from sung where hak=1 and ban=1 and beonho=1;
commit;
select * from sung_tot;

--[4] 프로시저 작성
/*
1. viewSung 를 이용하여 다음과 같은 결과를 출력하는 프로시저를 작성한다.
 ?출력 필드
   학년 반 번호 이름 총점 평균 학급석차 학년석차 판정
   (단, 학년과 반은 인수를 넘겨받아 해당 학년/반만 출력되도록 한다.)
?판정
  세 과목 모두 40점 이상 이고, 평균 60점 이상 : 합격
  세 과목 중 한과목이라도 40점 미만이고 ,평균 60점 이상이면 : 과락
  그렇지 않으면 불합격으로 처리 한다.
*/
create or replace procedure pro_sung
(
  phak viewSung.hak%type
  ,pban viewSung.ban%type
)
is
vpan varchar2(10);

cursor sung_list is select * from viewSung where hak=phak and ban=pban; 
begin
for rec in sung_list loop
if rec.ave>=60 and (rec.com>=40 and rec.excel>=40 and rec.word>=40) then vpan:='합격';
elsif rec.ave>=60 and (rec.com<40 or rec.excel<40 or rec.word<40) then vpan:='과락';
else vpan:='불합격';
end if;
dbms_output.put_line(rec.hak||' '||rec.ban||' '||rec.beonho||' '||rec.name||' '||rec.tot||' '||rec.ave||' '||rec.hakrank||' '||rec.banrank||' '||vpan);  
end loop;
end;

-- 프로시져 pro_sung 테스트
exec pro_sung(1,1);

-- 2. sung 테이블에 자료를 추가하는 프로시저 작성

create or replace procedure insert_sung
(
  phak sung.hak%type
  ,pban sung.ban%type
  ,pbeonho sung.beonho%type
  ,pname sung.name%type
  ,pcom sung.com%type
  ,pexcel sung.excel%type
  ,pword sung.word%type
)
is
begin
insert into sung(hak,ban,beonho,name,com,excel,word) values(phak,pban,pbeonho,pname,pcom,pexcel,pword);
commit;
end;  
 

--프로시져 insert_sung 테스트
exec insert_sung(1,2,5,'문성수',100,100,100);
select * from sung;
-- 3. sung 테이블에 자료를 수정하는 프로시저 작성

create or replace procedure update_sung
(
  phak sung.hak%type
  ,pban sung.ban%type
  ,pbeonho sung.beonho%type
  ,pname sung.name%type
  ,pcom sung.com%type
  ,pexcel sung.excel%type
  ,pword sung.word%type
)
is
begin 
update sung set name=pname,com=pcom,excel=pexcel,word=pword where hak=phak and ban=pban and beonho=pbeonho;
commit;
end;   

--프로시져 update_sung 테스트
exec update_sung (1,2,5,'허현무',95,95,95);
select * from sung;
-- 4. 학년, 반, 번호를 인수로 넘겨받아 sung 테이블에 자료를 삭제하는 프로시저 작성

create or replace procedure delete_sung
(
   phak sung.hak%type
  ,pban sung.ban%type
  ,pbeonho sung.beonho%type
)
is
begin
    delete from sung where hak=phak and ban=pban and beonho=pbeonho;
    commit;
end;

--프로시져 delete_sung 테스트
exec delete_sung(1,2,5);
select * from sung;
-- [5] insa 테이블
-- 1. 서울 사람 중 근무 개월 수가 60개월 이상인 사람만 출력(이름, 입사일)
select name 이름, ibsadate 입사일 from insa
where months_between(sysdate, ibsadate)>='60';

-- 2. 기본급 10 만원 당 *를 하나씩 출력 한다.(이름, 기본급, 그래프)
select name 이름, basicpay 기본급, lpad('*', basicpay/100000, '*') 그래프
from insa;

-- 3. 부서별 인원수를 출력 한다.
select buseo 부서, count(*) 인원수 from insa group by buseo;

-- 4. 부서별 인원수가 가장 많은 부서명 및 인원수를 출력 한다.
select * from (select buseo 부서명, count(*) 인원수 from insa group by buseo order by 인원수 desc)
where rownum = 1;

-- 5. 부서별 여자 인원수를 출력 한다.
select buseo 부서, count(*) as "여자 인원수" from insa where substr(ssn, 8, 1) in (2, 4)
group by buseo;

-- 6. 부서별 여자 인원수가 가장 많은 부서명 및 여자 인원수를 출력 한다.
select * from (select buseo 부서명, count(*) "여자 인원수" from insa
where substr(ssn, 8, 1) in (2, 4)
group by buseo order by "여자 인원수" desc) where rownum=1;

-- 7. 평균 급여(기본급)를 출력 한다.
select trunc(avg(basicpay)) 평균급여 from insa;

-- 8. 평균 급여(기본급)보다 적은 사람을 출력 한다.(이름, 기본급)
select name 이름, basicpay 기본급 from insa
where basicpay < (select avg(basicpay) from insa) order by 기본급;

-- 9. 평균 급여(기본급)보다 크거나 같은 사람의 인원수를 출력 한다.
select count(*) "평균급여 이상 인원수" from insa
where basicpay >= (select avg(basicpay) from insa);

-- 10. 80~89 년생의 인원수를 구하여라.
select count(*) "80~89년생 인원수" from insa
where substr(ssn, 1, 1)=8;

-- [6] JOIN 실습
-- 테이블 작성 book
create table book (
  b_id varchar2(10) not null
  , title varchar2(100) not null -- 책명
  , c_name varchar2(100) not null -- 출판사명
  , constraint book_id_PK primary key(b_id)
);

-- 테이블 작성 danga
create table danga (
  b_id varchar2(10) not null
  , price number(7) not null -- 단가
  , constraint danga_id_PK primary key(b_id)
  , constraint danga_id_FK foreign key(b_id)
  references book(b_id)
);

-- 테이블 작성 gogaek
create table gogaek (
  g_id number(5) -- 서점 코드
  , g_name varchar2(20) not null -- 서점 명
  , g_tel varchar2(20) -- 전화번호
  , constraint gogaek_id_PK primary key(g_id)
);

-- 테이블 작성 panmai
create table panmai (
  id number(5) not null
  , g_id number(5) not null
  , b_id varchar2(10) not null
  , p_date date -- 판매일자
  , p_su number(5) not null -- 판매수량
  , constraint panmai_id_PK primary key(id)
  , constraint panmai_id_FK1 foreign key(g_id)
  references gogaek(g_id)
  , constraint panmai_id_FK2 foreign key(b_id)
  references book(b_id)
);

/*
2. book 테이블, panmai 테이블, danga 테이블, gogaek 테이블을 b_id 필드와 g_id 필드를 기준으로 조인하여
다음을 출력 한다.(EQUI 조인)
  -- 책이름(title) 고객명(g_name) 수량(p_su) 단가(price) 금액(p_su*price)
*/
book : b_id
danga : b_id
gogaek : g_id
panmai : g_id, b_id

select b.title 책이름, g.g_name 고객명, p.p_su 수량, d.price 단가, p.p_su*d.price 금액
from panmai p join book b on p.b_id=b.b_id
join danga d on p.b_id=d.b_id
join  gogaek g on p.g_id=g.g_id;

/*
3. panmai 테이블, danga 테이블, gogaek 테이블을 b_id 필드와 g_id 필드를 기준으로 조인하여 고객별 판매 금액을
출력 한다.(EQUI 조인)
  -- g_name, '수량 * 단가'의 합
*/
select g.g_name 고객명, sum(p.p_su*d.price) 판매금액
from panmai p join danga d on p.b_id=d.b_id
join gogaek g on p.g_id=g.g_id
group by g.g_name;

/*
4. book 테이블, panmai 테이블, b_id 필드를 기준으로 조인하여 다음의 필드 출력 한다. 단, book 테이블의 모든 행은
출력 되도록 한다.(OUTER 조인)
  -- b_id, title, p_su 필드 출력
*/
select b.b_id, b.title, p_su
from book b left outer join panmai p on b.b_id=p.b_id;

/*
5. book 테이블, panmai 테이블, gogaek 테이블을 b_id 필드와 g_id 필드를 기준으로 조인하여 다음의 필드 출력 한다.
단, book 테이블의 모든 행은 출력 되도록 한다.(OUTER 조인)
  -- b_id, title, g_name, p_su 필드 출력
*/
select b.b_id, b.title, g.g_name, p.p_su
from panmai p join book b on p.b_id=b.b_id
join gogaek g on p.g_id=g.g_id;

/*
6. 다음의 처리 조건에 따라 2000년도 판매 현황을 출력 한다.
  -출력 형식
    책명(title) 서점명(g_name) 금액
  -처리 조건
   1) 금액 = "수량 * 단가" 의 합계
     합계는 title, g_name에 의해 그룹화 한다. 즉, title별 서점의 판매 금액에 대한 합계이다.
   2) panmai.p_date 가 2000년인 자료의 판매 현황만 출력 한다.
*/
select b.title 책명, g.g_name 서점명, sum(p.p_su*d.price) 금액
from panmai p join book b on p.b_id=b.b_id
join gogaek g on p.g_id=g.g_id
join danga d on p.b_id=d.b_id
where to_char(p_date, 'yyyy')='2000'
group by b.title, g.g_name;


'Oracle' 카테고리의 다른 글

11g R2 - LISTAGG 함수  (0) 2012.05.21
Oracle 이론 총 정리  (2) 2011.11.21
Oracle 실습문제 (8)  (0) 2011.11.17
Oracle_03  (0) 2011.11.09
Oracle_02  (0) 2011.11.09
Oracle_01  (0) 2011.11.07
윈도우7 에서는 설치하는데 있어 이것저것 수정해주고
설치에도 일반 설치가 아닌 고급 설치로 해야 하는 짜증(?)나는 부분들이 있더군...
설치에서 아에 막히길래 왜 안되나 하고 구글링 해보니 좋은 정보가... ㅎㅎ

일단 설명대로 파일 수정하고.. 10g버젼은 저 url에 포스팅과 살짝 경로가 다르지만 거의 같다.

고급설치로 설치하되 귀찮은 짓을 피하려면 조금 나름대로 고민을 해야 될 옵션들이 조금 있는 듯 하나

경로만 원하는 경로로 설치 경로 잡아주고 암호는 전체가 같도록 하는게 편하다면 그렇게 하고~

뭐.. 중간에 스샷을 안찍고 그냥 넘겨버려서 좀 아쉽긴 하군 @_@;

기본 설치시 나오는 화면의 옵션을 잘 보고 고급 옵션의 체크 항목을 결정하면 될 듯 함

설치법 주소는 하단에...



http://guisin.net/69

'Scrap' 카테고리의 다른 글

컴퓨터 성능 테스트!?  (1) 2011.12.09
windows 7 에 오라클 설치하기  (0) 2011.11.09
Oracle_02 Oracle 2011. 11. 9. 10:21
-- 1. 서울 사람중에서 김씨와 이씨만 출력
SELECT name, city
FROM insa WHERE city='서울' AND (substr(name, 1,1)='김' OR substr(name, 1,1)='이');

-- 2. 모든 테이블의 목록 출력
SELECT * FROM insa;

-- 3. INSA 테이블의 스키마(구조) 출력
DESC insa;

-- 4. 총급여 오름차순으로 출력하되 총급여가 같으면 기본급 오름차순으로 출력(이름, 기본급, 수당, 총급여(기본급+수당))
SELECT name 이름, basicpay 기본급, sudang 수당, basicpay+sudang 총급여
FROM insa ORDER BY basicpay+sudang ASC, basicpay ASC;

-- 5. 남자중에서 name, city, buseo, jikwi 필드만 출력하되 필드명은 한글로 출력
SELECT name 이름, city 출신도, buseo 부서, jikwi 직위
FROM insa WHERE substr(ssn, 8,1)=1;

-- 6. name 필드와 변환 함수를 이용하여 입사 일을 yyyy- mm-dd dw요일 형식으로 출력 한다.(이름, 부서명, 입사일)
SELECT name 이름, buseo 부서, to_char(ibsadate, 'yyyy-mm-dd day') 입사일
FROM insa;

-- 7. 직위를 중복을 배제하여 출력
SELECT DISTINCT jikwi AS "직위"
FROM insa;

-- 8. LIKE를 이용하여 이씨가 아닌 자료만 출력
SELECT name
FROM insa WHERE name NOT LIKE '이%';

-- 9. 전화번호가 NULL인 경우 '전화없음'으로 치환하여 출력하며 
-- 세금은 총급여*3% 로 하되 일의자리에서 반올림한다.
--  (세금과 총급여는 세자리마다 컴마 삽입)
SELECT name, nvl(tel, '전화없음') 전화번호, to_char((basicpay+sudang), '99,999,999') 총급여,
to_char(trunc((basicpay+sudang)*0.03), '99,999,999') 세금
FROM insa;

-- 10. 서울 사람 중 근무 개월 수가 60개월 이상인 사람만 출력(이름, 입사일)  -- MONTHS_BETWEEN 함수 이용
SELECT name 이름, ibsadate "입사일"
FROM insa WHERE months_between(sysdate, ibsadate)>='60';

-- 11. 근무년수가 10년 이상인 사람만 출력(이름, 입사일, 근무년수)
SELECT name 이름, ibsadate 입사일, trunc(months_between(sysdate, ibsadate)/12) 근무년수
FROM insa;

-- 12. 오늘날짜, 이번주 일요일, 이번주 토요일날짜를 출력
SELECT sysdate,
case
  when to_char(sysdate, 'day') = '일요일' then
    sysdate
  else
    next_day(sysdate, 1)-7
end 한주시작일,
case
  when to_char(sysdate, 'day') = '토요일' then
    sysdate
  else
    next_day(sysdate, '토요일')
  end 한주마지막일
FROM dual;

-- 13. 기본급 100 만원 당 *를 하나씩 출력 한다.(이름, 기본급, 그래프) 단, 기본급이 100만원 미만인 경우 *를 출력하지 않고 아무것도 출력하지 않는다.
SELECT name 이름, basicpay 기본급, nvl(lpad('*', basicpay/1000000, '*'), ' ') 그래프
FROM insa;

-- 14. 부서별 출신도별 인원수를 출력 한다.
SELECT buseo 부서, count(buseo) "부서별 인원수", city 출신도, count(city) "출신도별 인원수"
FROM insa GROUP BY buseo, city;

-- 15. 부서별 인원수가 가장 많은 부서명 및 인원수를 출력 한다.
SELECT buseo, count(*), rank() over(ORDER BY count(*) DESC) FROM insa GROUP BY buseo;

SELECT buseo, 인원수 FROM (SELECT buseo, count(*) 인원수, rank()
over(ORDER BY count(*) DESC) r FROM insa GROUP BY buseo) WHERE r=1;

-- 16. 부서별 여자 인원수를 출력 한다.
SELECT buseo, count(*) "여자 인원수"
FROM insa WHERE substr(ssn, 8,1)=2 GROUP BY buseo;


-- 17. 부서별 여자 인원수가 가장 많은 부서명 및 여자 인원수를 출력 한다.
SELECT buseo, 인원수 FROM (SELECT buseo, count(*) 인원수, rank()
over(ORDER BY count(*) DESC) r FROM insa WHERE substr(ssn,8,1)=2 GROUP BY buseo) WHERE r=1;


-- 18. 평균 급여(기본급) 및 전체 급여(기본급)를 출력 한다.
SELECT trunc(avg(basicpay)) "평균급여(기본급)", sum(basicpay) "전체급여(기본급)"
FROM insa;


-- 19. 평균 급여(기본급)보다 크거나 같은 사람의 인원수를 출력 한다.
SELECT count(*) "기본급 평균이상"
FROM insa WHERE basicpay >=(SELECT avg(basicpay) FROM insa);

-- 20. 80~89 년생의 인원수를 구하여라.
SELECT count(*) "80~89년생"
FROM insa WHERE substr(ssn, 1,1)=8;

-- 21. 다음의 필드를 출력하라.(성별은 남, 여 로 출력)
--      이름 부서 성별 직위
SELECT name 이름, buseo 부서, decode(substr(ssn,8,1),1,'남',2,'여') 성별, jikwi 직위 FROM insa;

-- 22. 부서별 성별 인원수를 출력
SELECT buseo 부서, decode(substr(ssn,8,1),1,'남',2,'여') 성별, count(*) 인원수
FROM insa GROUP BY buseo, decode(substr(ssn,8,1),1,'남',2,'여');

-- 23. 이름, 성별, 기본급, 순위를 출력하되 순위는 기본급에 대한 성별 순위를 출력 한다.
SELECT name 이름, decode(substr(ssn,8,1),1,'남','2','여') 성별, basicpay 기본급,
rank() over(partition BY decode(substr(ssn,8,1),1,'남','2','여') ORDER BY basicpay DESC)순위 FROM insa;

-- 24. 부서별 여자인원수가 3명이상인 부서와 여자인원수출력
SELECT buseo, count(*) 여자인원수 FROM insa
WHERE substr(ssn,8,1)=2 GROUP BY buseo HAVING count(*)>=3;

-- 25. 기본급 하위 10%만 출력(이름, 기본급)
  -- 이름  기본급
SELECT name, basicpay FROM (
SELECT name, basicpay, rank() over(ORDER BY basicpay) 순위 FROM insa)
WHERE 순위 <= trunc((SELECT count(*) FROM insa)*0.1);

'Oracle' 카테고리의 다른 글

11g R2 - LISTAGG 함수  (0) 2012.05.21
Oracle 이론 총 정리  (2) 2011.11.21
Oracle 실습문제 (8)  (0) 2011.11.17
Oracle_03  (0) 2011.11.09
Oracle_02  (0) 2011.11.09
Oracle_01  (0) 2011.11.07
Oracle_01 Oracle 2011. 11. 7. 20:48

* 오라클 설치
일단 설치법에 앞서 오라클을 설치하면 생기게 되는 문제
- 바이러스에 취약해 진다(..아마도)
- 컴퓨터의 속도가 현저히 느려짐을 체감한다(사양이 낮은 컴은 똥컴이 된다)

1. setup.exe 실행
다운로드는 알아서 받고, 현재 버젼은 11g까지 나왔으나 실무에서 10g가 일반적이라 10g로 설치




2. 기다리시라니 기다린다.



3. 비밀번호 입력
전역 데이터베이스 이름 기억해두고
데이터베이스 암호는 특수문자를 포함하여 길게(?) 작성한다.
비밀번호를 잊었을 땐 윈도우의 Administrator 관리자의 비밀번호만 알고 있으면 쉽게 찾을 수 있다 하나
방법은 구글링-



4. 조건검사(?)

조건검사 라고는 나오는데 그냥 다음을 눌러준다.


아래와 같은 메시지로 당황할 수 있다



적당히 무시해주고 예(Y) 클릭


5. 설치 중 방화벽에서 차단 메시지가 나오면 계속 차단을 누르고 삽질을 해도 무방하다.




6. 설치
그냥 누르고 기다린다.
 




7. 설치중 화면
수분 소요



8. 설치중 화면
위의 7번의 화면에 겹쳐서 나오는 또 하나의 설치 화면





9. 설치중 화면
별 생각 없이 확인




10. 설치 완료
완료 후에는 종료 버튼을 눌러 수동으로 종료



11. 제어판-관리도구-서비스 항목 체크
OracleOraDb10g_home1TNSListener
OracleServiceORCL
두개의 서비스 항목이 상태가 시작됨으로 사용중이어야 정상 작동한다
 



- 오라클 서버접속 : sys 관리자 접속
cmd> sqlplus sys/"암호" as sysdba;
다음에 접속됨 이라고 메시지가 나온다

- 사용자 계정 추가 : sys 계정에서만 사용자 추가 가능
sql> create user 사용자명 identified by "암호";

- 사용자 접속
sql> conn 사용자명/"암호";
처음 접속시 데이터베이스에 접속할 수 있는 권한이 없어 오류가 나므로
다시 관리자로 접속하여 권한을 부여한다.
sql> conn sys/"암호" as sysdba;
sql> grant connect, resource to 사용자명;
connet : 데이터베이스 접속권한, resource : 테이블스페이스 사용권한
이제 다시 conn 사용자명/"암호"; 로 재 접속시 '연결되었습니다' 라고 메시지가 나온다

- 저장된 쿼리(*.sql) 실행
sql> @경로\파일명.sql

- 웹을 통한 오라클서버 접속 : 포트번호는 어떻게 설정되는건지 잘 모르겠음-.-a
http://자신의ip주소:5560/isqlplus

http://자신의ip주소:1158/em  관리자영역

- sqlplus를 통한 사용자 접속
cmd> sqlplus 사용자명/"암호";
sql> select * from insa;  insa.sql 내 테이블 화면 출력: 그지 같이 나옴

- sql developer 를 통한 접속
프로그램 실행 후 + 버튼을 클릭하여 접속설정 창이 뜨면
접속이름은 알아보기 좋은 것(?)으로 하고
sql plus에서 생성한 사용자 이름과 비밀번호를 입력하고
아래의 SID를 오라클 설치시 전역 데이터베이스 이름으로 한다.
테스트 후 성공시 접속 버튼을 누르고 저장, 비밀번호 저장은 꼭 체크할 것.
귀찮아지니까-





- 레코드 : 한줄

- 컬럼 : 항목, 아이템, 하나하나 모여서 자료가 된다.
  · 자료는 소문자로 작성해도 대문자로 저장되어 출력된다.

- 테이블 : 표형태의 데이터로 테이블 1개가 파일 1개라 보면 된다.
  · 데이터베이스내에 존재하는 테이블 목록 확인 : sql> select * from tab;

- 스키마 : 어떤 항목을 저장할지에 대한 구조....?
  · 테이블의 스키마(구조) 확인 : sql> desc insa;
  · 널? : 넣지 않아도 되는 항목
  · not null : 꼭 넣어야 하는 항목
  · number() : 괄호안의 숫자는 자리수로, 그 자리수 만큼 저장 가능함을 말함 38자리(???였나)까지 가능
  · vachar2 : 가변적인 문자(열), 최대값 4000자
  · date : 날짜 저장

- DQL : 데이터베이스 정보를 검색한다(select 문)

- SQL
  · 데이터 정의어 DDL : create, lock, alter
  · 데이터 조작어 DML : insert, delete, update, merge
  · 데이터 제어

- Startup : 종료된 계정 다시실행(sys, administrator....당장은 설명한 단계는 아님...)

- cmd 창으로 임시로 나가기
sql> host
cmd> exit  → 복귀

- 자료검색
select 필드명, 필드명, .... from 테이블명 where 조건

- 기술순서
from절 → where절 → group by절 → select절 → order by절

- 전체자료 출력
select * from insa;
전체자료를 출력할 경우에도 *를 사용하지 말고 컴럼(필드)명을 반드시 입력해야 한다.

- 특정 컬럼만 확인
이름, 전화번호, 부서
select name, tel, buseo from insa;

- 테이블작성에서의 필드 순서는 의미가 없으며 select 문에서의 필드 순서가 중요

- 이름, 주민번호, 출신도, 기본급, 수당 출력
select name,ssn,city,basicpay,sudang from insa;

- 계산된 결과 출력
select name, buseo, basicpay+sudang "급여" from insa;

- 산술연산자 : +, -, *, /

- 문자열 결합연산자 : ||
select name || '님' as 이름, city 출신도 from insa;
결합되는 문자(열)상수는 홑따옴표 안에 기술한다(쌍따옴표 아님)

- 필드명 변경
select name as "이름", ssn 주민번호, basicpay+sudang "급 여" from insa;
공백/특문 있으면 따옴표를 꼭 붙이고 as는 생략 가능하다.

- 조건: 기본급+수당이 200만원 이상인 사람 출력(이름, 급여)
select name 이름, basicpay+sudang 급여 from insa where (basicpay+sudang)>=2000000;

- dual 테이블
dual 테이블은 데이터 딕셔너리와 함께 오라클에 의해 자동으로 생성된 테이블로 sys계정에 존재하고
모든 사용자가 사용 가능한 테이블이다.

- 컴퓨터 시스템의 날짜 확인
select sysdate from insa;
insa 의 데이터가 60개라 60개의 날짜를 출력
select sysdate from dual;
한개만 출력

- 연산자
산술/비교 연산자는 뻔하니 생략하고
논리연산자에서 not 연산자는 시스템 성능을 저하 할 수 있으므로 사용을 자제한다.

* 문자 함수

- substr
: 오라클에서 문자열의 위치는 1부터 시작하고 -1일 땐 뒤부터 시작

-이름, 주민번호의 8번째에서 1의 길이 만큼 문자열 추출
select name, substr(ssn, 8, 1) from insa;

- 이름, 주민번호, 출신도 출력(단, 여자만 출력)
select name, ssn, city from insa where substr(ssn,8,1)/2=0 or substr(ssn,8,1)=4;

- 78~82년생만 출력(이름, 주민번호, 부서)
select name, ssn, buseo from insa where substr(ssn,1,2)>=78 and substr(ssn,1,2)<=82;

- length : 문자열의 길이를 반환
select length('대한민국') from dual; → 4

- lengthb : 문자열의 byte수를 반환
select lengthb('대한민국') from dual; → 8

- instr : 문자의 위치를 반환
select instr('korea','e') from dual; → 4

- lpad : 문자열을 제외한 공간에 지정 문자를 왼쪽에 채운다.
-- 이름, 기본급, 그래프(그래프는 기본급 100000원당 * 하나 출력)
select name, basicpay, lpad('*', basicpay/100000, '*') 그래프 from insa 
*이라는 문자를 기본급을 10만원으로 나눈값 만큼의 byte수를 갖도록 하고 왼쪽에 *을 채운다.
select lpad('Korea', 12, '*') from dual;
Korea라는 문자를 12byte크기의 공간을 갖는 문자가 되도록 하고 왼쪽 나머지 공간에 *을 채운다.

- rpad : 문자열을 제외한 공간에 지정 문자를 우측에 채운다.
select rpad('KOR : ', 10, '*') from dual;
'KOR : ' 은 공백포함 6byte, 4byte공간 우측에 별4개 채움 → KOR : ****

- replace : 지정 문자를 다른문자로 치환
select replace('Seoul Korea', ' ', '') from dual;
 ▲ 공백을 없앰
select name, city, replace(buseo, '부', '팀') from insa;
 ▲ but, 앞에 부 라는 글자가 와도 바꿔버린다. 순서에 관계 없이..
 ▼ 아래와 같이 하는 것이 정답
select name, city, substr(buseo, 1, length(buseo)-1)||'팀' 부서 from insa;
select name, rtrim(buseo, '부') 부서 from insa;

select name, rtrim(buseo, '부')||'팀' 부서 from insa;

- rtrim : 문자열 중 오른쪽에서부터 지정 문자열에 포함된 글자중 하나라도 만나면 제거한다.
공백도 지정할 수 있고 오른쪽부터 훑어 가다 지정문자열에 포함된 글자가 아닌 다른 글자를 만나면
멈추고, 그러므로 중간에 포함된 문자도 제거할 수 없다.
select rtrim('ABAAAAABBBBBABCDAB', 'AB') from dual; → ABAAAAABBBBBABCD

- ltrim : 위와 같고 왼쪽부터..
select ltrim('ABAAAAABBBBBABCDAB', 'AB') from dual; → CDAB

- trim : 문자열의 앞, 뒤 또는 앞뒤에서 공백 문자를 제거 한다. 특정 문자제거도 가능하다
select trim('   ABC    ') from dual; → ABC
select trim('A' from name); 

- round : 반올림
select round(15.193, 1) round from dual; → 15.2
1은 소수점 1째자리, -1은 1의 자리 미입력시 default 0 입력

- trunc : 단위절삭
위와 같은 형식으로 사용
select round (12345, -3) round from dual; → 12000

- mod : 나머지값
mod(m, n) m을 n으로 나눈 나머지
SELECT MOD(11, 4) "Modulus" FROM DUAL; → 3


- to_char : 숫자나 날짜를 문자열로 변환
기존 데이터의 출력형식을 기술한 형식으로 변환

select name, to_char(ibsadate, 'YYYY"년" MM"월" DD"일"') 입사일 from insa;
▲ 출력 형식을 YYYY년 MM월 DD일 로 바꿔줌

select name, to_char(ibsadate, 'YYYY') || '년' from insa;
select name, to_char(ibsadate, 'YYYY"년"') from insa;
▲ YYYY로 출력 형식을 바꾸고 '년'이라는 문자를 연결한다 

- 국가에 따른 통화 기호 출력 : L

select name, to_char(basicpay, 'L99,999,999') from insa;
▲ 기본급을 세자리당 , 로 구분하고 앞에 \을 붙인다.

- 살아온 날수 구하기

select trunc(sysdate - to_date('1983/06/08', 'yyyy/mm/dd') )살아온날수 from dual;
▲ sysdate : 시스템에 저장된 현재 날짜 반환, to_date : 문자를 날짜로 변환
... 이라지만 솔직히 sysdate - to_date 구문이 이해가 가지 않는다-_-a
현재 날짜에서 해당 날짜를 빼라는 말인가?!

- 이름, 입사일, 근무일수

select name, ibsadate, trunc(sysdate - ibsadate) from insa;

select name, ibsadate, sysdate-ibsadate from insa;
▲ 그렇다면 이것도 현재날짜-입사날짜 인거네.. trunc는 절삭 자리수 미입력으로 0이니까
소수점 1째자리에서 반올림되어 1의 자리까지 출력될 것이고.. 그런가? 그러네..

- 이름, 입사일, 단 2000년에 입사한 사람만 출력

select name, ibsadate from insa where to_char(ibsadate, 'yyyy')='2000';

select name, ibsadate from insa where substr(ibsadate, 1,2)='00';
▲ where 조건절 : 입사날짜를 to_char로 yyyy형식으로 년도를 바꾸고 그것이 2000과 같은 조건의
데이터 출력, substr은 입사날짜의 기본값이 두자리이므로 1번째 위치에서 2만큼의 문자열이
00 일때의 조건

- 주민번호를 기준으로 나이를 출력. 단, 1년은 365일로 하고 1900년도에 태어났다는 가정하에

select name, ssn, trunc((sysdate - to_date('19'||substr(ssn, 1,6), 'yyyymmdd'))/365) 나이 from insa;
▲ 현재날짜-다음의날짜(주민번호의 1위치에서 6까지의 문자열앞에 19를 붙이고 그 형식은 yyyymmdd로 하고
그 날짜를 365일로 나눈 값) to_date는 문자를 날짜로 변환하므로 계산이 되는것 같다.

- 문제1. 컴퓨터 시스템의 날짜를 다음과 같은 형식으로 출력하기
1) 2011-11-07 월요일 03:10:10
2) 2011-11-07 15:10:10
3) 2011-11-07 오후 03:10:10

select to_char(sysdate, 'yyyy-mm-dd day hh:mi:ss') from dual;
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(sysdate, 'yyyy-mm-dd am hh:mi:ss') from dual;
▲ day: 요일, hh24: 24시간제로 표시, am:오전/오후 값 표시

- 문제2. 주민번호 8번째는 성별이다. mod를 이용하여 여자이면서 서울사람만 출력(이름, 주민번호, 출신도)


select name, ssn, city from insa where (MOD(substr(ssn, 8, 1), 2)=0) and city='서울';
▲ 주민번호의 8번째 위치에서 1까지니까 123456-8 성별을 나타내는 위치에 있다.
그 위치의 값을 2로 나눈 값이 0이고(2와 4로 시작하는 주민번호) 출신도가 서울인 조건의 값 출력

- 문제3. 기본급+수당 200만원 이상인 사람중 2000년 이후에 입사한 사람만 출력(이름, 입사일, 기본급+수당)
단, 급여는 3자리마다 컴마가 출력되고 앞에 원화기호를 표시한다.

select name, ibsadate, to_char(basicpay+sudang, 'L99,999,999') 수당 from insa where basicpay+sudang>=2000000 and to_char(ibsadate, 'yyyy')>='2000';
▲  to_char를 이용하여 급여의 값을 3자리마다 출력하는 형식과 원화기호를 표시하기 위한 L99,999,999 의
형식의 문자열로 변환을 해주고 200만원 이상의 급여의 조건으로 where절 다음에 기재해 주고
to_char를 이용하여 입사 날짜형식을 yyyy로 바꿔줌과 2000년 이상의 값이 되는지 조건을 기재
말로 설명이 어렵네;;

- 문제4. 서울사람이면서 김씨만 출력(이름, 출신도)

select name, city from insa where city='서울' and substr(name,1,1)='김';
▲ where조건절에 출신도가 서울이고 이름의 1번째 위치부터 1의 위치까지의 문자열이 김 인 사람의 조건

- 문제5. 출신도가 서울, 인천, 광주인 사람 출력(이름, 출신도)

select name, city from insa where city='서울' or city='인천' or city='광주';
▲ 문제4번과 유사하다

- 문제6. 다음을 출력한다.
이름, 기본급, 수당, 급여(기본급+수당), 세금(급여*0.03), 실수령액(급여-세금) 단, 세금은 일의 자리에서 절삭한다.

select name 이름, basicpay 기본급, sudang 수당, basicpay+sudang 급여, trunc((basicpay+sudang)*0.03, -1) 세금,
(basicpay+sudang)-trunc((basicpay+sudang)*0.03, -1) 실수령액 from insa;
▲ 세금의 절삭을 위해 trunc명령어를 사용하여 기본값으로 일의 자리에서 절삭되도록 -1의 조건을 달아주고
문제에서 제기한 식대로 select 문에 출력해준다.

- 문제7. 생년월일이 1980년 2월 1일 이후에 태어난 사람만 출력한다. 이름, 주민번호, 출신도(생년월일은 주민번호 기준)

select name 이름, ssn 주민번호, city 출신도 from insa where substr(ssn, 1,6)>800201 or (substr(ssn,1,2)>=0 and substr(ssn,1,2)<=11);
▲ 조건으로 substr로 1의 위치부터 6까지의 값이 800201 보다 큰 주민번호를 가지고 있거나 1~2위치가 0이고 1~2위치가 11보다작거나 같은 조건이라고는 하는데
위에 1900년도에 태어났다는 조건의 예제를 잘 활용해보면 좀 간단하다 싶은 답안이 있을 것 같기도...

'Oracle' 카테고리의 다른 글

11g R2 - LISTAGG 함수  (0) 2012.05.21
Oracle 이론 총 정리  (2) 2011.11.21
Oracle 실습문제 (8)  (0) 2011.11.17
Oracle_03  (0) 2011.11.09
Oracle_02  (0) 2011.11.09
Oracle_01  (0) 2011.11.07