본문 바로가기

sql

11-2. 데이터 조작 언어(DDL문)

728x90
반응형

DDL 명령어 (5가지)

create, alter, drop , truncate, rename

 

 

오라클의 데이터를 삭제하는 방법 3가지

               delete           truncate           drop

1. 데이터    삭제              삭제               삭제

2. 저장공간  유지             삭제                삭제

3. 저장구조  유지             유지                삭제

4. 롤백유무  가능             불가능             불가능

5. flachback    가능             불가능             가능

     유무

 

flashback table emp to before drop;

**우리 프로그램은 안되요~

 

*저장공간:  컬럼/행들.....

*저장구조: 테이블....

 

각각의 코딩

delete from emp;

truncate table emp;

 

**만약 작동 안되면

도스창 끄거나

sqlgate 껐다 다시켜서 해볼 .

 

 

TRUNCATE

 

truncate

속도 엄청 빠름. 억단위 건도 순식간에 .

rollback 해도 안됨. 날라갔음.

 

drop table emp;

***드랍날려도

플래시백으로 복구 가능

 

delete 골든타임 가진다.

truncate 그런거 없음.

롤백도 먹음. 그냥 날라간거임.

 

 

 

-update 문을 사용한 서브쿼리

*update 문의 서브쿼리를 있는

update-----서브쿼리가능

set----------서브쿼리가능

where-----서브쿼리가능

 

 

문제340.

ALLEN 월급보다 많은 월급을 받는 사원들의

월급을

SMITH 월급으로 변경하시오

 

update emp

set sal=( select sal from emp

                where ename='SMITH')

where sal > (select sal from emp

                where eanme='ALLEN');

 

 

 

문제341.

JONES 같은 직업을 갖는 사원들의 커미션을

MARTIN 커미션으로 변경하시오

 

update emp

set comm = (select comm from emp

               where ename = 'MARTIN')

where job in (select job from emp

                              where ename='JONES');

 

 

update emp

set nvl(comm, -1) = (select nvl(comm, -1) from emp

          where ename= 'MARTIN')

where job in(select job from emp

               where ename = 'JONES');  

이거 안됨????????

 

SET 자리에

COMM 이라고 써야함.

(변환값, 함수 못쓰는 )

SET 컬럼 =

SET 무조건 = 등호식으로 간다.

 

 

 

문제342.

emp 테이블에 loc 컬럼을 추가하시오

 

alter table emp

add loc varchar2(20);

**추가가 안되면 다른창을 꺼버려야함

 

 

문제343.

지금 emp 테이블에 추가한 loc 컬럼을

해당 사원의 부서위치로 값을 갱신하시오

(merge 문으로)

 

merge into emp e

   using dept d

on( e.deptno = d.deptno)

when matched then

update set e.loc = d.loc;

 

*방법 3가지

1. merge (튜닝된 sql)

2. update 절의 서브쿼리문(+제약) (튜닝된 SQL)

3. 상호관련 서브쿼리문을 이용한 update(악성sql)

 

 

 

 

-상호관련 서브쿼리문을 이용한 update

(악성sql)

악성sql emp 테이블의 loc 다가

detp 테이블의 loc 값을 갱신시켜라

 

update emp e

set loc = (select loc from dept d

             where d.deptno = e.deptno);

 

서브쿼리부터 실행되는게 아니라

메인쿼리부터 실행된다

그래서

메인쿼리에서

update emp

set loc =

하면

  loc컬럼에 하나 넣을걸 찾으라고 명령이 들어가고

 그래서 서브쿼리에서 2테이블의 deptno 일치하는 찾아내면

 그걸 emp테이블의 loc 컬럼에 집어넣는다.

이렇게 하나하나 찾아서

컬럼에 넣어주는 작업이라서

악성 sql 이다.

 

update emp e 부터 시작.

근데

악성이냐면

where deptno = e.deptno

deptno 14건을 일일이 조회하면서 업데이트 한다.

