create table tb_student(

   hakno     char(4)          primary key

,  uname    varchar2(10)   not null

,  phone    varchar2(15)   not null

,  address  varchar2(20)


--과목테이블

create table tb_gwamok(

   gcode char(4) primary key

,  gname varchar2(10) not null

,  hakjum number default 0

)


select * from tb_student;

select * from tb_gwamok;


insert into tb_student(hakno,uname,phone,address)

values('1001','홍길동','555-8798','서울')


insert into tb_student(hakno,uname,phone,address)

values('1002','민들레','444-8745','서울');


insert into tb_student(hakno,uname,phone,address)

values('1003','개나리','333-8965','제주');


insert into tb_student(hakno,uname,phone,address)

values('1004','무궁화','222-4125','대전');


insert into tb_student(hakno,uname,phone,address)

values('1005','라일락','111-8963','서울');


select * from tb_student


insert into tb_gwamok(gcode,gname,hakjum)

values('P01','자바',3);

insert into tb_gwamok(gcode,gname,hakjum)

values('D01','포토샵',2);

insert into tb_gwamok(gcode,gname,hakjum)

values('C01','바리스타',1);

insert into tb_gwamok(gcode,gname,hakjum)

values('P02','오라클',2);

insert into tb_gwamok(gcode,gname,hakjum)

values('P03','JSP',5);


select * from tb_gwamok


create table tb_sugang(

   sno      number     primary key

,  hakno   char(4)      not null

,  gcode  char(4)      not null

,  sdt      date         default   sysdate --현재 시스템 날짜

)


create sequence sugang_sno

insert into tb_sugang(sno,hakno,gcode)

values(sugang_sno.nextval,'1001','P01')

insert into tb_sugang(sno,hakno,gcode)

values(sugang_sno.nextval,'1001','P02');

insert into tb_sugang(sno,hakno,gcode)

values(sugang_sno.nextval,'1001','P03');

insert into tb_sugang(sno,hakno,gcode)

values(sugang_sno.nextval,'1002','D01');

insert into tb_sugang(sno,hakno,gcode)

values(sugang_sno.nextval,'1003','P01');


delete from tb_sugang


select * from tb_sugang







insert into tb_sugang(sno,hakno,gcode)

values(1,'1001','P01')


select * from tb_sugang


1) 학번 1001 입력하면 학생 정보 출력


select *

from tb_student

where hakno='1001'



2) 과목이름 입력하면 과목정보 출력


select *

from tb_gwamok

where gname='오라클'



select *

from tb_gwamok

where gname like '자%' --비슷한 유형


like '%자'

like '%자%'




3) 학번 1001 입력하면 수강정보 출력

select *

from tb_sugang

where hakno='1001'

================================================

*조인형식

select 칼럼명

from 테이블명 join 테이블명

on 조건절


select *

from T1 join T2

on T1.x=T2.y


select T1.*,T2.*,T3.*

from T1 join T2

on T1.x=T2.y join T3

on T2.y=T3.z



==============================================


4)수강신청을 한 학생의 학번과 이름 출력


select tb_sugang.*, tb_student.*

from tb_sugang join tb_student

on tb_sugang.hakno=tb_student.hakno

where tb_sugang.hakno='1001'



select AA.*, BB.uname

from tb_sugang AA join tb_student BB

on AA.hakno=BB.hakno

where AA.hakno='1001'



5)수강신청을 한 학생들의  이름, 수강과목이름, 학점을 출력

select tb_sugang.*, tb_student.uname, tb_gwamok.gname,tb_gwamok.hakjum

from tb_sugang join tb_student

on tb_sugang.hakno=tb_student.hakno join tb_gwamok

on tb_sugang.gcode=tb_gwamok.gcode

where tb_sugang.hakno='1001'

=============================================================


select tb_sugang.*, tb_student.uname, tb_gwamok.gname,tb_gwamok.hakjum

from tb_sugang join tb_student

on tb_sugang.hakno=tb_student.hakno join tb_gwamok

on tb_sugang.gcode=tb_gwamok.gcode


================================================================


1)과목코드 P01를 입력하면 학번,이름,과목이름,학점 출력


