Quiet Time



■ 지난 금요일에 배운 내용 정리

  1. merge 문 
          튜닝전 : 상호관련 서브 쿼리를 이용한 update문장

          튜닝후 :1. merge
                       2.updatable join view


  • Query도 많이 하지만
  • 오라클 --------------> 하둡 이관 프로젝트가 많아
                     데이터 이행

예전 버전 오라클 ----------> 새로운 버전 오라클 
                      데이터이행
  1. 상호관련 서브 쿼리 

  • 다른 시간대에서의 데이터 관리
         ---------------------
               ↑
  우리나라와 시간대가 다른 나라에도 DB가 있고 거기에 데이터를 입력하고 불러와서 봐야할 때 알아야하는 기능
  • 5장 목차
  1. 날짜를 확인하는 오라클 키워드
  2. 날짜형 데이터 타입
  3. 날짜형 함수

  1. 날짜를 확인하는 오라클 키워드

우리가 여태 알았던 것은 SLECT SYSDATE FROM DUAL ;

SELECT CURRENT_DATE FROM DUAL;
  • 오늘날짜 + 현재시간 확인하는 방법

SELECT SYSTIMESTAMP FROM DUAL;

     2017/03/20 13:53:12 +09:00

영국의 그리니치 천문대가 0시라고하면 우리나라는 아침 9시 인것이다
  • 우리나라 서울의 시간대를 확인하려면 
select distinct tzame
from v$timezone_names
where lower(tzname) like '%seoul%';

Asia/Seoul

  • 영국 런던의 시간대를 알아내기 위한 나라 도시명 확인
select distinct tzname
  from v$timezone_names
where lower(tzname) like '%london%';

Europe/London
  • 영국이 지금 몇시인지 확인하고 싶다면?
select localtimestamp from dual;


문제489. 현재 세션의 시간대를 다시 영국/런던으로 변경하고 
          아래 두개의 쿼리 결과를 확인하시오

select systimestamp from dual;   -------> 시스템의 시간

select localtimestamp from dual; ---------> 데이터 베이스의 시간


          5.2 날짜형 data type

  1. date
  2. timestamp
  3. timestamp with timezone
  4. timestamp with local time zone


cretae table date_table
(
hiredate1 date,
hiredate2     timestamp,
hiredate3     timestamp with time zone
hiredate4     timestamp with local time zone );

insert into date_table
values (sysdate, systimestamp, localtimestamp, localtimestamp);

select * from date_table;






  1. months_between
  2. add_months
  3. next_day
  4. last_day
  5. extract
  6. to_yminterval
  7. to_dsinterval
  8. to_timestamp

select extract( year from sysdate) from dual;

문제490. 이름, 입사한 년도를 출력하시오 !

select ename, extract( year from hiredate) from emp;

문제491. 입사한 년도, 입사한 년도별 토탈 월급을 출력하시오 !
select extract( year from hiredate), sum(sal)
from EMP
group by extract( year from hiredate);

문제492. ALLEN이 입사한 달은 출력하시오 
select extract( MONTH from hiredate)
FROM EMP
WHERE ENAME = 'ALLEN';

문제493. 11일에 입사한 사원들의 이름과 입사일을 출력하시오 
select ENAME , from hiredate
FROM EMP
WHERE extract( DAY from hiredate) = 11;

문제494. 오늘부터 100달 뒤의 날짜를 출력하시오!

SELECT ADD_MONTHS(SYSDATE,100)
FROM DUAL;

문제495. 오늘부터 1년 2개월 후의 날짜를 출력하시오 !

SELECT ADD_MONTHS(SYSDATE,14)
FROM DUAL;


SELECT SYSDATE + TO_YMINTERVAL('01-02')
FROM DUAL;

문제496. 오늘부터 100일 10시간이 지난후의 날짜를 출력하시오 !

SELECT SYSDATE + TO_DSINTERVAL('100 10:00:00')
FROM DUAL;





          5.3 날짜형 함수 
  1. months_between
  2. add_months
  3. next_day
  4. last_day
  5. extract
  6. to_yminterval
  7. to_dsinterval
  8. to_timestamp

