본문 바로가기
국비교육/JAVA

1월 17일 국비교육

by Diligejy 2019. 1. 17.

#1

Q1. EMP 테이블을 사용해서 사원번호, 사원이름, 직업, 연봉, 부서번호를 가진 MYTEST02 TABLE을 만들자.


SQL> CREATE TABLE MYTEST02

  2  AS

  3  SELECT EMPNO, ENAME, JOB, (SAL*12 + NVL(COMM, 0)) YB FROM EMP;


Q2. MYTEST02 테이블의 사원번호에게 식별키를 지정하자.

ALTER TABLE MYTEST02 ADD CONSTRAINTS PK_MT PRIMARY KEY(EMPNO);


Q3. 사원이름을 NOT NULL 추가하자.

 ALTER TABLE MYTEST02 MODIFY ENAME NOT NULL;


Q4. DEPT -> MYDEPT로 생성한다.


SQL> CREATE TABLE MYDEPT

  2  AS

  3  SELECT * FROM DEPT;


Q5. MYDEPT에 DEPTNO에 식별키를 지정한다.


ALTER TABLE MYDEPT ADD CONSTRAINTS PK_MD PRIMARY KEY(DEPTNO);


Q6. MYTEST02 EMPNO와 MYDEPT의 DEPTNO를 참조시키자.


ALTER TABLE MYTEST02 ADD CONSTRAINTS FK_MT FOREIGN KEY(DEPTNO) REFERENCES MYDEPT(DEPTNO);


#2

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME

  2  FROM USER_CONSTRAINTS

  3  WHERE TABLE_NAME IN ('MYTEST02', 'MYDEPT');


#3


INSERT * FROM MYTEST;

INSERT INTO TABLE명 VALUES(,,,);

UPDATE TABLE명 SET COL = 변경값,,, WHERE,,,

DELETE FROM TABLE명 WHERE,,,


Q1. 부서번호가 30인 사원들의 직업을 MANAGER로 지정하고 커미션을 봉급의 20%로 지정하자.


SQL> UPDATE MYTEST SET JOB = 'MANAGER', COMM = SAL * 0.2

  2  WHERE DEPTNO = 30;


#4


#5

Q1. MYTEST의 부서번호 20번을 모두 삭제하자.

DELETE

FROM MYTEST

WHERE DEPTNO = 20;


Q2. MYTEST의 MANAGER를 찾아 모두 삭제하자.

DELETE 

FROM MYTEST

WHERE JOB = 'MANAGER';


Q3. EMP 테이블의 모든 자료를 MYTEST로 입력해보자.


INSERT INTO MYTEST SELECT * FROM EMP;


Q4. JONES의 월급보다 많이 받는 사원의 월급을 0으로 변경해보자.


SQL> UPDATE MYTEST

  2  SET SAL = 0

  3  WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'JONES');


Q5. 30번 부서의 평균 월급보다 적게 받는 사원의 봉급을 7000으로 변경하자.


SQL> UPDATE MYTEST

  2  SET SAL = 7000

  3  WHERE SAL < (SELECT AVG(SAL) FROM MYTEST WHERE DEPTNO = 30);


Q6. MYTEST의 DEPTNO 컬럼에 EMP 테이블의 DEPTNO값을 입력하자.


INSERT INTO MYTEST(DEPTNO) SELECT DEPTNO FROM EMP;


#6

1) 정의

- 다른 테이블이나 뷰에 포함된 맞춤 표현

- DESC VIEWS; 로 확인할 것

- 가상테이블이므로 메모리는 없음

- 하나 또는 하나 이상의 테이블 / 뷰에 포함된 데이터 부분 집합을 나타내는 논리적인 객체 -> 선택적인 정보 제공 가능

- 자체적으로 데이터를 포함하지 않는다(참조일 뿐)

- 베이스 테이블 : 뷰를 통해 보여지는 데이터를 포함하고 있는 실제 테이블


2) 명령어

ⓐ VIEW 생성 & 생성된 VIEW 조회

CREATE VIEW MY01

AS

SELECT * FROM EMP;


&


SQL> SELECT VIEW_NAME, VIEW_TYPE

  2  FROM USER_VIEWS;


ⓑ MYTEST 테이블을 EMP테이블로 이름 변경

 RENAME MYTEST TO EMP;


ⓒ VIEW 테이블의 이름을 MY01에서 MYVIEW로 변경

RENAME MY01 TO MYVIEW;


ⓒ - 1 사본 테이블에 컬럼을 추가하자.(ABC)

ALTER TABLE MYVIEW ADD(ABC NUMBER(2));

-> 오류발생(ORA-00942: 테이블 또는 뷰가 존재하지 않습니다)


ⓓ VIEW는 DML, DDL이 필요가 없음


ⓔ CREATE OR REPLACE

지정한 이름의 뷰가 없으면 새로 생성, 동일 이름이 있으면 OVERWRITE(덮어 쓰기)


ⓕ MYVIEW (DEPT 참조) 생성 & EMP 참조로 덮어쓰기

SQL> CREATE OR REPLACE VIEW MYVIEW

  2  AS

  3  SELECT * FROM DEPT;


&


SQL> CREATE OR REPLACE VIEW MYVIEW

  2  AS

  3  SELECT * FROM EMP;


ⓖ VIEW 생성구문 + SubQuery

