본문 바로가기
카테고리 없음

ORACLE 8

by Real Iron 2007. 4. 2.

복습) DEPT 테이블에 54,재무부,NULL 입력하시오

SQL> INSERT INTO DEPT
  2  VALUES(54,'재무부',NULL)
  3  ;

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM DEPT;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 인사부         서울
        51 회계부         인천
        52 영업부
        53
        54 재무부


복습) DEPT 테이블에 54,재무부,NULL 삭제하시오

SQL> DELETE FROM DEPT
  2  WHERE DEPTNO = 54
  3  ;

1 행이 삭제되었습니다.



UPDATE

문법)
upodate 테이블명
set 컬럼명 = 새로운 값
[where 조건절];


예제) 53번 부서의 부서명을 '자재부'로 변경

SQL> UPDATE dept
  2  set dname = '자배부'
  3  where deptno=53
  4  ;

1 행이 갱신되었습니다.

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 인사부         서울
        51 회계부         인천
        52 영업부
        53 자배부


문제1)  지역이 불확실한 부서는 모두 대전으로 수정하시오.

SQL> update dept
  2  set loc = '대전'
  3  where loc is null;
               deptno in(52,53);
               deptno=52 or deptno=53
               deptno between 52 and 53
               dname in(52,53);
               dname=52 or deptno=53
               dname between 52 and 53
               loc is null
 
2 행이 갱신되었습니다.

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 인사부         서울
        51 회계부         인천
        52 영업부         대전
        53 자배부         대전

8 개의 행이 선택되었습니다.



문제2) emp 테이블의 7844 사원의 커미션을 500으로 수정하시오.
SQL> update emp
  2  set comm = 500
  3  where empno = 7844;

1 행이 갱신되었습니다.

SQL> select empno, ename, job , comm
  2  from emp;

     EMPNO ENAME      JOB             COMM
---------- ---------- --------- ----------
      7369 SMITH      CLERK
      7499 ALLEN      SALESMAN         300
      7521 WARD       SALESMAN         500
      7566 JONES      MANAGER
      7654 MARTIN     SALESMAN        1400
      7698 BLAKE      MANAGER
      7782 CLARK      MANAGER
      7788 SCOTT      ANALYST
      7839 KING       PRESIDENT
      7844 TURNER     SALESMAN         500
      7876 ADAMS      CLERK
      7900 JAMES      CLERK
      7902 FORD       ANALYST
      7934 MILLER     CLERK


문제3) 100번대 사원은 40번 부서로 배치시키고, 급여는 2900을 주세요.

SQL> update emp
  2  set deptno = 40, sal = 2900
  3  where empno between 140 and 143;

4 행이 갱신되었습니다.

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 82/12/09       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500        500         30
      7876 ADAMS      CLERK           7788 83/01/12       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10
       140 권덕용                                         2900                    40
       141 표희태                                         2900                    40
       142 정영선                                         2900                    40
       143 이성민                                         2900                    40




문제3) 142사원, 이성민사원은 급여를 3200으로 수정하시오.

SQL> update emp
  2  set sal = 3200                                   * 고난위도 - ford 와 같이 설정하라. 서브커리.
  3  where ename = '이성민' or empno = 142
  4  ;

2 행이 갱신되었습니다.

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 82/12/09       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500        500         30
      7876 ADAMS      CLERK           7788 83/01/12       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10
       140 권덕용                                         2900                    40
       141 표희태                                         2900                    40
       142 정영선                                         3200                    40
       143 이성민                                         3200                    40


문제3) 142사원, 이성민사원은 급여를 ford와 같이 수정하시오.

SQL> update emp
  2  set sal = (select sal from emp where ename = 'FORD')
  3  where ename= '이성민' or empno = 142;

2 행이 갱신되었습니다.

SQL> select ename, sal from emp;

ENAME             SAL
---------- ----------
SMITH             800
ALLEN            1600
WARD             1250
JONES            2975
MARTIN           1250
BLAKE            2850
CLARK            2450
SCOTT            3000
KING             5000
TURNER           1500
ADAMS            1100
JAMES             950
FORD             3000
MILLER           1300
권덕용           2900
표희태           2900
정영선           3000
이성민           3000



데이터 입력