2017-03-20 오후 2:49
문제497. 아까 2시 30분쯩에 emp 테이블의 king의 데이터가 무엇이었는지 확인하시오

select * from emp as of timestamp to_timestamp('2017/03/20 14:30:00', 'RRRR/MM/DD HH24:MI:SS')
WHERE ENAME = 'KING';


■ 6장. 서브쿼리에서의 데이터 검색
  • 6장 목차
  1. MULTIPLE COLUMN SUBQUERY
  2. SCALAR SUBQUERY
  3. 상호관련 서브쿼리 - SELECT 문
  4. 상호관련 서브쿼리 DML 문
  5. EXISTS 문 NOT EXISTS 문
  6. WITH 절

6.1 MULTIPEL COLUMN SUBQUERY 

  • SUBQUERY 의 종류 3가지
  1. SINGLE ROW SUBQUERY
  2. MULTIPEL ROW SUBQUERY
  3. MUTIPEL COLUMN SUBQUERY
                    - PAIR WISE 방식
                    - NON PAIR WISE 방식

문제498 . 직업이 SALESMAN 인사원들과 월급이 같은 사원들의 이름과 월급을 출력하시오 !


SELECT ENAME, SAL 
  FROM EMP 
WHERE SAL IN ( SELECT SAL
                         FROM EMP 
                         WHERE JOB = 'SALESMAN');

문제499. 직업이 SALESMAN 인 사원들과 월급도 같고 그리고 커미션도 같은 사원들의 이름과 월급과 커미션을 출력하시오


UPDATE EMP
SET SAL = 2500,
WHERE ENAME = 'SMITH';

UPDATE EMP
SET COMM = 1400
WHERE ENAME = 'SMITH';


[ NON PAIR WISE]
SELECT ENAME, SAL
  FROM EMP
WHERE SAL IN ( SELECT SAL
                         FROM EMP
                         WHERE JOB = 'SALESMAN')
AND COMM IN ( SELECT COMM
                         FROM EMP
                         WHERE JOB = 'SALESMAN');



[PAIR WISE]

SELECE ENAME, SAL ,COMM
  FROM EMP
WHERE (SAL, COMM) IN (SELECT SAL,COMM
                                        FROM EMP
                                        WHERE JOB = 'SALESMAN');



설명 : PAIRWISE 방식은 그 월급에 그 커미션이어야 데이터가 검색이 되는데 
NON PAIR WISE 방식은 직업이 SALESMAN 인 사원들의 월급중에서 하나만 같기만 함녀 되고 커미션하나만 같아도

출력되는 방식이다.
PAIR WISE
3200    300
2500    500
2500    1400
3000  

PAIR WISE 방식            VS    NON PAIR WISE 방식

(1000, 250)                             (1000, 250)
(2000, 100)                             (1000, 100)
(4000, 300)                             (1000, 300)
(2400, 150)                             (1000, 150)
                                              (1000, 250)
                                              (1000, 100)
                                              (1000, 100)
                                              (1000, 300)
                                                    :
                                                    :

문제500. 나이가 30대인 학생들과 전공이 같고 통신사가 같은 학생들의 이름과 나이와 전공을 출력하시오

 [NON PAIR WISE]
SELECT ENAME,AGE,MAJOR
  FROM EMP2
WHERE TELECOM IN (SELECT TELECOM
                    FROM EMP2
                    WHERE AGE >=30)
AND MAJOR IN ( SELECT MAJOR
                         FROM EMP2
                     WHERE AGE >=30);


[PAIR WISE] (...... , .....) 이로케 세트로 같아야 해영!!!
SELECT ENAME,AGE,MAJOR
  FROM EMP2
WHERE (TELECOM,MAJOR) IN (SELECT TELECOM  ,MAJOR
                    FROM EMP2
                    WHERE AGE >=30);


6.1 SCALAR SUBQUERY
  • SELECT 절에서 SUBQUERY를 쓸 수 있는 절
SELECT           -- SCALAR SUBQUERY
FROM             -- IN LINE VIEW
WHERE           -- SUBQUERY 
GROUP BY       --X
HAVING           ---SUBQUIERY 
ORDER BY       --- SCALAR SUBQUERY

  • SCALAR SUBQUERY의 특징 ? 딱 하나의 값만 리턴한다