만약

where deptno = 10 해주면

deptno 14 일일이 조회하면서 10번을 골라내

                         업데이트 한다.

코딩작성은 간단하나

내부적으로 일일이 조회하면서 하니까

오래걸린다.

빅데이터를 다루면 오래 걸린다.

 

 

문제344.(점심시간 문제)

사원테이블에 grade 컬럼을 추가하고

salgrade 테이블의 grade(등급)으로 값을 갱신하시오

(자신의 월급에 맞는 급여등급으로 갱신)

(악성sql 짜시오)

 

alter table emp

add grade nember(10);

 

 

update emp e

set grade= (select grade from salgrade s

                    where e.sal between losal and hisal);

 

 

 

 

10. DDL (2 67페이지)

 

*DDL 문이 필요한 이유?

  데이터 분석가 입장에서 본다면?

    분석해야 데이터를 테이블로 생성해야

     SQL 작성할 있기 때문이다.

(: 엑셀파일, csv 파일)

 

 

DDL 문이란?

 Data   Definition Language

데이터  정의어

: create, alter, drop, truncate, rename

 

DDL 문을 통해 만들어 내는

DATABASE OBJECT

 

database object 5가지

1. table:  데이터를 저장하는 기본 저장 단위

2. index: 데이터 검색 속도를 높이는 오브젝트

3. view : 하나이상의 테이블에 있는 데이터의

                  부분집합

4. synonym: 동의어 (다른이름저장....같은거)

5. sequence: 번호를 자동으로 생성하는 번호 생성기

 

 

 

CREATE

table 생성 방법

 create table emp03 

(empno number(10),

 ename varchar2(20),

 sal      number(10),

 job    varchar2(20),

 hiredate date);

 

 