select tb_sugang.hakno,tb_student.uname,tb_gwamok.gname,tb_gwamok.hakjum

from tb_sugang join tb_student

on tb_sugang.hakno=tb_student.hakno join tb_gwamok

on tb_sugang.gcode=tb_gwamok.gcode

where tb_sugang.gcode='P01'





2)학번 1001이면서 과목코드 P01를 수강신청했는지 수강정보 출력

select AA.*, BB.uname,CC.gname

from tb_sugang AA join tb_student BB

on AA.hakno=BB.hakno join tb_gwamok CC

on AA.gcode=CC.gcode

where AA.hakno='1001' and AA.gcode=upper('p01')

--upper()대문자로 변경/lower()소문자로 변경


select count(*) from tb_sugang --레코드갯수


select sum(hakjum),avg(hakjum),min(hakjum),max(hakjum)

from tb_gwamok --집계함수



select *

from tb_sugang

order by sno desc


정렬:오름차순 asc, 내림차순 desc


형식)동일한 칼럼의 내용끼리 묶어주는 쿼리문

select 칼럼명 or 집계함수 from 테이블명 group by 칼럼명

group  by절과 * 는 절대 같이 사용할수 없다.

대부분의 group by절은 집계함수와 많이 사용된다.




*수강신청을 한 각각의 학생들이 몇과목을 신청했는지?

select hakno, count(hakno) as 과목수

from tb_sugang

group by hakno

order by count(hakno) asc



3)학번 1001를 입력하면 총 몇학점인지 출력


select SU.hakno,sum(hakjum)

from tb_sugang SU join tb_gwamok GW

on SU.gcode=GW.gcode

group by SU.hakno



having sum(hakjum)<5


select AA.*, BB.uname

from (

          select SU.hakno,sum(hakjum)

          from tb_sugang SU join tb_gwamok GW

          on SU.gcode=GW.gcode

          group by SU.hakno

) AA join tb_student BB

on AA.hakno=BB.hakno

where AA.hakno='1001'




select KK.uname,EE.*

from (

        select hakno,sum(hakjum)

        from (

                 select *

                from tb_sugang AA join tb_gwamok BB

                on AA.gcode=BB.gcode

        ) DD

        group by hakno

) EE join tb_student KK

on EE.hakno=KK.hakno


================================================================

4)각 과목당 수강신청 인원수 출력

select AA.*, BB.gname

from (

      select gcode,count(gcode)

      from tb_sugang SU

      group by gcode

) AA join tb_gwamok BB

on AA.gcode=BB.gcode




5)각 과목당 수강신청 인원수가 1명인 수강정보 출력


select gcode, count(gcode)

from tb_sugang

group by gcode

having count(gcode)=1


6) 수강신청한 학생들 중  총학점의 평균보다 낮게 신청한 학생들의 정보 출력

이영례=========================================================

select AA.*,BB.uname

from (

  select SU.hakno,sum(hakjum)

  from tb_sugang SU join tb_gwamok GW

  on SU.gcode=GW.gcode

  group by SU.hakno

  having sum(hakjum)< (  select avg(hap)

                                from

                                  (   select sum(hakjum) as hap

                                      from tb_sugang SU join tb_gwamok GW

                                      on SU.gcode=GW.gcode

                                      group by SU.hakno

                                  ) --총학점누적

                              ) --총학점에 대한 평균값을 구하고

) AA join tb_student BB

on AA.hakno=BB.hakno


================================================


select *

from tb_gwamok

where hakjum > (select avg(hakjum) from tb_gwamok)



where <

                select avg(hap)

                from      (

                                  select sum(hakjum) as hap

                                  from tb_sugang SU join tb_gwamok GW

                                  on SU.gcode=GW.gcode

                                  group by SU.hakno

                            ) AA


===================================================


혜선=====================================================

select AA.*, ST.uname

from (  select SU.hakno, sum(GW.hakjum) hak

       from tb_sugang SU join tb_gwamok GW

       on SU.gcode=GW.gcode

       group by SU.hakno

        ) AA join tb_student ST

on ST.hakno=AA.hakno