문제501. 사원이름, 월급, 사원 테이블의 최대월급,
                                        사원 테이블의 최소월급,
                                        사원 테이블의 토탈 월급을 출력하시오.


  • 분석함수 사용하지 않은 SQL
SELECT ENAME, SAL,    (SELECT MAX(SAL) FROM EMP ) 최대,
                      (SELECT MIN(SAL) FROM EMP ) 최소,
                      (SELECT SUM(SAL) FROM EMP ) 토탈
  FROM EMP;  --29개 블락읽음

  • 분석함수 사용한 SQL

SELECT ENAME, SAL , MAX(SAL) OVER (),
                    MIN(SAL) OVER (),
                    SUM(SAL) OVER()
FROM EMP;  -- 7개 블락 읽음


읽은 블락 확인 TRACE METHOD

PLAN 페이지 열기


OPTION -> TRACE METHOD -> LOCAL FILE (CHECK)



하나의 SQL만 넣고 F9 하하호호


EMP테이블 4번셀렉트

SQL 튜닝

SELECT ENAME, SAL , (SELECT MAX(SAL),MIN(SAL),SUM(SAL) FROM EMP)
FROM EMP;
SELECT ENAME,SAL (SELECT MAX(SAL)||MIN(SAL)||SUM(SAL) FROM EMP)
FROM EMP;


SELECT ENAME, SUBSTR(TOTAL,1,4) AS "MAX(SAL)" , SUBSTR(TOTAL,5,7) AS "MIN(SAL)", SUBSTR(TOTAL,8) AS "SUM(SAL)"
FROM (
SELECT ENAME,SAL, (SELECT MAX(SAL)||MIN(SAL)||SUM(SAL) FROM EMP) AS TOTAL
FROM EMP);

Call     Count CPU Time Elapsed Time       Disk      Query    Current       Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse        1    0.000        0.000          0          0          0          0
Execute      1    0.000        0.000          0          0          0          0
Fetch        2    0.000        0.000          0         15          0         14
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total        4    0.000        0.000          0         15          0         14


문제502. 아래의 결과에서 최대월급, 최소월급 , 토탈월급 만 살라대려면 어떻게 해야하는가?

SELECT ENAME,
       SUBSTR(TOTAL, 1, 4) AS "MAX(SAL)" ,
       SUBSTR(TOTAL, 5, 3) AS "MIN(SAL)",
       SUBSTR(TOTAL, 8) AS "SUM(SAL)"
  FROM (SELECT ENAME,
               SAL,
               (SELECT MAX(SAL)||MIN(SAL)||SUM(SAL)
                  FROM EMP) AS TOTAL
          FROM EMP);  --15개 블락 읽음

LPAD를 이용해서 좀더 쉽게 잘라보자!

select ename,
       substr(total, 1, 10) as 최대,
       substr(total, 11, 10) as 최소,
       substr(total, 21, 10) as 토탈
  from(select ename,
               sal,
               (select LPAD(max(sal), 10) || LPAD(min(sal), 10) || LPAD(sum(sal), 10)
                  from emp) as total
          from emp);  -- 15개 블락 읽음


문제503. 이름,나이, 우리반 최대나이,
                              우리반 최소나이,
                              우리반 평균나이를 출력하시오!

SELECT ENAME, AGE, MAX(AGE) OVER (),
                   MIN(AGE) OVER (),
                   AVG(AGE) OVER ()
FROM EMP2; ---3블락


select ename,
       substr(total, 1, 10) as 최대,
       substr(total, 11, 10) as 최소,
       substr(total, 21, 10) as 토탈
  from(select ename,
               AGE,
               (select LPAD(max(AGE), 10) || LPAD(min(AGE), 10) || LPAD(sum(AGE), 10)
                  from emp2) as total
          from emp2); --7 블락

■ 6장. 서브쿼리에서의 데이터 검색
      • 6장 목차
      1. MULTIPLE COLUMN SUBQUERY
      2. SCALAR SUBQUERY
      3. 상호관련 서브쿼리 - SELECT 문
      4. 상호관련 서브쿼리 DML 문
      5. EXISTS 문 NOT EXISTS 문
      6. WITH 절

