본문 바로가기

DB/ORACLE

220830_ORACLE_국비_ROWNUM/DDL/CREATE/ALTER/DROP

 

 

 

<'WARD'가 있다면 모든 사원 출력>

exists : 중복이 없다는 가정하에 조건을 충족하는 값을 찾았을때 바로 검색을 중지하는 함수

 

 

3. 다중컬럼 SUB Query

<부서별 가장 높은 급여를 받고 있는 사원 출력>

 

 

4. ROWNUM

  • SUB Query에서 반환되는 각행 1부터 시작하는 순차값 할당

 

<emp테이블에서 월급이 높은 사람이 먼저 출력되고 순번 추가>

 

rownum과 order by함께 사용할때 주의사항 : order by절을 먼저 수행하고 rownum이 수행되게 해야함

                                                                        그렇지 않으면 순번이 랜덤으로 정렬됨

 

 


DDL(Data Definition Language)

  • 데이터 정의어, 테이블 구조생성, 변경 및 삭제
  • DDL을 사용하면 자동 COMMIT
종류 의미
CREATE 데이터베이스 객체 생성
DROP 데이터베이스 객체 삭제
RENAME 데이터베이스의 이름 변경
ALTER 기존 데이터베이스 객체 다시 정의
TRUNCATE 테이블 최초 생성 상태로 만들며
ROLLBACK 불가능

 

 

1. CREATE TABLE

  • 새로운 테이블 생성
  • 형식 : create table table_name(
                컬럼명1 데이터타입1,
                컬럼명2 데이터타입2,
                  );
  • 식별자(컬럼명이나 테이블명)
    1. 반드시 문자로 시작
    2. oracle에서 사용되는 예악어나 다른 객체명과 중복 불가
    3. A~Z 대소문자, 0~9까지의 숫자, 특수기호('_', '$', '#')만 포함 가능
    4. 최대 30글자까지 가능
    5. 공백 불가

 

<empno, ename, sal을 컬럼명으로 하는 TEST1테이블 생성>

 

TEST1 테이블 확인가능

 

<insert into를 통해 TEST1테이블에 레코드 생성(삽입)>

 

레코드 생성 확인가능

 

 

  • SUB Query로 테이블 생성

<emp테이블을 이용해 emp_01테이블 생성>

 

복사 확인가능

권한은 복사되지 않고 값만 복사됨

 

 

<emp구조는 그대로 복사하되, 레코드 없이 테이블 생성>

 

where절에  참이 되지 않는 값을 넣음으로써 레코드 없이 테이블 구조만 생성가능

 

<emp_05에 emp레코드 삽입>

 

 

 

  • ROWID
  • 테이블에서 행의 위치를 지정하는 논리적인 주소 값
  • 특징 : 중복되지 않는 유일한 값
              특정 레코드에 랜덤으로 접근하기 위해 주로 사용
              테이블 내부에서 자동으로 생성됨
  • 형태( 총 80bit / 10byte)
32bit 10bit 22bit 16bit
000000 FFF BBBBB RRR
데이터객체번호 상대적파일번호 블럭번호 행번호

 

 

<emp테이블의 이름, 월급의 rowid확인>

 

 

2. ALTER TABLE

  • 테이블 구조 변경
  • 구조변경 : 컬럼 추가(ADD), 삭제(DROP), 수정(MODIFY)
  • 형식 :   alter table table_name
               추가  : add((컬럼명1 자료형1), (컬럼명2 자료형2) ...);
               삭제  : drop column ((컬럼명1 자료형1), (컬럼명2 자료형2) ...);
               수정  : modify((컬럼명1 자료형1), (컬럼명2 자료형2) ...);
  • 컬럼명 추가 시 : 원하는 위치에 삽입 불가, 새로운 컬럼은 테이블 마지막에 추가
                              이미 이전에 추가한 행이 존재한다면 컬럼은 추가되지만 컬럼값은 null으로 입력
  • 컬럼명 변경 형식 : alter table table_name
                                  rename column 기존 컬럼명  to 새로운 컬럼명;

 

<emp_06 테이블에서 sal number(5) 컬럼 추가>

 

 

 

<emp_06 테에블에서 sal의 자료형 변경>

 

 

 

<emp_06 테이블의 sal 컬럼 삭제>

 

 

 

<emp_01 테이블에서 sal의 자료형 변경>

 

자료형 변경 - 레코드가 있을경우 :  축소 불가 / 확대 가능

 

 

