복습) 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