6.3 상호관련 서브쿼리 SELECT 문장 

문제504. 이름, 월급, 부서번호, 부서위치를 출력하시오 
               (조인으로 수행)


SELECT E.ENAME, E.SAL, E.DEPTNO, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

문제505. 위의 결과를 SCALAR SUBQUERY 를 써서 수행하시오!

SELECT ENAME, SAL, DEPTNO, (SELECT LOC
        FROM DEPT
        WHERE DEPTNO = E.DEPTNO ) LOC
FROM EMP E;  -- 11블락



-- 스칼라 서브 쿼리
SELECT ENAME, SAL, DEPTNO, (SELECT LOC
                            FROM DEPT
                            WHERE DEPTNO = E.DEPTNO ) LOC
FROM EMP E; --13블락

문제506. 아래의 SQL을 분석함수를 사용하지 않고 SCALAR SUBQUERY 로 튜닝하시오 

SELECT ENAME,SAL,DEPTNO,   (SELECT MAX(SAL) FROM EMP WHERE DEPTNO=E.DEPTNO ) 최대,
                           (SELECT MIN(SAL) FROM EMP WHERE DEPTNO=E.DEPTNO ) 최소,
                           (SELECT SUM(SAL) FROM EMP WHERE DEPTNO=E.DEPTNO ) 토탈,
                     ROUND((SELECT AVG(SAL) FROM EMP WHERE DEPTNO=E.DEPTNO ),2)평균
  FROM EMP E
  ORDER BY DEPTNO;  --91블락
-- 분석함수에서 못하는 where절을 쓸 수있어


SELECT e.ename,
       sal,
       e.deptno,
       substr(ap,1,10) "max(sal)",
       substr(ap,11,10) "min(sal),",
       substr(ap,21,10) "sum(sal)",
       substr(ap,31,10) "avg(sal)"
  FROM emp e,
       (SELECT deptno,
              (SELECT lpad(max(sal), 10)|| lpad(min(sal), 10)|| lpad(sum(sal), 10)|| lpad(avg(sal), 10)
                FROM emp d
               WHERE d.deptno = s.deptno
               GROUP BY deptno
              ) ap
         FROM emp s
        GROUP BY deptno
       ) a
 WHERE e.deptno = a.deptno
ORDER BY deptno ; -- 35블락 -- 35블락



SELECT ENAME,SAL,DEPTNO,    MAX(SAL) over (partition by deptno) 최대,
                           MIN(SAL) over (partition by deptno)  최소,
                            SUM(SAL) over (partition by deptno) 토탈,
                      round(AVG(SAL) over (partition by deptno),2)평균
  FROM EMP E
  ORDER BY DEPTNO; --7블락

 
SQL 튜너 -- 굵직한 사례들을 암기 


■ 어제까지 배운 내용 복습
  1. flashback version Query
"특정 테이블의 data가 어떻게 변경되어왔는 이력 정보 "
  1. merge문으로 새로운 data를 입력하는 문자
  2. 날짜형 데이터 타입
    1. date
    2. timestamp
    3. timestamp with timezone
    4. timestamp with local time zone
          5.3 날짜형 함수 
  1. months_between
  2. add_months
  3. next_day
  4. last_day
  5. extract
  6. to_yminterval
  7. to_dsinterval
  8. to_timestamp



■ 6장. 서브쿼리에서의 데이터 검색
  • 6장 목차
  1. MULTIPLE COLUMN SUBQUERY
      • SUBQUERY 의 종류 3가지
      1. SINGLE ROW SUBQUERY
      2. MULTIPEL ROW SUBQUERY
      3. MUTIPEL COLUMN SUBQUERY
        1. - PAIR WISE 방식     ===> 오라클에 지원하는 방식
        2. - NON PAIR WISE 방식 ===> 오라클 , non 오라클 db지원
  2. SCALAR SUBQUERY
  3. 상호관련 서브쿼리 - SELECT 문
  4. 상호관련 서브쿼리 DML 문
  5. EXISTS 문 NOT EXISTS 문
  6. WITH 절