<emp_01 테이블에서 sal 컬럼 삭제>

 

레코드의 유무에 상관없이 삭제가능

 

 

<emp_03 테이블에 mgr number(4) 추가>

 

 

 

  • SET UNUSED : 사용을 논리적으로 제한 , 실제로 삭제하지 않음
  • 사용 :  컬럼을 삭제하는동안(시간↑) 다른 사용자가 해당 컬럼을 사용하려고 하면 테이블이 사용되고 있기 때문에 다른 사용자는 해당 테이블 사용불가, 이럴 경우 작업이 LOCK 발생 → SET UNUSED(시간↓) 는 LOCK 발생하지 않음

 

<emp_03 테이블에서 sal 컬럼 set unused >

 

 

 

 

 

<emp_03 테이블의 ename컬럼명을 koread로 변경>

 

변경 후)

3. DROP TABLE

  • 기존 테이블 제거
  • 테이블 삭제, 무결성 제약 조건
    삭제하고자 하는 테이블의 기본키나 고유키를 다른 테이블에서 참조해 사용하는 경우 삭제 불가
    → 삭제하고자 한다면 참조하는 테이블 제거 후 해당 테이블 삭제
  • 형식 :  drop table table_name

 

<test1 테이블 삭제>

삭제 전)

 

삭제)

 

삭제 후)

BIN$~ : 복구용 테이블

 

<test1 복구>

 

복구 후)

flashback table table_name to before drop : 복구용 테이블 삭제

 

 

<drop 후 테이블명을 모를 때>

show recyclebin : drop 후 휴지통에 있는 테이블명 조회 가능 

 

 

<복구용 테이블 삭제>

 

삭제 후)

purge recyclebin : 복구용 테이블 모두 삭제

 

 

<emp_05 테이블 복구용 테이블 생성하지 않고 삭제>

 

삭제 후)

PURGE를 사용해 복구용 테이블 생성 없이 삭제 가능

 

 

4. TRUNCATE TABLE

  • 테이블의 모든 레코드 삭제
  • 형식  : truncate table table_name

 

<emp_02 테이블의 레코드 삭제>

 

 


 

 

<예제>

- 다중행 SUB Query-

<이름에 'T'를 포함하고 사원들과 같은 부서에서 근무하는 사원의 이름, 사원번호, 부서번호 출력>

방법1_like)

 

방법2_instr)

 

 

<평균급여보다 많고 이름에 'S'가 들어가는 사원과 동일한 부서에서 근무하는 사원의 이름, 급여, 부서번호 출력>

 

 

<영업사원의 최대급여보다 많이 받는 사원의 이름, 직급, 급여 출력/ 단, 영업사원은 제외>

방법1_다중행 SUB Query)

 

방법2_ 단일행 SUB Query)

 

 

<10번과 20번 부서의 근무하는 사원들의 평균 급여보다 많이 받는 사원의 이름, 급여, 부서번호 출력>

 

 

<단일행 SUB Querty/'WARD'와 동일한 job을 가진 사원의 이름, 직급 출력>

 

 

<'MANAGER'인 사원들이 받는 최소급여보다 많이 받는 사원들의 이름, 급여, 부서번호를 출력하되,

부서번호가 20번인 사원 제외>

방법1_다중행 SUB Query)

 

방법2_단일행 SUB Query)

 

 

- ROWNUM -

<emp테이블에서 최상위 소득자 3명의 이름, 급여 출력>

 

 

<'SALES'부서의 모든 사원의 이름, 급여 출력하되, 월급이 높은 사람이 먼저 출력되고 순번 추가>

 

 

- CREATE TABLE -

<30번 부서만 있는 emp_02 테이블 생성>

 

 

 

<부서번호가 30번인 사원 이름, 부서명, 근무지, 월급인 테이블 생성>

 

 

 

<월급이 1500이상인 사원의 이름, 월급, 입사일인 테이블 생성>

 

 

 

<dept테이블의 동일한 구조의 dept_01테이블을 생성>

 

 

<dept_01테이블에 dept레코드 삽입>

 

 

 

<테이블명 : emp_06
  컬럼명  :  empno number(4) / ename varchar(20) / job varchar(16) / deptno number(2)  생성>

 

 

 

<dept를 복사한 dept_05 생성해
    1. tel varchar(30) 컬럼 추가
    2. dname컬럼 크기를 varchar2 크기 35로 변경

   3. loc 컬럼명을 '근무지'로 변경 >