개요
테이블에 데이터를 입력하기 위한 명령인 INSERT 명령문 사용
데이터 입력 방법
단일 행 입력 : 한번에 하나의 행을 테이블에 입력하는 방법
다중 행 입력 : 서브쿼리를 이용하여 한번에 여러 행을 동시에 입력하는 방법



단일 행 입력 방법
INTO 절에 명시한 칼럼에 VALUES 절에서 지정한 칼럼 값을 입력
INTO 절에 칼럼을 명시하지 않으면 테이블 생성시 정의한 칼럼 순서와 동일한 순서로 입력
입력되는 데이터 타입은 칼럼의 데이터 타입과 동일해야 함
입력되는 데이터의 크기는 칼럼의 크기보다 작거나 동일해야 함
CHAR, VARCHAR2, DATE 타입의 입력 데이터는 단일인용부호(‘’)로 묶어서 입력



테이블 생성

HEIGHT_INFO 테이블 생성

CREATE TABLE HEIGHT_INFO
(
SUDNO       NUMBER(5),
NAME        VARCHAR2(10),
HEIGHT     NUMBER(5)
);

HEIGHT_INFO 테이블 생성

CREATE TABLE WEIGHT_INFO
(
SUDNO       NUMBER(5),
NAME        VARCHAR2(10),
WEIGHT     NUMBER(5)
);



서브쿼리를 이용한 다중 행 입력 방법

-INSERT 명령문에서 서브쿼리 절을 이용
-INSERT 명령문에 의해 한번에 여러 행을 동시에 입력
-9i 버전 이후 부터
-unconditional INSERT ALL
-conditional INSERT ALL
-conditional FIRST INSERT


Unconditional INSERT ALL 명령문

-서브쿼리의 결과 집합을 조건 없이 여러 테이블에 동시에 입력
-서브쿼리의 컬럼 이름과 데이터가 입력되는 테이블의 칼럼이 반드시 동일해야 함
-ALL : 서브쿼리의 결과 집합을 해당하는 INSERT절에 모두 입력
-FIRST : 서브쿼리의 결과 집합을 해당하는 첫번째 INSERT절에 입력
-subquery : 입력 데이터 집합을 정의하기 위한 서브쿼리

문법)
INSERT ALL
          INTO 테이블명1 VALUES()
          INTO 테이블명2 VALUES()
                     ......
SUBQUERY;




문제1) STUDENT 테이블에서  STUDNO, NAME, HEIGHT, WEIGHT를 출력한것을
          HEIGHT_INFO 테이블에 STUDNO, NAME, HEIGHT 를 삽입,
          WEIGHT_INFO 테이블에 SRUDNO, NAME, WEIGHT를 삽입
          (GRADE가 2이상인 것에 한해서)


*SUBQUERY 내용
SQL> SELECT STUDNO, NAME, HEIGHT, WEIGHT, GRADE
  2  FROM STUDENT
  3  WHERE GRADE >=2;


INSERT ALL
        INTO HEIGHT_INFO VALUES( STUDNO, NAME, HEIGHT)
        INTO WEIGHT_INFO VALUES( STUDNO, NAME, WEIGHT)
SELECT STUDNO, NAME, HEIGHT, WEIGHT
  FROM STUDENT
  WHERE GRADE >=2;

   


Conditional INSERT ALL 명령문

- 서브쿼리의 결과 집합에 대해 WHEN 조건절에서 지정한 조건을 만족하는 행을 해당되는
   테이블에 각각 입력
- 서브쿼리에서 검색된 행을 만족하는 조건이 여러 개 일 경우 해당 테이블에 모두 입력
- ALL : WHEN~THEN~ELSE의 조건을 만족하는 서브쿼리의 모든 검색 결과를 입력하기 위한 옵션
- WHEN 조건절 THEN : 서브쿼리의 결과 집합에 대한 비교 조건
-서브쿼리의 결과 집합 중에서
   조건절1을 만족하는 결과 행은 table1에 입력,
   조건절 2을 만족하는 결과 행은 table2에 입력,
   그리고 어느 조건절도 만족하지 않는 행은 table3에 입력

문법)
INSERT ALL
    WHEN 조건1 THEN    // 조건1 만족하면 THEN 뒤의 내용을 실행
              INTO 테이블1 VALUES(~~~)

    WHEN 조건2 THEN    // 조건2 만족하면 THEN 뒤의 내용을 실행
              INTO 테이블2 VALUES(~~~)

   [ELSE                     //모든 조건이 만족하지 않으면 실행
              INTO 테이블3 VALUES(~~~)]