where AA.hak < (   select avg(BB.hak) avghak

                   from  (   select sum(GW.hakjum) hak

                              from tb_sugang SU join tb_gwamok GW

                              on SU.gcode=GW.gcode

                              group by SU.hakno

                                    ) BB

                       )

 

승현========================================================

select uname,s.* 

from ( select s.hakno,sum(hakjum) from tb_sugang s,tb_gwamok g 

         where s.gcode=g.gcode 

         group by s.hakno 

         having sum(hakjum)<(

                                        ( select sum(hakjum) from tb_sugang s,tb_gwamok g 

                                          where s.gcode=g.gcode) / ( select count(distinct hakno) 

                                                                                from tb_sugang)

                                      )

        ) s,tb_student                  

where s.hakno=tb_student.hakno


현국========================================================

select SU.hakno, sum(GW.hakjum), ST.uname

from tb_sugang SU join tb_gwamok GW

on SU.gcode=GW.gcode join tb_student ST

on SU.hakno=ST.hakno

group by SU.hakno, ST.uname

having sum(GW.hakjum) < (  select avg(hap)

                                        from 

                                        (   select SU.hakno, sum(hakjum) as hap

                                            from tb_sugang SU join tb_gwamok GW

                                            on SU.gcode=GW.gcode

                                            group by SU.hakno

                                        )

                                    )


=======================================================================

distinct 동일칼럼에서 중복한 값이 있을경우 대표로 1개만 출력

select hakno from tb_sugang

select distinct(hakno) from tb_sugang


=====================================================================


select count(*) from zipcode

select top 10 *  from zipcode


1) 동이름 '구로'로 시작되는 레코드 갯수

select count(dong) from zipcode where dong like '구로%'


2) 동이름 '사서함'을 끝나는 레코드 갯수

select count(*) from zipcode where dong like '%사서함'

3) 우편번호가 '100'으로 시작하고, 동이름에 '중앙'이 들어가는 레코드 갯수

select count(*) from zipcode where zipcode like '100%' and dong like '%중앙%'

4) 번지에 데이터가 입력되지 않은 레코드 검색

select count(*) from zipcode where bunji is null --is not null

select count(*) from zipcode where bunji=''


5) 서울시중에서 영등포구,구로구,마포구만 검색

select count(*)

from zipcode

where sido='서울'

and  (gugun='영등포구' or gugun='구로구' or gugun='마포구')


select count(*)

from zipcode

where sido='서울'

and gugun in ('영등포구','구로구','마포구')


select * from zipcode where sido='경기' and gugun in ('영등포구','구로구','마포구')



6)서울시의 각각의 구 중에서 구이름, 동갯수를 내림차순으로 출력

select AA.gugun, count(AA.gugun)

from(

      select gugun,dong

      from zipcode

      where sido='서울'

      group by gugun, dong

) AA

group by AA.gugun

order by count(AA.gugun) desc


select gugun, count(distinct(dong))

from  zipcode

where sido='서울'

group by gugun order by count(distinct(dong)) desc





7)전국의 시도별로 각각의 시, 구, 군이 몇개씩 존재하는지 내림차순으로 출력


select AA.sido, AA.gugun, count(AA.gugun)

from(

      select sido, gugun,dong

      from zipcode

      group by sido, gugun,dong

) AA

group by AA.sido, AA.gugun

order by AA.sido,  count(AA.gugun) desc




8)각 도별 시중에서 동갯수가 50이하의 레코드의 도이름, 시이름, 동갯수 내림차순 출력

select AA.sido, AA.gugun, count(AA.gugun)

from(

      select sido, gugun,dong

      from zipcode

      group by sido, gugun,dong

) AA

group by AA.sido, AA.gugun

having count(AA.gugun)<50

order by count(AA.gugun) desc





select * from zipcode


==============================================================

* SQL injection


[제약조건]

- 데이터의 무결성을 위해 강제성을 테이블에 부여한다.

- 자료의 무결성을 테이블 설계단계에서 강제하여 지킴으로써

   보다 효율적으로 데이터 관리의 중요한 역할을 함.(강제성)

   데이터의 결점이 없는 상태를 무결성이라 한다.

   

