본문 바로가기

빅데이터과정/SQL

#6_140621_DB OBJECT

728x90

# DB OBJECT




l db object 5가지
1.     table
2.     view
3.     sequence
4.     synonym
5.     index


l view를 사용하는 이유 2가지
- 데이터의 보안을 위해서(특정 컬럼을 감추기 위해서)
- 복잡한 쿼리를 간단하게 하기 위해서

l view 생성
CREATE VIEW emp550
AS
SELECT empno,ename,sal,deptno


FROM EMP;



1. view


문제258. emp550 view king의 월급을 0로 변경하면 실제 테이블인 emp 테이블도 수정될까?

CREATE VIEW emp550
AS
SELECT empno,ename,sal,deptno
FROM EMP;

UPDATE emp550
SET sal=0
WHERE ename='KING';


è  가능하다


문제261. DALLAS에서 근무하는 사원들의 이름과 월급과 부서위치를 출력하는 VIEW를 생성하시오(VIEW 이름 : emp623)

CREATE VIEW emp623
as
SELECT e.ename, e.sal, d.loc
FROM EMP e, DEPT d
WHERE e.deptno=d.deptno AND d.loc='DALLAS';

SELECT * FROM emp623;



문제262. emp623 view의 이름이 scott 인 사원의 부서위치를 BOSTON 으로 변경하시오

UPDATE emp623
SET loc='BOSTON'
WHERE ename='SCOTT';
l 복합뷰이기 때문에 오류발생

문제263. 직업, 직업별 토탈월급을 출력하는데 view를 생성하시오(view 이름 : emp624)

CREATE VIEW emp624
AS
SELECT job, SUM(sal) 토탈월급
FROM EMP
GROUP BY job;
l 그룹함수가 포함되어 있으면 복합뷰이다.



문제264. 위에서 생성 emp624뷰를 수정하는데 직업이 SALESMAN의 토탈을 4500으로 수정하시오

UPDATE emp624
SET 토탈월급=4500
WHERE job='SALESMAN';


l 수정 불가능



2. CREATE OR REPLACE


문제265. 위에서 생성한 emp624 view를 수정하는데 부서번호, 부서번호별 인원수를 출력하는 쿼리로 수정하시오

CREATE OR REPLACE VIEW emp624
AS
SELECT deptno, COUNT(*) 인원수
FROM EMP
group BY deptno;


l CREATE OR REPLACE : 없으면 만들고 있으면 수정해라



3. WITH CHECK OPTION,  WITH READ ONLY


문제266. 부서번호가 20번인 사원들의 사원번호, 이름과, 월급, 부서번호를 출력하는 뷰를 생성하는데 부서번호 만큼은 다른 부서번호로 수정할 수 없도록 하시오

CREATE VIEW emp394
AS
SELECT empno, ename, sal, deptno
FROM EMP
WHERE deptno=20
WITH CHECK OPTION;

UPDATE emp394
SET deptno=30
WHERE ename='SCOTT';
l with check option을 사용하면 where 절에 기술한 조건을 다른 조건으로 수정할 수 없다.
l with read only는 모든 컬럼이 다 수정안됨


4. 시퀀스(SEQUENCE)

l 시퀀스(sequence) : 번호를 생성하는 db object
l 시퀀스 생성
CREATE SEQUENCE seq1
start WITH 1
INCREMENT BY 1
MAXVALUE 100;

SELECT SEQ1.NEXTVAL FROM dual;

start WITH : 시작번호
INCREMENT BY : 증가번호
MAXVALUE : 최대번호


문제267. 아래의 테이블을 생성하고 생성한 테이블의 empno에 숫자 데이터를 1~200번 까지 입력하는데1분 내로 하시오

CREATE TABLE emp552
(empno NUMBER(10));

CREATE SEQUENCE seq2
START WITH 1
INCREMENT BY 1
MAXVALUE 1000;

INSERT INTO emp552 VALUES(seq2.nextval);

BEGIN
FOR i IN 1..200 LOOP
INSERT INTO emp552 VALUES(seq2.nextval);
END LOOP;
END;
l PLSQL : 수작업 없이 한번에 가능



문제268. 위에서 생성한 seq2 시퀀스의 maxvalue 3000으로 수정하시오

ALTER SEQUENCE seq2
MAXVALUE 3000;

SELECT * FROM user_sequences;


l start with 는 변경 불가능



5. 동의어(SYNONYM)



일단 아래와 같이를 생성한다.

l 유저생성
CREATE USER smith
IDENTIFIED BY tiger;  (암호:tiger)
GRANT CONNECT, resource TO smith;


GRANT SELECT ON EMP TO smith  (select 권한을 부여하겠다 emp 테이블을 smith에게)



위와같이 생성후 smith에게 connect와 resource 권한과
select 권한을 넘긴다

그러면 아래와 같이 scott.emp 길게 써줘야 접근이 가능하다




CREATE PUBLIC SYNONYM EMP FOR SCOTT.EMP;
누구든지 접근가능하도록 public 으로 생성하고 scott.emp를 emp라고 부르겠다
dba들이 처음에 하는 작업
DROP PUBLIC SYNONYM EMP;


그러나 CREATE PUBLIC 문을 이용하면 간단하게 scott.emp를 emp로 단순하게 접근 가능하다



6. 인덱스


문제292. 사원테이블에 sal에 인덱스를 생성하시오

CREATE INDEX emp_sal
ON EMP(sal);



문제294. 월급이 3000인 사원의 이름과 월급을 출력하고 실행계획을 확인하시오

SELECT ename, sal
FROM EMP
WHERE sal=3000;







문제295. 인덱스를 삭제하고 다시 실행계획을 보시오

DROP INDEX emp_sal;







문제296. 연봉(sal*12) 36000인 사원의 이름과 연봉을 출력하시오

CREATE INDEX emp_sal
ON EMP(sal);

SELECT ename, sal*12 연봉
FROM EMP
WHERE sal*12=36000;
l where 절에서 인덱스 컬럼을 가공하면 index access가 안되고 full table scan 하게 된다.
l 튜닝후
SELECT ename, sal*12 연봉
FROM EMP
WHERE sal=36000/12;



문제297. 사원 이름에 index를 생성하고 이름이 SCOTT인 사원의 이름과 월급과 직업을 조회한후 실행계획을 확인하시오

CREATE INDEX emp_ename
ON EMP(ename);

SELECT ename, sal, job
FROM EMP
WHERE ename='SCOTT';

l 튜닝전
SELECT ename, sal, job
FROM EMP
WHERE Upper(ename)='SCOTT';

l 튜닝후
CREATE INDEX emp_ename_f
ON EMP(UPPER(ename));

SELECT ename, sal, job
FROM EMP


WHERE Upper(ename)='SCOTT';


'빅데이터과정 > SQL ' 카테고리의 다른 글

#7_140623_DROP  (0) 2014.07.14
포맷 및 함수  (0) 2014.07.10
#6_140621_일일과제  (0) 2014.07.10
#6_140621_제약(constraint)  (0) 2014.07.10
#6_140621_테이블 및 컬럼 이름 지정규칙  (0) 2014.07.10