1. 테이블명(컬럼명) 지을 주의사항

       -문자 시작해야 한다

       -25 이내여야 한다

       -오라클 예약어를 사용하면 안된다

      (ex: select 같은거

           create table select

           (empno number(10) );

 

 

2. 데이터 타입의 종류 3가지

    -문자: char, varchar2, long, clob, blob

      -숫자:  number

    -날짜: date(<<<이건 길이 지정 안해준다. 

                      99991231일까지로

                      정해져있다.)

 

 

long, clob, blob 데이터 타입

1. long : 텍스트 파일을 저장할 사용하는

         데이터 타입(최대2GB)

2. clob, blob: 이미지 데이터를 저장할

              사용하는 데이터 타입(최대4GB)

 

:

create table resume

 (ename varchar2(20),

age number(10),

mobile varchar2(20),

self_intro long);

 

insert into resume(ename, age, mobile, self_intro)

values('chio jae hyeock', 27, '01053692647',

            'when i was young, my family was poor,

             my mother said, she doesnt like chinese noodle.

            Yahee Yahee Ya');

싱글쿼테이션을 넣고 싶다!!!!!!!!!!!

       doesn''t >>>쓰고자 하는 싱글쿼테이션 앞에

                       싱글쿼테이션을 붙인다.

 

문제345.

emp03 데이터를 2 정도 입력하시오

 

insert into emp03(empno, ename, sal, job, hiredate)

values (1235, 'SMITH', 2000, 'SALESMAN', to_date('1999/12/12', 'rrrr/mm/dd') );

 

 

문제346.

아래의 테이블을 생성하시오

테이블명: emp04

컬럼명: 이름, 나이, 주민등록번호, 생일, 주소, 핸드폰번호

 

 create table emp04 

(ename varchar2(20),

 age number(10),

 p_number number(30),

 birth date,

 address varchar2(80),

 mobile number(30) );

 

 

 

 

 

 

문제347.

본인 개인정보를 emp04 입력하시오

 

 insert into

 emp04(ename, age, p_number, birth, address, mobile)

values( 'OHSEHEE', 31, 880401-2111111, to_date('1988/04/01', 'rrrr/mm/dd'),

'서울시 광진구 구의동',

01049385541);

 

 

 

 

문제348.

부도예측 데이터3.csv 오라클 데이터베이스에

로드하시오

1. table 생성

2. SQL Gate 툴로 로드

 

창업건수.csv, 폐업건수.csv 오라클 데이터 베이스에

로드하시오!

 

창업건수 테이블명: new_cnt

폐업건수 테이블명: end_cnt

 

create table new_cnt

(year number(30), hairshop number(30), restaurant number(30), sushi number(30), chicken number(30), coffee number(30), korea_food number(30), hof number(30));

 

create table end_cnt

(year number(30), hairshop number(30), restaurant number(30), sushi number(30), chicken number(30), coffee number(30), korea_food number(30), hof number(30));

 

 

문제349.

치킨집 폐업건수가 가장 높은 연도와

폐업건수를 출력하시오

select year, max(chicken)

from end_cnt

group by year;

 

select year, chicken

from end_cnt

where chinken = (select max(chicken)

                     from end_cnt);

 

 

 

문제350.

2006년도에 가장 폐업을 많이 업종이 무엇인가

 

create table end_cnt2

as

select * from end_cnt

unpivot(cnt for column1 in(HAIRSHOP, RESTAURANT,

SUSHI, CHICKEN, COFFEE, KOREAN_FOOD,HOF) ) ;

 

 

 

화면 캡처: 2018-10-26 오후 4:58

 

select *

from end_cnt2

where cnt = (select max(cnt)

                       from end_cnt2

                       where year = 2006)

and year=2006;

 

이건 컬럼을 통째로 데이타에 넣어야 하는데

unpivot 이용해야 한다

컬럼을 데이터 속으로 입력하는 방법---> unpivot

데이터------------->컬럼:  pivot

컬럼---------------->데이터: unpivot

 

 unpivot:      컬럼---------------->데이터

 

10         20          30                          deptno     sum(sal)

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

8750  21973   9400                            30              9400

                                                              20            21973

                                                              10              8750

 

create table emp406

 ("10" number (10),

"20" number(10),

"30" number(10));

 

insert into emp406

values(8750, 21973,9400);

 

 

SELECT * FROM emp406

unpivot(SUMsal FOR deptno IN ("10", "20", "30"));

 

함수아님.

 

 

표시한 곳은 어떤걸 넣어도 상관없음

a,d 라고 넣어도 나옴

 

 

 

화면 캡처: 2018-10-26 오후 4:28

 

a 붙인거에 10,20,30 컬럼명이 값으로 들어가고

d 새로만든 D 라는 컬럼에 값을 넣어준거다.

 

 

문제351.

end_cnt 테이블을 unpivot 문을 이용해서

아래와 같이 결과를 출력하시오

 

select * from end_cnt

unpivot(A for B in(hairshop~모든 컬럼명 );

 

 

 

 

문제351.(마지막문제)

년도, 업종, 폐업건수, 순위를 출력하는데

순위가 1위만 출력하시오

 

년도     업종    폐업건수   순위

2005                                               1

2006                                               1

2007                                               1

2008                                               1

2009                                               1

2010                                               1

2011                                               1

2012                                               1

2013                                               1

2014                                               1

 

 

 

 

 

 

create table end_cnt3

as

select * from end_cnt

unpivot( CNT  for SHOP  in(HAIRSHOP, RESTAURANT,

SUSHI, CHICKEN, COFFEE, KOREAN_FOOD,HOF);

 

 

 

 

 

 

 

 

select *

from (

select year, colmn1 , cnt,

dense_rank() over ( partition by year

order by cnt desc ) 순위

from end_cnt2

)

where 순위 = 1;

 

 

ALTER

-DDL 문의 alter

"테이블의 컬럼을 추가, 삭제, 변경

사용하는 명령어"

 

문제352.

사원 테이블의 사원번호, 이름. 월급, 직업, 부서번호를 가지는

emp09 라는 테이블을 생성하시오

(서브쿼리 방식으로)

 

create table emp09

as

   select empno, ename, sal, job, deptno

   from emp;

 

설명: CTAS(create table as subquery)

>>서브쿼리로 테이블 생성

 

 

문제353.

emp09 입사일 컬럼을 추가하시오

 

alter table emp09

add hiredate date;

 

>>>add + 컬럼명 + 데이터 타입(유형)

 

 

문제354.

emp09 hiredate emp 테이블의

hiredate 값을 갱신하시오

 

empno 컬럼이 없을 거다.

 A 테이블의 내용을

 B 테이블에 옮기는 과정이

alter/add -> update/merge/update상호관련

과정을 겪는다

 

merge into emp09 e9

 using emp e

 on (e9.empno = e.empno)

 when matched then

 update set e9.hiredate = e.hiredate;

 

 

 

문제355.

emp09 hiredate emp 테이블의

hiredate 값을 갱신하는데

상호관련 서브쿼리

update 문으로 수행하시오

(악성 SQL)

 

update emp e

set hiredate = (select hiredate from emp e

             where empno = e.deptno);

 

 

문제356.

emp09 loc 컬럼을 추가하고

해당사원의 부서위치로

값을 갱신하시오

 

alter table emp09

add loc varchar2(20);

 

merge into emp09 e09

 using dept d

on(e09.deptno = d.deptno)

when matched then

update set e09.loc= d.loc;

 

 

 

문제356.

(select )

이름, 나이, 순위(나이 많은 ) 출력하시오

select ename, age,

dense_rank()over(order by age desc) as "순위"

from emp2;

 

 

문제357.

우리반 테이블에 순위(rnk) 라는

컬럼을 추가하고

나이에 대한 순위로

값을 갱신하시오

 

alter table emp2

add rnk number(10);

 

 

merge into emp2 e2

 using (select ename, age,

       dense_rank()over(order by age desc) as "랭크"

       from emp2) aa

on ( e2.ename = aa.ename)

when matched then

update set e2.rnk =  aa.랭크

 

 

문제359.

우리반 테이블에 EMPNO 컬럼을 추가하고

번호를 1~27 갱신하시오

 

alter table emp2

add empno number(10);

 

update emp2

set empno =rownum;

 

 

참고

****

select rownum, ename, age

from emp2;

****

 

 

 

화면 캡처: 2018-10-29 오전 11:12

숨겨진 컬럼인데

순서에 따라 번호가 매겨져 있음.

 

 

**컬럼 추가는 무조건 뒤에 생성된다

만약 앞으로 오게 하고 싶으면???

 

 

문제360.

우리반 테이블에 empno 앞에

추가해서 만들려면 어떻게 해야 하는가?

 

일단 컬럼 삭제

alter table emp2

drop column empno;

 

 

create table emp2_backup7

 as

  select rownum as empno, e.*

   from emp2 e;

 

e.* >>>>>emp2 e 모든걸 갖고 오라는거

근데 그냥 * 하면 안되나?

create table emp2_bbb

as

select rownum as empno, * from emp2;

에러뜸.

이미  rownum as empno 먼저 썼기 때문에 * 값이 먹힌다.

전체값을 뽑기 위해서

테이블 별칭지정해서 e.* 해줘야

새로이 전체값을 뽑아라 라고 명령먹는다.

 

 

 

RENAME

■테이블 이름 변경 방법(rename)

 

rename emp2_backup7 to emp2;

 

 

문제362.

이상엽 학생 데이터를 우리반 테이블에

한건 입력하시오

 

insert into emp2
 select *

  from emp2

   where ename = '이상엽';

insert 입력

 

 

문제363.

우리반 테이블의 empno 다시

번호 순서대로 1~28까지

 

먼저 확인

select rownem, ename, age

from emp2

 

갱신

update emp2

set empno =rownum;

 

 

 

문제364.

우리반 테이블에 rnk 컬럼을 삭제하고

다시 rnk 컬럼을 추가한 후에

해당 학생의 나이에 대한 순위로

값을 갱신하시오

 

alter table emp2

 drop column rnk;

 

alter table emp2

 add rnk number(10);

 

merge into emp2 e1

using(select empno,

        dense_rank()over(order by age desc)순위

        from emp2) aa

on(e1.empno= aa.empno)     

when matched then

update set e1.rnk = aa.순위;

 

만약

on 절에

e1.ename= aa.ename 으로 하면

에러가 난다.

동명이인 있어서!!(이상엽 추가한거)

그래서 절대적, 유니크한

(중복, 없는)

사원번호로 해주는게 좋다.

 

 

 

건휘의 생각!

위의 SQL merge 문이 아니라

상호관련 update 문으로

수행하려면 어떻게 해야 할까(점심시간문제)

 

 

문제365.

순위(rnk) 컬럼의 데이터를 전부 null

변경하시오

 

update emp2

set rnk = null;

 

 

문제366

진철이의 나이의 순위가 어떻게 되는가?

select ename, age,

   dense_rank()over(order by age desc)

from emp2

where ename= '김진철';

 

이러면 1 나온다

(2 답임)

왜냐하면

조건절을 김진철로 지정했으니까.

실행순서도 select 보다

where 먼저니까.

 

랭킹 맞게 뽑으려면

 

select *

from

   ( select ename, age,

          dense_rank()over(order by age desc)순위

   from emp2)

where ename = '김진철'

 

 

문제367. (점심시간 문제)

진철이만 rnk 컬럼의 값을 갱신하시오

(update 하시오)

 

Update emp2 e

Set e.rnk=

  (SELECT r.순위 

    fROM

        (SELECT empno, age,

          rank() over (order by age desc)순위

          from emp2) r

   where e.empno=r.empno)

Where ename='김진철';

 

 

 

이건 merge

merge into emp2 aa

using (select empno, ename,

        dense_rank()over(order by age desc)순위

        from emp2) bb

on(aa.empno = bb.empno)

when matched then

update set aa.rnk = bb.순위

where ename='김진철' ;

 

 

 

 

-컬럼 변경 modify

컬럼 변경 alter/ modify

문제368.

우리반 테이블의 주소 컬럼의 데이터 타입이

무엇이고 길이가 어떻게 되는지 확인하시오!

 

desc emp2

 

 

 

화면 캡처: 2018-10-29 오후 1:51

 

 

문제369.

우리반 테이블의 주소 컬럼의 길이를

varchar2(100) ----> varchar2(200) 으로

변경하시오 !

 

alter table emp2

modify address varchar2(200);

 

desc emp2;

 

 

 

 

화면 캡처: 2018-10-29 오후 1:52

 

 

 

 

문제370.

위에 결과에서

다시 varchar2(200) -----> varchar2(100)

줄여보시오

 

alter table emp2

modify address varchar2(100);

 

 

 

문제371.

사원 테이블에 sal 컬럼을 감추시오

 

alter table emp

set unused column sal;

 

감추면 끝이다

다시 나타나게 없다;;;;;;;;

 

엄청 많은 자료 작업하는데

필요없는 컬럼 때문에

drop 시키고 다시 create 하면

오래 걸리고 부하 걸린다.

필요없는 컬럼 날리려고 set unused 쓴다.

 

 

alter table emp

 drop unused columns;

 

감춰놨던 컬럼을

날려버리는 작업이다.

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'sql' 카테고리의 다른 글

11-4. 데이터 조작 언어(계층형 질의문)  (0) 2019.03.31
11-3. 데이터 조작 언어(DCL문)  (0) 2019.03.31
11-1. 데이터 조작 언어(TCL문)  (0) 2019.03.30
11. 데이터 조작 언어(DML문)  (0) 2019.03.30
10. 집합연산자  (0) 2019.03.30