1. default 제약조건

    사용자가 값을 입력하지 않으면 해당 컬럼이 정의한 기본값으로

    자동으로 넣어준다.

    예) 등록일(현재시스템의 날짜)

         regdt date      default sysdate      오라클 방식

         regdt datetime default getdate()      MS-SQL 방식



2. primary key 기본키

   테이블의 내용에서 각각의 레코드를 대표하는 유일한 칼럼은

   반드시 존재해야 한다.

    왜? 해당 레코드만 꼭 집어서 수정,삭제,조회하기 위해

    즉, where조건절에서 걸릴수 있는 대표적인 칼럼을 미리 강제한다.

    - primary key는 테이블당 1개씩 반드시 존재해야 한다.

    - 조회가 자주 일어나는 칼럼이 primary key의 대상이 된다.

    - primary key 로 설정된 칼럼은 빨리 조회할 수 있는 기능이 추가된다

    - primary key는 null값을 넣을수 없다.

    - 유일성 보장, not null 속성을 포함

    - index (조회를 빠르게 하는 기능)가 해당 컬럼에 적용

    - 오라클(넌클러스터드 인덱스),MS-SQL(클러스터드 인덱스)

    

3. unique 

  - 중복된 컬럼내용을 허용하지 않는다

  - 유일성 보장

  - 단 1회 null 값 허용

  - 테이블당 여러 칼럼 가능

    예) jumin varchar2(13) unique

    

4. not null

  - null값(빈값)을 허용안함(해당 컬럼에 무조건 데이터 입력해야함)

    예)아이디, 비번, 주민번호.....취미(X)

         upw   varchar2(8)      not null   --비번

         habbit varchar2(8)                   --취미

         

5. check

  - 데이터의 범위를 제한시키는 제약조건)

     예) marry varchar2(10) check(marry in ('기혼','미혼'))

          kor    number(3)    check(kor between 0 and 100) --0~100



6. 참조무결성 Foreign Key 제약조건

   - 부모테이블의 PK를 참조하는 자식테이블의 해당 칼럼

      이때 자식테이블의 FK는 부모테이블의 PK와 자료형이 일치되야 한다.

      

      

      create table student(

         hakno char(4) primary key

         ,regdt date    default sysdate

      )

      

      create table sugang(

         sno     number primary key

         ,hakno char(4)  references student(hakno)

                              on delete cascade

      )

  --hakno char(4)  foreign key references student(hakno) MS-SQL문법

drop table sugang

insert into student(hakno) values('1001');

insert into student(hakno) values('1002');


select * from student


insert into sugang(sno,hakno) values(1,'1001');  --잘된 예

insert into sugang(sno,hakno) values(1,'1004');  --못된 예


=============================================================


           부모테이블                                      자식테이블

-------------------------------------------------------------

입력     상관없음                                         반드시 부모테이블에 있는

                                                                데이터가 들어간다


수정    수정하려는 데이터가 자식테이블에서    부모테이블에 존재하는                

          참조하고 있는지 검증                          다른 데이터로 변경가능


삭제    삭제하려는 데이터를 자식테이블이        제약없음

          참조하고 있는지를 검증

-------------------------------------------------------------


[관계형 데이터베이스]

개념:데이터베이스내의 테이블은 최소한의 의미(주제)를 가지고

       테이블을 나누어서 구성하되, 그 테이블에 있는 컬럼을 연결한 것이다.

       (부:PK-자:FK)

       

* 주제별 테이블은 서로 관계가 형성되는 총3가지가 있다.

1) 1:1 두 테이블간 어떤 테이블의 PK라도 다른 테이블에 전이되어도 상관없다.

2) 1:N 두 테이블간의 관계를 위해서 교차테이블을 만들 필요가 없다.

         단, 1관계에 있는 PK를 N관계에 있는 테이블에 컬럼으로 전이시켜

         관계를 맺는다.

3) N:M 두 테이블간의 관계를 위해서 교차테이블을 반드시 만든다.

          제4정규화작업


* 부모테이블(1관계)의 PK가 자식테이블(N관계)의 FK로 전이된다.