SUBQUERY;



문제1) HEIGHT_INFO, WEIGHT_INFO 테이블 데이터 삭제 - 문제 2을 확인하기 위해 먼저 실행

SQL> DELETE FROM WEIGHT_INFO;
SQL> DELETE FROM HEIGHT_INFO;


문제2) STUDENT 테이블에서  STUDNO, NAME, HEIGHT, WEIGHT를 출력한것을
          HEIGHT>170 이면
          HEIGHT_INFO 테이블에 STUDNO, NAME, HEIGHT 를 삽입,
          WEIGHT>70 이면
          WEIGHT_INFO 테이블에 SRUDNO, NAME, WEIGHT를 삽입
          (GRADE가 2이상인 것에 한해서)


  1  INSERT ALL

  2  WHEN HEIGHT>170 THEN
  3             INTO HEIGHT_INFO VALUES(STUDNO, NAME, HEIGHT)
  4  WHEN WEIGHT>70 THEN
  5             INTO WEIGHT_INFO VALUES(STUDNO, NAME, WEIGHT)

  6  SELECT STUDNO, NAME, HEIGHT, WEIGHT
  7  FROM STUDENT
  8 WHERE GRADE>='2'

10 개의 행이 만들어졌습니다.

SQL> SELECT * FROM HEIGHT_INFO;

     SUDNO NAME           HEIGHT
---------- ---------- ----------
     10101 전인하            176
     10202 오유석            177
     10105 임유진            171
     10204 윤진욱            171
     10107 이광훈            175

SQL> SELECT * FROM WEIGHT_INFO;

     SUDNO NAME           WEIGHT
---------- ---------- ----------
     10101 전인하             72
     10103 김영균             88
     10202 오유석             92
     10107 이광훈             92
     10108 류민정             72

SQL>



Conditional-First INSERT 명령문
- 서브쿼리의 결과 집합에 대해 WHEN 조건절에서 지정한 조건을만족하는 첫번째 테이블에
   우선적으로 입력하기 위한 명령문
- 서브쿼리의 결과 집합중에서 조건을 만족하는 첫 번째 WHEN절에서 지정한 테이블에만 입력하고
   나머지 WHEN절 무시

문법)
INSERT FIRST
    WHEN 조건1 THEN    // 조건1 만족하면 THEN 뒤의 내용을 실행
              INTO 테이블1 VALUES(~~~)

    WHEN 조건2 THEN    // 조건2 만족하면 THEN 뒤의 내용을 실행
              INTO 테이블2 VALUES(~~~)

   [ELSE                     //모든 조건이 만족하지 않으면 실행
              INTO 테이블3 VALUES(~~~)]

SUBQUERY;

문제1) STUDENT 테이블에서  STUDNO, NAME, HEIGHT, WEIGHT를 출력한것을
          HEIGHT>170 이면
          HEIGHT_INFO 테이블에 STUDNO, NAME, HEIGHT 를 삽입,
          WEIGHT>70 이면
          WEIGHT_INFO 테이블에 SRUDNO, NAME, WEIGHT를 삽입
          (GRADE가 2이상인 것에 한해서)


  1  INSERT FIRST

  2  WHEN HEIGHT>170 THEN
  3             INTO HEIGHT_INFO VALUES(STUDNO, NAME, HEIGHT)
  4  WHEN WEIGHT>70 THEN
  5             INTO WEIGHT_INFO VALUES(STUDNO, NAME, WEIGHT)

  6  SELECT STUDNO, NAME, HEIGHT, WEIGHT
  7  FROM STUDENT
  8 WHERE GRADE>='2'

7 개의 행이 만들어졌습니다.

SQL> SELECT * FROM HEIGHT_INFO;

     SUDNO NAME           HEIGHT
---------- ---------- ----------
     10101 전인하            176
     10202 오유석            177
     10105 임유진            171
     10204 윤진욱            171
     10107 이광훈            175

SQL> SELECT * FROM WEIGHT_INFO;

     SUDNO NAME           WEIGHT
---------- ---------- ----------
     10103 김영균             88
     10108 류민정             72