CREATE OR REPLACE VIEW MYVIEW(사원의 이름, 사원의 번호, 근무지역)

AS

SELECT ENAME, EMPNO, LOC

FROM EMP JOIN DEPT USING(DEPTNO);


3) 제약조건

ⓐ 뷰의 원래 목적은 아니지만 뷰를 통한 DML 작업은 가능함

ⓑ DML 작업 결과는 베이스 테이블의 데이터 적용

ⓒ 뷰 생성 시 DML 작업은 제한 될 수 있음

ⓓ 


ⓔ WITH CHECK OPTION - 조건에 따라 INSERT/UPDATE 작업 제한(DELETE는 제한 없음) - 중요


ⓕ - 1 MYTEST 생성 뒤 원본에 기본키를 생성. 

ⓕ - 2 MYTEST_VIEW라는 VIEW 생성

ⓕ - 3 MYTEST_VIEW와 MYTEST의 CONSTRAINT 확인

ⓕ - 4 MYTEST_VIEW에 DATA INPUT


ⓕ - 1    

SQL> CREATE TABLE MYTEST

  2  AS

  3  SELECT * FROM EMP;


ⓕ - 2 

ALTER TABLE MYTEST ADD CONSTRAINT B1 PRIMARY KEY(EMPNO);


ⓕ - 3 

SQL> CREATE VIEW MYTEST_VIEW

  2  AS

  3  SELECT * FROM MYTEST;


SQL> SELECT CONSTRAINT_TYPE, CONSTRAINT_NAME

  2  FROM USER_CONSTRAINTS

  3  WHERE TABLE_NAME IN ('MYTEST_VIEW', 'MYTEST');


ⓕ - 4

INSERT INTO MYTEST_VIEW(ENAME) VALUES('111');

-> 오류발생 (ORA-01400: NULL을 ("BIGDATA"."MYTEST"."EMPNO") 안에 삽입할 수 없습니다)

-> 제약조건은 원본 테이블에서 찾으려고 함  


ⓕ - 5

INSERT INTO MYVIEW(사원이름) VALUES('아잉');

-> 오류발생 (ORA-01779: 키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다)


ⓕ - 6

SQL> CREATE OR REPLACE VIEW MYVIEW02

  2  AS

  3  SELECT ENAME, EMPNO, LOC

  4  FROM EMP JOIN DEPT USING(DEPTNO);


 INSERT INTO MYVIEW VALUES('ELE', 10, 'ENO');

-> 오류 발생( ORA-01779: 키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다)


이유 : DEPTNO를 기준으로 JOIN해주므로 READ ONLY가 됨. JOIN걸어버리면 READ ONLY!


3) InlIne View 개념

View Table도 Join이 가능하다.


ⓐ 예문

SQL> SELECT A.ENAME, A.SAL

  2  FROM EMP JOIN (SELECT * FROM EMP) A USING(EMPNO);


-> 빨간색 부분이 A라는 일회용 뷰가 되는 걸로 생각하면 쉬움 


SQL> SELECT EMP.ENAME 사원의이름, MGR.ENAME 매니저이름

  2  FROM EMP JOIN (SELECT * FROM EMP) MGR USING(EMPNO);


Q1. 사원의 이름과 월급을 출력하되 누적월급을 출력하자.

SQL> SELECT E.EMPNO, E.ENAME, E.SAL, SUM(D.SAL)

  2  FROM EMP E, (SELECT EMPNO, SAL FROM EMP) D

  3  WHERE E.EMPNO >= D.EMPNO

  4   GROUP BY E.EMPNO, E.ENAME, E.SAL

  5  ORDER BY SUM(D.SAL);


SQL> SELECT E.ENAME, M.ENAME

  2  FROM EMP E, (SELECT ENAME FROM EMP) M;

-> (SELECT ENAME FROM EMP)는 뷰로서 원하는 것만 가져오는 기능을 한다.


이 문장은

SELECT E.ENAME, M.ENAME

FROM EMP E, EMP M; 과 같음


4) 인라인 뷰 활용 : Top N 분석 구문

- 순번을 활용하려면 ROWNUM이 할당되기 전에 미리 정렬을 해야 함

- 미리 정렬된 결과를 가지고 있도록 하기 위해 인라인 뷰를 활용


SELECT * | SELECT_LIST

FROM (SELECT SELECT_LIST

    FROM    TABLE_NAME

    ...

    ORDER BY 기준 컬럼)

WHERE ROWNUM <= (또는 < ) N;


SELECT ROWNUM, ENAME, SAL

FROM EMP

ORDER BY 3;


Q1. EMP 테이블에서 위에서 3명만 출력하라

SELECT ROWNUM, ENAME, SAL 

FROM EMP

WHERE ROWNUM =<3;


Q2. EMP 테이블에서 월급의 상위 TOP 3만 출력하라.

SQL> SELECT K.ENAME, K.SAL

  2  FROM (SELECT ROWNUM AS NO, ENAME, SAL FROM EMP

  3  ORDER BY SAL DESC) K

  4  WHERE ROWNUM <=3;

'국비교육 > JAVA' 카테고리의 다른 글

외워야 할 목록  (0) 2019.01.21
1월 18일 국비교육  (0) 2019.01.18
1월 16일 국비교육  (0) 2019.01.16
1월 15일 국비교육 33일차  (0) 2019.01.15
1월 14일 국비교육 32일차  (0) 2019.01.14

댓글