* FK로 두 테이블간의 데이터 무결성을 강제할 수 있다.

* JOIN작업으로 원하는 작업을 처리할 수 있다.

=================================================================

- 뷰 View

테이블 전체를 보여 줘서는 안되는 경우, 보여줄 컬럼들만 가져오는 뷰를 만들어서

사용한다. 사용의 편의성, 보안상의 이유

이미 존재하는 혹은 그 이상의 테이블에서 원하는 데이터만 정확히 가져올 수

있도록 미리 원하는 컬럼만 모아 가상적으로 만든 테이블이다. 가상테이블


- 트리거 Trigger

자동화와 연결, 연쇄반응, 목적은 무결성의 원칙을 유지


- 인덱스 index

데이터베이스내의 테이블에서 원하는 정보를 좀더 빨리 찾아줄수 있게 데이터의

위치정보를 모아놓은 데이터베이스내의 개체.

빠르게 찾자. 조회를 빠르게 하자.

DB성능튜닝에서의 핵심기술.


* 인덱스는 정렬되어 있다.

1)사전자체가 인덱스 : 클러스터드clustered 인덱스

2)책뒤에 인덱스 페이지를 따로 만든다 : 넌클러스터드nonclustered 인덱스


=========================================================

create table 테이블명

create view 뷰이름

create trigger 트리거이름

create index 인덱스명

=========================================================

drop table 테이블명

drop view 뷰이름

drop trigger 트리거이름

drop index 인덱스명

=========================================================

* 포인트point 쿼리

조회되는 데이터가 한두개

select * from tb_member where id='kim5'


* 범위range 쿼리

조회되는 데이터가 다수

select * from tb_member where dong like '구로%'


* 커버드covered 쿼리

조회의 대상과 조회의 결과가 컬럼이 일치되는 형태

select id from tb_member where id='kim5'

select id,pw from tb_member where id='kim5' and pw='1234'

========================================================

select * from zipcode


create table w_zipcode

as

select * from zipcode  --테이블 복사




인덱스형식)

create index 인덱스이름

on 테이블명 (칼럼명)


create index idx_zip

on w_zipcode(zipcode)


create unique index idx_zip

on w_zipcode(zipcode)


drop index idx_zip

select * from w_zipcode 


drop table w_zipcode


* 테이블복사

MS-SQL 형식

select * into 새테이블 from 원본테이블

select * into w_zipcode from zipcode where zipcode='000-000'

--테이블 구조복사


오라클 형식

create table 새테이블

as

   select * from 원본테이블



create table w_zipcode

as

   select * from zipcode



create index zip_index

on w_zipcode(dong)


select * from zipcode     where dong='개포1동';

select * from w_zipcode  where dong='개포1동';

select * from w_zipcode  where zipcode='135-805';

select * from w_zipcode  where dong like '개포1%'

select * from w_zipcode  where dong like '%개포1%' --비추천


* 자동인덱스

primary key 제약조건에 의해 자동적으로 생성되는 인덱스

클러스터드 인덱스, 사전인덱스


* 수동인덱스

create index명령을 실행해서 만드는 인덱스

넌클러스터드 인덱스, 인덱스 페이지 추가


* 인덱스를 생성하는 것이 좋은 컬럼

1)where조건절 또는 join 조건 안에서 자주 사용되는 컬럼

2)패턴조회시 쿼리문에 %는 뒤에 붙여야 성능발휘

3)where절에 사용되는 컬럼에서는 함수를 가급적 쓰지 말것

   where day(regdt)=12

   

* 인덱스를 사용하지 말아야 할 컬럼

1)좀처럼 검색되지 않는컬럼

2)전체중 상당부분을 가져오는 질의에 사용되는 컬럼

3)같은값이 많은 컬럼






'..열심히 공부하세.. > 오라클' 카테고리의 다른 글

[02] 오라클 설치  (0) 2012.05.08
[01] 데이터베이스 개론  (0) 2012.05.08
쿼리문  (0) 2011.03.29
테이블  (0) 2011.03.29
PL/SQL  (0) 2011.03.29

+ Recent posts