오라클 관리용 쿼리 정리
http://maktub.tistory.com/22
오라클 단편화 처리
http://theone79.tistory.com/48
오라클 속도저하 고찰
http://www.sqler.com/113109
오라클 속도저하 문제 추출
http://www.oracle.com/technology/global/kr/pub/columns/dbtuning.html
오라클 모니터링 쿼리 모음
http://sjunious.egloos.com/3646080
오라클 테이블 크기 확장 방법
http://www.koug.net/xe/3504
http://www.oracleclub.com/lecture/1096
오라클 테이블 스페이스 정보 확인
http://www.koug.net/xe/3502
오라클 튜닝 단계
http://www.koug.net/xe/3495
오라클 테이블 스페이스 및 파일 관리
http://outspace.egloos.com/2246119
오라클 개발자가 범하기 쉬운 튜닝이슈 10가지
http://blog.naver.com/tosaymin/30018902426
오라클 단편화와 재구성
http://www.oracle.com/technology/global/kr/deploy/availability/htdocs/fragment.html
AND

1.NullとEmptyの違い
  ORACLE : EmptyとNullを曖昧に判断する。
  SQLSERVER : EmptyとNullを明確に判断する。
2.Nullのソート順
  ORACLE : 昇順で、Null値は最後に配置される。
  SQLSERVER : 昇順で、Null値は先頭に配置される。
3.Null置き換え関数
  ORACLE : Nvl(Field,Value)
  SQLSERVER : IsNull(Field,Value)
4.Trim
  ORACLE : Trim存在する。
  SQLSERVER : RTrim/LTrimならある。
5.左文字詰め('0'埋めだと)
  ORACLE : LPAD([文字列],38,'0')
  SQLSERVER : REPLICATE('0',38-DATALENGTH([文字列]))+[文字列]
6.ロック(占有ロックとの事。。)
  Oracle : FOR UPDATE
  SQLSERVER : (UPDLOCK)
7.文字型→日付型変換
  ORACLE : TO_DATE('2000/01/01 10:20:30','yyyy/mm/dd hh24:mi:ss')
  SQLSERVER : CONVERT ( datetime,'2000/01/01 10:20:30',120)
8.日付型→文字型変換
  ORACLE : TO_CHAR(更新日時,'YYYYMMDD')
  SQLSERVER : CONVERT(varchar,更新日時,112)
9.システム日付
  ORACLE : SYSDATE(current_timestampも使えたが、グリニッジっぽい値になってしもうた。なぜ?)
  SQLSERVER : current_timestamp
10.文字列切り出し
  ORACLE : SELECT SUBSTR([文字列],2,2) FROM DUAL
  SQLSERVER : SELECT SUBSTRING([文字列],2,2)
11.数値→文字列変換
  ORACLE : TO_CHAR([文字列])
  SQLSERVER : 数値から文字型であれば、暗黙の変換で大丈夫。
        (明示的に書くならば、CAST or CONVERT使用)
12.文字列連結  
  ORACLE : ||
  SQLSERVER : +
13.JOIN時のテーブル別名
  ORACLE : 無くても動いた。。。
  SQLSERVER : テーブル別名必須っぽい?(UNIONにも必要とは。。)
14.EMPTY→数値型の更新について。
  ORACLE : EMTPY→数値型へ更新が可能。Nullの扱いとなる。
  SQLSERVER : EMPTY→数値型へ更新が不可。数値変換エラーとなる。
15.余分な0が付加される。(ドライバのせい?)
  ORACLE : NUMBER(15,5)型から数値1を、SELECTすると結果は、"1"
  SQLSERVER : NUMERIC(15,5)型から数値1を、SELECTすると結果は、"1.00000"
16.それぞれの予約語に注意。。  

 
출처 : http://b.drmg.net/archives/cat_279301.html

AND

DB질문용

DB 2007. 3. 19. 20:34
사용자 삽입 이미지
AND

프로젝트 순서

DB 2007. 3. 6. 16:15
프로젝트 순서
1.프로젝트 주제 선정
2.프로젝트의 데이터 흐름
(2~3 2일)
3.DB(table)스키마 작성
4.화면(페이지) Flow Chart 작성(1일)
5.개발(2주)
6.기능별 테스트(6~7 1주)
7.종합취합 테스트
8.발표
AND

SQL 함수의 분류와 정리

  * 10g 기준, 총 259개
   (그룹함수와 분석함수를 각각 따로 계산, CORR_, STATS_T_TEST_로 시작하는 함수들을 각각 하나로
    계산할 경우)
  * 붉은색으로 표시된 함수의 이름을 클릭하면 함수에 대한 설명을 볼 수 있다.


  1. Single-Row Functions (단일행함수)

  단일행함수는 조회되는 table이나 view의 모든 행에 대해서 단일행만을 반환한다.
  select-list나, where절, start with절, connect by절,having절에 나올 수 있다.

    Numeric Functions (수치함수)

    수치함수는 수치값을 입력받고 수치값을 반환한다.
    number 타입의 수치값을 반환하는 대부분의 수치함수는 38자리의 정밀도(유효숫자)를 갖는다.
    초월함수인 COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, TANH는 36자리의 정밀도를 갖는다.
    ACOS, ASIN, ATAN, ATAN2는 30자리의 정밀도를 갖는다.

      ABS
      ACOS
      ASIN
      ATAN
      ATAN2
      BITAND
      CEIL
      COS
      COSH
      EXP
      FLOOR
      LN
      LOG
      MOD
      NANVL
      POWER
      REMAINDER
      ROUND (number)
      SIGN
      SIN
      SINH
      SQRT
      TAN
      TANH
      TRUNC (number)
      WIDTH_BUCKET

    Character Functions Returning Character Values (문자값을 반환하는 문자함수)

    입력되는 값이 char, varchar2 타입으로 주어질 경우, 반환되는 값은 varchar2 타입이다.
    입력되는 값이 nchar, nvarchar2 타입으로 주어질 경우, 반환되는 값은 nvarchar2 타입이다.

    함수에 의해 반환되는 값의 길이는 반환되는 값의 datatype의 최대길이를 넘지 못한다.
    반환되는 char, varchar2 타입의 값이, 허용되는 최대치를 초과할 경우, 초과되는 부분을
    잘라내고 값을 반환한다.

      CHR
      CONCAT
      INITCAP
      LOWER
      LPAD
      LTRIM
      NLS_INITCAP
      NLS_LOWER
      NLSSORT
      NLS_UPPER
      REGEXP_REPLACE
      REGEXP_SUBSTR
      REPLACE
      RPAD
      RTRIM
      SOUNDEX
      SUBSTR
      TRANSLATE
      TREAT
      TRIM
      UPPER

    NLS Character Functions (National Language Support 함수)

    character set에 관한 정보를 반환한다.

      NLS_CHARSET_DECL_LEN
      NLS_CHARSET_ID
      NLS_CHARSET_NAME

    Character Functions Returning Number Values (수치값을 반환하는 문자함수)

      ASCII
      INSTR
      LENGTH
      REGEXP_INSTR

    Datetime Functions (시간함수)

    시간함수는 다음과 같은 3가지 datatype을 가지고 계산을 한다.
    date (date)
    timestamp (timestamp, timestamp with time zone, timestamp with local time zone)
    interval (interval day to second, interval year to month)

      ADD_MONTHS
      CURRENT_DATE
      CURRENT_TIMESTAMP
      DBTIMEZONE
      EXTRACT (datetime)
      FROM_TZ
      LAST_DAY
      LOCALTIMESTAMP
      MONTHS_BETWEEN
      NEW_TIME
      NEXT_DAY
      NUMTODSINTERVAL
      NUMTOYMINTERVAL
      ROUND (date)
      SESSIONTIMEZONE
      SYS_EXTRACT_UTC
      SYSDATE
      SYSTIMESTAMP
      TO_CHAR (datetime)
      TO_TIMESTAMP
      TO_TIMESTAMP_TZ
      TO_DSINTERVAL
      TO_YMINTERVAL
      TRUNC (date)
      TZ_OFFSET

    General Comparison Functions (비교함수)

      GREATEST
      LEAST

    Conversion Functions (변환함수)

    변환함수의 이름은 datatypeTodatatype의 규칙을 따른다.
    앞의 datatype이 입력되는 datatype, 뒤의 datatype이 반환되는 datatype이다.

      ASCIISTR
      BIN_TO_NUM
      CAST
      CHARTOROWID
      COMPOSE
      CONVERT
      DECOMPOSE
      HEXTORAW
      NUMTODSINTERVAL
      NUMTOYMINTERVAL
      RAWTOHEX
      RAWTONHEX
      ROWIDTOCHAR
      ROWIDTONCHAR
      SCN_TO_TIMESTAMP
      TIMESTAMP_TO_SCN
      TO_BINARY_DOUBLE
      TO_BINARY_FLOAT
      TO_CHAR (character)
      TO_CHAR (datetime)
      TO_CHAR (number)
      TO_CLOB
      TO_DATE
      TO_DSINTERVAL
      TO_LOB
      TO_MULTI_BYTE
      TO_NCHAR (character)
      TO_NCHAR (datetime)
      TO_NCHAR (number)
      TO_NCLOB
      TO_NUMBER
      TO_DSINTERVAL
      TO_SINGLE_BYTE
      TO_TIMESTAMP
      TO_TIMESTAMP_TZ
      TO_YMINTERVAL
      TO_YMINTERVAL
      TRANSLATE ... USING
      UNISTR

    Large Object Functions (LOB 함수)

      BFILENAME
      EMPTY_BLOB, EMPTY_CLOB

    Collection Functions (Collection 함수)

    중첩테이블(nested table), varray를 가지고 계산을 한다.

      CARDINALITY
      COLLECT
      POWERMULTISET
      POWERMULTISET_BY_CARDINALITY
      SET

    Hierarchical Function (계층쿼리 함수)

      SYS_CONNECT_BY_PATH

    Data Mining Functions (데이터마이닝 함수)

      CLUSTER_ID
      CLUSTER_PROBABILITY
      CLUSTER_SET
      FEATURE_ID
      FEATURE_SET
      FEATURE_VALUE
      PREDICTION
      PREDICTION_COST
      PREDICTION_DETAILS
      PREDICTION_PROBABILITY
      PREDICTION_SET

    XML Functions (XML 함수)

      APPENDCHILDXML
      DELETEXML
      DEPTH
      EXTRACT (XML)
      EXISTSNODE
      EXTRACTVALUE
      INSERTCHILDXML
      INSERTXMLBEFORE
      PATH
      SYS_DBURIGEN
      SYS_XMLAGG
      SYS_XMLGEN
      UPDATEXML
      XMLAGG
      XMLCDATA
      XMLCOLATTVAL
      XMLCOMMENT
      XMLCONCAT
      XMLFOREST
      XMLPARSE
      XMLPI
      XMLQUERY
      XMLROOT
      XMLSEQUENCE
      XMLSERIALIZE
      XMLTABLE
      XMLTRANSFORM

    Encoding and Decoding Functions

      DECODE
      DUMP
      ORA_HASH
      VSIZE

    NULL-Related Functions (NULL 관련 함수)

      COALESCE
      LNNVL
      NULLIF
      NVL
      NVL2

    Environment and Identifier Functions (환경변수 관련 함수)

    instance, session에 관한 정보를 제공한다.

      SYS_CONTEXT
      SYS_GUID
      SYS_TYPEID
      UID
      USER
      USERENV

  2. Aggregate Functions (그룹함수)

  그룹함수는 select-list나, order by절, having절에 나올 수 있다.
  group by절을 포함하는 쿼리에서 select-list에는 그룹함수, group by절에 있는 표현식(expression),
  상수만이 올 수 있다. COUNT(*), GROUPING을 제외한 모든 그룹함수는 NULL값을 무시한다.

      AVG
      COLLECT
      CORR
      CORR_*
      COUNT
      COVAR_POP
      COVAR_SAMP
      CUME_DIST
      DENSE_RANK
      FIRST
      GROUP_ID
      GROUPING
      GROUPING_ID
      LAST
      MAX
      MEDIAN
      MIN
      PERCENTILE_CONT
      PERCENTILE_DISC
      PERCENT_RANK
      RANK
      REGR_ (Linear Regression) Functions
      STATS_BINOMIAL_TEST
      STATS_CROSSTAB
      STATS_F_TEST
      STATS_KS_TEST
      STATS_MODE
      STATS_MW_TEST
      STATS_ONE_WAY_ANOVA
      STATS_T_TEST_*
      STATS_WSR_TEST
      STDDEV
      STDDEV_POP
      STDDEV_SAMP
      SUM
      VAR_POP
      VAR_SAMP
      VARIANCE

  3. Analytic Functions (분석함수, 해석함수)

  분석함수는 그룹단위로 값을 계산한다는 점에서 그룹함수와 유사하지만, 그룹마다 1개이상의 행을 반환한다는
  점에서 그룹함수와 상당한 차이가 있다. 분석함수에서의 그룹을 윈도우(window)라고 부르며,
  analytic_clause에서 정의한다.

  * 분석함수와 analytic_clause의 자세한 설명은 아래 페이지를 참고한다.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=2


  조회되는 각 행마다, 분석함수 값을 계산하기 위한 윈도우를 정의한다. 윈도우의 크기는 행의 갯수나
  시간간격을 계산하여 정의할 수 있다. 분석함수는 order by절을 제외하고는 쿼리에서 가장 나중에
  실행된다. 따라서 select-list나 order by절에만 사용할 수 있다.

  분석함수는 데이타웨어하우징(DW) 분야에서 많이 사용된다. 아래 분석함수 중에서 별표(*)가 되어 있는
  함수들은 windowing_clause를 포함해서 모든 분석함수의 구문들을 사용할 수 있는 함수들이다.

  * 분석함수와 windowing_clause의 자세한 설명은 아래 페이지를 참고한다.
  - http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=2


      AVG *
      CORR *
      COVAR_POP *
      COVAR_SAMP *
      COUNT *
      CUME_DIST
      DENSE_RANK
      FIRST
      FIRST_VALUE *
      LAG
      LAST
      LAST_VALUE *
      LEAD
      MAX *
      MIN *
      NTILE
      PERCENT_RANK
      PERCENTILE_CONT
      PERCENTILE_DISC
      RANK
      RATIO_TO_REPORT
      REGR_ (Linear Regression) Functions *
      ROW_NUMBER
      STDDEV *
      STDDEV_POP *
      STDDEV_SAMP *
      SUM *
      VAR_POP *
      VAR_SAMP *
      VARIANCE *

  4. Object Reference Functions

      DEREF
      MAKE_REF
      REF
      REFTOHEX
      VALUE

  5. Model Functions (Model 함수)

      CV
      ITERATION_NUMBER
      PRESENTNNV
      PRESENTV
      PREVIOUS
  



  References

  1. Oracle(R) Database SQL Reference 10g Release 2 (10.2) - SQL Functions
  - http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm

  2. Oracle Database SQL Reference, 10g Release 2 (10.2) B14200-02, b14200.pdf
  - http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14200.pdf

  Document History

  최초등록: 2006-04-15
  1차 수정: 2006-04-19
  2차 수정: 2006-07-17, 함수 추가
  3차 수정: 2006-08-27, 함수 추가
  4차 수정: 2006-09-08, 함수 추가
  5차 수정: 2006-10-20, 함수 추가
  

  * 이 문서의 내용에 관해서 잘못된 부분이 있거나 질문이 있으신 분은 답글로 알려주시기 바랍니다.
  * 이 문서를 다른 곳에 게재하실 분은 출처를 꼭 밝혀주시기 바랍니다.

출처: http://www.soqool.com/servlet/board?cmd=view&cat=100&subcat=1030&seq=1

 
AND

※ DML문장(Inser/Update/Delete)을 DBMS가 처리하는 방식
DML문장 입력들 → Rollback of Commit

※ Transaction 작업
개념 여러가지 소작업들로 이루어져 있고 일괄 처리되는 작업
All or Nothing (ex. 계좌이체)
AND

create table reporttable
(
ord_id number(7) constraints s_item_ordid_prodid_uk unique not null,
item_id number(7) constraints s_item_ordid_itemid_pk primary key not null,
product_id number(7) not null,
price number(11, 2),
quantity number(9),
quantity_shipped number(9)
);
AND

SQL> -- 부서 테이블과 사원 테이블에서 사번, 사원명, 부서코드, 부서명을 검색하시오. 단, 출력 시, 사원명을 기준으로 오름차순으로 정렬하시오.
SQL> select empno, ename, emp.deptno, dname from emp, dept where emp.deptno = dept.deptno order by ename;

EMPNO ENAME DEPTNO DNAME
---------- ---------- ---------- --------------
7876 ADAMS 20 RESEARCH
7499 ALLEN 30 SALES
7698 BLAKE 30 SALES
7782 CLARK 10 ACCOUNTING
7902 FORD 20 RESEARCH
7900 JAMES 30 SALES
7566 JONES 20 RESEARCH
7839 KING 10 ACCOUNTING
7654 MARTIN 30 SALES
7934 MILLER 10 ACCOUNTING
7788 SCOTT 20 RESEARCH
7369 SMITH 20 RESEARCH
7844 TURNER 30 SALES
7521 WARD 30 SALES

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

SQL> -- 부서 테이블과 사원 테이블에서 사번, 사원명, 급여, 부서명을 검색하시오. 단, 급여가 2000이상인 사원에 대하여 급여를 기분으로 내림차순으로 정렬하시오.
SQL> select empno, ename, sal, dname from emp, dept where emp.deptno = dept.deptno and sal >= 2000 order by sal asc;

EMPNO ENAME SAL DNAME
---------- ---------- ---------- --------------
7782 CLARK 2450 ACCOUNTING
7698 BLAKE 2850 SALES
7566 JONES 2975 RESEARCH
7788 SCOTT 3000 RESEARCH
7902 FORD 3000 RESEARCH
7839 KING 5000 ACCOUNTING

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

SQL> -- 부서 테이블과 사원 테이블에서 사번, 사원명, 업무, 급여, 부서명을 검색하시오. 단 업무가 MANAGER이며 급여가 2500이상인 사원에 대하여 사번을 기준으로 오름차순으로 정렬하시오.
SQL> select empno, ename, job, sal, dept.dname from emp, dept where upper(job) = upper('manager') and sal >= 2500 order by empno;

EMPNO ENAME JOB SAL DNAME
---------- ---------- --------- ---------- --------------
7566 JONES MANAGER 2975 ACCOUNTING
7566 JONES MANAGER 2975 RESEARCH
7566 JONES MANAGER 2975 OPERATIONS
7566 JONES MANAGER 2975 SALES
7698 BLAKE MANAGER 2850 ACCOUNTING
7698 BLAKE MANAGER 2850 RESEARCH
7698 BLAKE MANAGER 2850 OPERATIONS
7698 BLAKE MANAGER 2850 SALES

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

SQL> SPOOL OFF
AND

SQL> -- 사원 테이블의 사원명에서 2번째 문자부터 3개의 문자를 추출하시오
SQL> select substr(ename, 2, 3) from emp;

SUBSTR
------
MIT
LLE
ARD
ONE
ART
LAK
LAR
COT
ING
URN
DAM
AME
ORD
ILL

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

SQL> -- 사원 테이블에서 입사일이 12월인 사원의 사번, 사원명, 입사일을 검색하시오
SQL> select empno, ename, hiredate from emp where to_char(hiredate,'mm') = '12';

EMPNO ENAME HIREDATE
---------- ---------- --------
7369 SMITH 80/12/17
7900 JAMES 81/12/03
7902 FORD 81/12/03

SQL> -- 다음과 같은 결과를 검색할 수 있는 SQL 문장을 작성하시오
SQL> select empno, ename, lpad(sal,10,'*') as "급여" from emp;

EMPNO ENAME 급여
---------- ---------- --------------------
7369 SMITH *******800
7499 ALLEN ******1600
7521 WARD ******1250
7566 JONES ******2975
7654 MARTIN ******1250
7698 BLAKE ******2850
7782 CLARK ******2450
7788 SCOTT ******3000
7839 KING ******5000
7844 TURNER ******1500
7876 ADAMS ******1100
7900 JAMES *******950
7902 FORD ******3000
7934 MILLER ******1300

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

SQL> -- 다음과 같은 결과를 검색할 수 있는 SQL문장을 작성하시오
SQL> select empno, ename, to_char(hiredate,'yyyy-mm-dd') as "입사일" from emp;

EMPNO ENAME 입사일
---------- ---------- ----------
7369 SMITH 1980-12-17
7499 ALLEN 1981-02-20
7521 WARD 1981-02-22
7566 JONES 1981-04-02
7654 MARTIN 1981-09-28
7698 BLAKE 1981-05-01
7782 CLARK 1981-06-09
7788 SCOTT 1987-04-19
7839 KING 1981-11-17
7844 TURNER 1981-09-08
7876 ADAMS 1987-05-23
7900 JAMES 1981-12-03
7902 FORD 1981-12-03
7934 MILLER 1982-01-23

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


SQL> -- 사원테이블 급여에 따라 사번, 이름, 급여, 등급을 검색하는 SQL문장을 작성하시오.
SQL> select empno, ename,
SQL> case when sal <= 1000 then 'E'
SQL> when sal <= 2000 then 'D'
SQL> when sal <= 3000 then 'C'
SQL> when sal <= 4000 then 'B'
SQL> else 'A' end from emp;

EMPNO ENAME C
---------- ---------- -
7369 SMITH E
7499 ALLEN D
7521 WARD D
7566 JONES C
7654 MARTIN D
7698 BLAKE C
7782 CLARK C
7788 SCOTT C
7839 KING A
7844 TURNER D
7876 ADAMS D
7900 JAMES E
7902 FORD C
7934 MILLER D

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

SQL> spool off
AND

SQL> select empno, ename, sal from emp where deptno = 10;

EMPNO ENAME SAL
---------- ---------- ----------
7782 CLARK 2450
7839 KING 5000
7934 MILLER 1300

SQL> select ename, hiredate, deptno from emp where empno = 7369;

ENAME HIREDATE DEPTNO
---------- -------- ----------
SMITH 80/12/17 20

SQL> select * from emp where ename = upper('allen');

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30

SQL> select ename, deptno, sal from emp where hiredate = '81/04/02';

ENAME DEPTNO SAL
---------- ---------- ----------
JONES 20 2975

SQL> select * from emp where job <> upper('manager');

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
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7839 KING PRESIDENT 81/11/17 5000 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7876 ADAMS CLERK 7788 87/05/23 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

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

SQL> select ename, deptno, sal from emp where hiredate > '81/04/02';

ENAME DEPTNO SAL
---------- ---------- ----------
MARTIN 30 1250
BLAKE 30 2850
CLARK 10 2450
SCOTT 20 3000
KING 10 5000
TURNER 30 1500
ADAMS 20 1100
JAMES 30 950
FORD 20 3000
MILLER 10 1300

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

SQL> select ename, sal, deptno from emp where sal >= 800;

ENAME SAL DEPTNO
---------- ---------- ----------
SMITH 800 20
ALLEN 1600 30
WARD 1250 30
JONES 2975 20
MARTIN 1250 30
BLAKE 2850 30
CLARK 2450 10
SCOTT 3000 20
KING 5000 10
TURNER 1500 30
ADAMS 1100 20
JAMES 950 30
FORD 3000 20
MILLER 1300 10

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

SQL> select * from emp where deptno >= 20;

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
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7876 ADAMS CLERK 7788 87/05/23 1100 20
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20

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

SQL> select * from emp where ename > 'K%' and ename not like 'K%';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80/12/17 800 20
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7934 MILLER CLERK 7782 82/01/23 1300 10

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

SQL> select * from emp where hiredate < '81/12/09';

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
7839 KING PRESIDENT 81/11/17 5000 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20

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

SQL> select empno, ename from emp where empno <= 7698;

EMPNO ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE

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

SQL> select ename, sal, deptno from emp where hiredate > '81/04/02' and hiredate <'82/12/09';

ENAME SAL DEPTNO
---------- ---------- ----------
MARTIN 1250 30
BLAKE 2850 30
CLARK 2450 10
KING 5000 10
TURNER 1500 30
JAMES 950 30
FORD 3000 20
MILLER 1300 10

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

SQL> select ename, job, sal from emp where sal > 1600 and sal < 3000;

ENAME JOB SAL
---------- --------- ----------
JONES MANAGER 2975
BLAKE MANAGER 2850
CLARK MANAGER 2450

SQL> select * from emp where empno < 7654 or empno > 7782;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7839 KING PRESIDENT 81/11/17 5000 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7876 ADAMS CLERK 7788 87/05/23 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
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

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

SQL> select * from emp where ename between 'B%' and 'J%';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7902 FORD ANALYST 7566 81/12/03 3000 20

SQL> select * from emp where substr(hiredate,1,2) <> '81';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80/12/17 800 20
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7876 ADAMS CLERK 7788 87/05/23 1100 20
7934 MILLER CLERK 7782 82/01/23 1300 10

SQL> select * from emp where job IN ('MANAGER','SALESMAN');

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
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
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30

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

SQL> select ename, empno, deptno from emp where deptno <> 20 and deptno <> 30;

ENAME EMPNO DEPTNO
---------- ---------- ----------
CLARK 7782 10
KING 7839 10
MILLER 7934 10

SQL> select empno, ename, hiredate, deptno from emp where ename like 'S%';

EMPNO ENAME HIREDATE DEPTNO
---------- ---------- -------- ----------
7369 SMITH 80/12/17 20
7788 SCOTT 87/04/19 20

SQL> select * from emp where hiredate like '81%';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
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
7839 KING PRESIDENT 81/11/17 5000 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20

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

SQL> select * from emp where ename like '%S%';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80/12/17 800 20
7566 JONES MANAGER 7839 81/04/02 2975 20
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7876 ADAMS CLERK 7788 87/05/23 1100 20
7900 JAMES CLERK 7698 81/12/03 950 30

SQL> select * from emp where ename like 'S%T';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 87/04/19 3000 20

SQL> select * from emp where ename like 'S___T';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7788 SCOTT ANALYST 7566 87/04/19 3000 20

SQL> select * from emp where ename like '_A%';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7900 JAMES CLERK 7698 81/12/03 950 30

SQL> select * from emp where comm is null;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80/12/17 800 20
7566 JONES MANAGER 7839 81/04/02 2975 20
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7839 KING PRESIDENT 81/11/17 5000 10
7876 ADAMS CLERK 7788 87/05/23 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

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

SQL> select * from emp where comm is not null;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30

SQL> select ename, deptno, sal from emp where deptno = 30 and sal >= 1500;

ENAME DEPTNO SAL
---------- ---------- ----------
ALLEN 30 1600
BLAKE 30 2850
TURNER 30 1500

SQL> select empno, ename, deptno from emp where ename like 'K%' or deptno = 30;

EMPNO ENAME DEPTNO
---------- ---------- ----------
7499 ALLEN 30
7521 WARD 30
7654 MARTIN 30
7698 BLAKE 30
7839 KING 10
7844 TURNER 30
7900 JAMES 30

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

SQL> select * from emp where sal >= 1500 and deptno = 30 and job = 'MANAGER';

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 81/05/01 2850 30

SQL> select * from emp where deptno = 30 order by empno asc;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7900 JAMES CLERK 7698 81/12/03 950 30

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

SQL> select * from emp order by sal asc;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80/12/17 800 20
7900 JAMES CLERK 7698 81/12/03 950 30
7876 ADAMS CLERK 7788 87/05/23 1100 20
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7934 MILLER CLERK 7782 82/01/23 1300 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7566 JONES MANAGER 7839 81/04/02 2975 20
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7902 FORD ANALYST 7566 81/12/03 3000 20
7839 KING PRESIDENT 81/11/17 5000 10

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

SQL> select * from emp order by deptno asc, sal desc;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7839 KING PRESIDENT 81/11/17 5000 10
7782 CLARK MANAGER 7839 81/06/09 2450 10
7934 MILLER CLERK 7782 82/01/23 1300 10
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7902 FORD ANALYST 7566 81/12/03 3000 20
7566 JONES MANAGER 7839 81/04/02 2975 20
7876 ADAMS CLERK 7788 87/05/23 1100 20
7369 SMITH CLERK 7902 80/12/17 800 20
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7900 JAMES CLERK 7698 81/12/03 950 30

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

SQL> select * from emp order by deptno desc, ename asc, sal desc;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7900 JAMES CLERK 7698 81/12/03 950 30
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7876 ADAMS CLERK 7788 87/05/23 1100 20
7902 FORD ANALYST 7566 81/12/03 3000 20
7566 JONES MANAGER 7839 81/04/02 2975 20
7788 SCOTT ANALYST 7566 87/04/19 3000 20
7369 SMITH CLERK 7902 80/12/17 800 20
7782 CLARK MANAGER 7839 81/06/09 2450 10
7839 KING PRESIDENT 81/11/17 5000 10
7934 MILLER CLERK 7782 82/01/23 1300 10

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

SQL> spool off
AND

25가지 SQL작성법

DB 2006. 8. 11. 18:00

http://www.50001.com/tt/board/ttboard.cgi?act=read&db=10103&sortby=readnum&order=desc&page=1&idx=459
1.데이터와 비즈니스 어플리케이션을 잘 알아야 한다.
동일한 정보는 다른 비즈니스 데이터 원천으로부터 검색될 수 있다. 이러한 원천에 익숙해야 한다.
당신은 당신의 데이터베이스 안의 데이터의 크기와 분포를 반드시 알아야 한다.
또한 SQL을 작성하기 전에 비즈니스 개체 안의 관계와 같은 데이터 모델을 전체적으로 이해해야
한다. 이러한 이해는 당신이 여러 테이블에서 정보를 검색하는데 있어서 보다 좋은 쿼리를 작성할
수 있다. DESIGNER/2000과 같은 CASE TOOLS은 다른 비즈니스와 데이터베이스 객체사이의 관계
를 문서화 하는데 좋은 역할을 한다.

2.실제 데이터를 가지고 당신의 쿼리를 검사하라.
대부분의 조직은 개발, 검사, 제품의 3가지 데이터베이스 환경을 가진다. 프로그래머는
어플리케이션을 만들고 검사하는데 개발 데이터베이스 환경을 사용하는데, 이 어플리케이션이
제품 환경으로 전환되기 전에 프로그래머와 사용자에 의해 검사 환경하에서 보다 엄격하게 검토되어
야 한다.
SQL이 검사 환경하에서 테스트될 때, 검사 데이터베이스가 가지고 있는 데이터는 제품 데이터베이스
를 반영해야 한다. 비실제적인 데이터를 가지고 테스트된 SQL문은 제품 안에서는 다르게 작동할 수
있다. 엄격한 테스트를 보장하기 위해서는, 검사 환경하에서의 데이터 분포는 반드시 제품 환경에서
의 분포와 밀접하게 닮아야 한다.

3.동일한 SQL을 사용하라.
가능한한 BIND VARIABLE, STORED PROCEDURE, PACKAGE의 이점을 활용하라. IDENTICAL SQL문
의 이점은 PARSING이 불필요하기에 데이터베이스 서버안에서 메모리 사용의 축소와 빠른 수행을
포함한다. 예로서 아래의 SQL 문은 IDENTICAL하지 않다.

SELECT * FROM EMPLOYEE WHERE EMPID = 10;
SELECT * FROM EMPLOYEE WHERE EMPID = 10;
SELECT * FROM EMPLOYEE WHERE EMPID = 20;

그러나 I_EMPID라고 이름 주어진 BIND VARIABLE을 사용하면 SQL 문은 이렇게 된다.
SELECT * FROM EMPLOYEE WHERE EMPID = :I_EMPID;

4.주의 깊게 인덱스를 사용하라.
테이블상에 모든 필요한 인덱스는 생성되어야 한다. 하지만 너무 많은 인덱스는 성능을 떨어뜨릴
수 있다. 그러면 어떻게 인덱스를 만들 칼럼을 선택해야 하는가?

*최종 사용자에 의해 사용되는 어플리케이션 SQL과 쿼리의 WHERE 절에서 빈번하게 사용되는 칼럼
에 인덱스를 만들어야 한다.

*SQL 문에서 자주 테이블을 JOIN하는데 사용되는 칼럼은 인덱스되어야 한다.

*같은 값을 가지는 ROW가 적은 비율을 가지는 칼럼에 인덱스를 사용하라.

*쿼리의 WHERE 절에서 오직 함수와 OPERATOR로 사용되는 칼럼에는 인덱스를 만들면 안된다.

*자주 변경되거나 인덱스를 만들때 얻는 효율성보다 삽입, 갱신, 삭제로 인해 잃는 효율성이 더 큰
칼럼에는 인덱스를 만들면 안된다. 이러한 OPERATION은 인덱스를 유지하기 위한 필요 때문에 느려
진다.

*UNIQUE 인덱스는 더 나은 선택성 때문에 NONUNIQUE 인덱스보다 좋다. PRIMARY KEY 칼럼에
UNIQUE 인덱스를 사용한다. 그리고 FOREIGN KEY 칼럼과 WHERE 절에서 자주 사용되는 칼럼에는
NONUNIQUE 인덱스를 사용한다.

5.가용한 인덱스 PATH를 만들어라
인덱스를 사용하기 위해서는 기술한 SQL문을 이용할 수 있는 식으로 SQL을 작성하라. OPTIMIZER는
인덱스가 존재하기 때문에 인덱스를 사용하는 ACESS PATH를 사용할 수 없다. 따라서 ACCESS PATH
는 반드시 SQL이 사용할 수 있게 만들어 져야 한다. SQL HINT를 사용하는 것은 인덱스 사용을
보증해주는 방법중 하나이다. 특정 ACCESS PATH를 선택하기 위한 다음의 힌트를 참고 하라

6.가능하면 EXPLAIN과 TKPROF를 사용하라
만약 SQL문이 잘 다듬어지지 않았다면 비록 오라클 데이터베이스가 잘 짜여져 있어도 효율성이 떨어
질 것이다. 이럴 경우 EXPLAIN TKPROF에 능숙해져야 한다. EXPALIN PLAN은 SQL이 사용하는
ACCESS PATH를 발견할 수 있게 해주고 TKPROF는 실제 PERFORMANEC의 통계치를 보여준다.
이 TOOL은 오라클 서버 소프트웨어에 포함되어 있고 SQL의 성능을 향상시켜 준다.

7.OPTIMIZER를 이해하라.
SQL은 RULE-BASED나 COST-BASED중 하나를 이용해서 기동된다.기존의 소프트웨어는 RULE BASED
방식을 채택하고 있다. 그리고 많은 오라클 소프트웨어가 이러한 방식을 오랫동안 사용해 왔다.
그러나 새로 출시된 소프트웨어에 대해서는 COST BASED 방식의 OPTIMIZER를 고려해야 한다.
오라클은 새로 출시되는 프로그램을 COST BASED방식으로 업그레이드 시켜왔으며 이러한 방식은
시스템을 훨씬 더 안정적으로 만들었다. 만약 COST BASED방식의 OPTIMIZER를 사용한다면 반드시
ANALYZE 스키마를 정기적으로 사용해야 한다. ANALYZE스키마는 데이터베이스 통계를 데이터 사전
테이블에 기록하는 역할을 수행하며 그렇게 되면 COST BASED OPTIMIZER가 그것을 사용하게
된다. SQL은 COST BASED OPTIMIZER를 사용할 때만 잘 조정될 수 있다. 만약 RULE BASED에서
COST BASED로 바꾸고 싶다면 데이터베이스를 사용하는 모든 소프트웨어의 모든 SQL문의 성능을
평가해 보아야 한다.

8.지엽적으로 동작하더라도 전역적으로 생각하라
항상 주의할 것은 하나의 SQL문을 조정하기 위해 생긴 데이터베이스안의 변화는 다른 응용프로그램
이나 다른 사용자가 이용하는 다른 명령문에 영향을 미친다는 사실이다.

9.WHERE절은 매우 중요하다.
비록 인덱스가 가용하다고 해도 다음의 WHERE 절은 그 인덱스 ACCESS PATH 를 사용하지 않는다.
(즉 COL1 과 COL2는 같은 테이블에 있으며 인덱스는 COL1에 만들어진다.)

COL1 > COL2
COL1 < COL2
COL1 > = COL2
COL1 <= COL2
COL1 IS NULL
COL1 IS NOT NULL.

인덱스는 NULL값을 갖는 칼럼에는 ROWID를 저장하지 않는다. 따라서 NULL값을 갖는 ROW를 검색할
때는 인덱스를 사용하지 못한다.

COL1 NOT IN (VALUE1, VALUE2 )
COL1 != EXPRESSION
COL1 LIKE '%PATTERN'.

이럴 경우 THE LEADING EDGE OF THE INDEX(?) 는 작동되지 않고 인덱스가 사용되지 못하게 한
다. 한편 COL1 LIKE 'PATTERN %'이나 COL1 LIKE 'PATTERN % PATTERN%' 는 한정된 인덱스
스캔을 수행하기 때문에 인덱스를 사용할 수 있다.

NOT EXISTS SUBQUERY
EXPRESSION1 = EXPRESSION2.

인덱스된 컬럼을 포함하는 표현(EXPRESSION), 함수, 계산(CALCULATIONS)은 인덱스를 사용하지
못한다. 다음의 예에서 보면 UPPER SQL 함수를 사용하면 인덱스 스캔을 사용할 수 없고
FULL TABLE SCAN으로 끝나고 만다.

SELECT DEPT_NAME
FROM DEPARTMENT
WHERE UPPER(DEPT_NAME) LIKE 'SALES%';

10.레코드 필터링을 위해서는 HAVING보다는 WHERE를 사용하라
인덱스가 걸려있는 칼럼에는 GROUP BY와 같이 HAVING절을 사용하지 마라. 이 경우 인덱스는 사용
되지 않는다. 또한 WHERE절로 된 ROW를 사용하지 마라. 만약 EMP테이블이 DEPTID컬럼에 인덱스
를 가지고 있다면 다음 질의는 HAVING 절을 이용하지 못한다.

SELECT DEPTID,
SUM(SALARY)
FROM EMP
GROUP BY DEPTID
HAVING DEPTID = 100;

그러나 같은 질의가 인덱스를 사용하기 위해 다시 씌여질 수 있다.

SELECT DEPTID,
SUM(SALARY)
FROM EMP
WHERE DEPTID = 100
GROUP BY DEPTID;

11. WHERE 절에 선행 INDEX 칼럼을 명시하라.
복합 인덱스의 경우, 선행 인덱스가 WHERE절에 명시되어 있다면 쿼리는 그 인덱스 를 사용할 것이
다. 다음의 질의는 PART_NUM과 PRODUCT_ID 칼럼에 있는 PRIMARY KEY CONSTRAINT에 기초한
복합 인덱스를 이용할 것이다.

SELECT *
FROM PARTS
WHERE PART_NUM = 100;

반면, 다음의 쿼리는 복합인덱스를 사용하지 않는다.

SELECT *
FROM PARTS
WHERE PRODUCT_ID = 5555;

같은 요청(REQUEST)이 인덱스를 이용하기 위해 다시 씌어 질 수 있다. 다음 질의의 경우,
PART_NUM컬럼은 항상 0 보다 큰 값을 가질것이다.

SELECT *
FROM PARTS
WHERE PART_NUM > 0
AND PRODUCT_ID = 5555;

12.인덱스 SCAN과 FULL TABLE SCAN을 평가하라.
한 행(ROW)의 15% 이상을 검색하는 경우에는 FULL TABLE SCAN이 INDEX ACESS PATH보다 빠르
다. 이런 경우, SQL이 FULL TABLE SCAN을 이용할 수 있도록 여러분 스스로 SQL을 작성하라.
다음의 명령문은 비록 인덱스가 SALARY COLUMN에 만들어져 있어도 인덱스 SCAN을 사용하지 않을
것이다. 첫 번째 SQL에서, FULL HINT를 사용한다면 오라클은 FULL TABLE SCAN을 수행할 것이
다. 인덱스의 사용이 나쁜 점이 더 많다면 아래의 기술을 이용해서 인덱스 수행을 막을수 있다.

SELECT * --+FULL
FROM EMP
WHERE SALARY = 50000;

SELECT *
FROM EMP
WHERE SALARY+0 = 50000;

다음의 명령문은 비록 인덱스가 SS# COLUMN에 있어도 인덱스 SCAN을 사용하지 않을 것이다.

SELECT *
FROM EMP
WHERE SS# || ' ' = '111-22-333';

오라클이 불분명한 데이터 변환을 수행해야 하는 경우 인덱스가 항상 사용되지않는 것은 아니다.
다음의 예를 보면, EMP 칼럼에 있는 SALARY는 숫자형 칼럼이고 문자형이 숫자값으로 변환된다.

SELECT *
FROM EMP
WHERE SALARY = '50000';

테이블의 행이 15%이거나 그보다 작을 경우 인덱스 스캔은 보다 잘 수행 될 것이다. 왜냐 하면 인덱
스 스캔은 검색된 행(ROW)하나 하나 마다 다중의 논리적인 읽기 검색(READ)을 할 것이기 때문이
다. 그러나 FULL TABLE SCAN은 하나의 논리적 인 읽기 검색 영역 안의 BLOCK에 있는 모든 행들을
읽을 수 있다. 그래서 테이블의 많은 행들에 접근해야 하는 경우에는 FULL TABLE SCAN이 낫다.
예로 다음의 경우를 보자. 만약 EMP TABLE과 그 테이블의 모든 인덱스에 대해 ANALYZE라는 명령어
가 수행된다면, 오라클은 데이터 사전인 USER_TABLES와 USER_INDEXES에 다음과 같은 통계치를
산출해 낸다.

TABLE STATISTICS:
NUM_ROWS = 1000
BLOCKS = 100

INDEX STATISTICS:

BLEVEL = 2
AVG_LEAF_BLOCKS_PER_KEY = 1
AVG_DATA_BLOCKS_PER_KEY = 1

이러한 통계치에 근거해서, 아래에 보이는 것이 각각의 다른 SCAN에 대한 논리적인 읽기(READ)-즉
ACESS된 BLOCK이 될 것이다.

USE OF INDEX TO RETURN ONE ROW = 3

(BLEVEL+(AVG_LEAF_BLOCKS_PER_KEY - 1) +
AVG_DATA_PER_KEY

FULL TABLE SCAN = 100
(BLOCKS)

USE OF INDEX TO RETURN ALL ROWS = 3000
(NUM_ROWS * BLOCKS ACCESSED TO RETURN ONE ROW USING INDEX)

13. 인덱스 스캔에 ORDER BY를 사용하라
오라클의 OPTIMIZER는 , 만약 ORDER BY라는 절이 인덱스된 칼럼에 있다면 인덱스 스캔을 사용할
것이다. 아래의 질의는 이러한 점을 보여 주는 것인데 이 질의는 비록 그 칼럼이 WHERE 절에 명시
되어 있지 않다고 해도 EMPID컬럼에 있는 가용한 인덱스를 사용할 것이다. 이 질의는 인덱스로부
터 각각의 ROWID를 검색하고 그 ROWID를 사용하는 테이블에 접근한다.

SELECT SALARY
FROM EMP
ORDER BY EMPID;

만약 이 질의가 제대로 작동하지 않는다면, 당신은 위에서 명시되었던 FULL HINT를 사용하는 같은 질의를 다시 작성함으로써 다른 대안들을 이용해 볼 수 있다.


14. 자신의 데이터를 알아라
내가 이미 설명한 것처럼, 당신은 당신의 데이터를 상세하게 알고 있어야 한다.예를 들어 당신이
BOXER라는 테이블을 가지고 있고 그 테이블이 유일하지 않은 인덱스를 가진 SEX라는 컬럼과
BOXER_NAME이라는 두 개의 테이블을 가지고 있다고 가정해 보자. 만약 그 테이블에 같은 수의
남자, 여자 복서가 있다면 오라클이 FULL TABLE SCAN을 수행하는 경우 다음의 질의가 훨씬 빠를
것이다.

SELECT BOXER_NAME
FROM BOXER
WHERE SEX = 'F';

당신은 다음과 같이 기술함으로써 질의가 FULL TABLE SCAN을 수행하는지를 확실하게 해둘수 있다.

SELECT BOXER_NAME --+ FULL
FROM BOXER
WHERE SEX = 'F';

만약 테이블에 980 명의 남성 복서 데이터가 있다면, 질의는 인덱스 SCAN으로 끝나기 때문에
아래형식의 질의가 더 빠를 것이다.

SELECT BOXER_NAME --+ INDEX (BOXER BOXER_SEX)
FROM BOXER
WHERE SEX = 'F';

이 예는 데이터의 분포에 대해 잘 알고 있는 것이 얼마나 중요한 가를 예시해 준다. 데이터가 많아지고(GROW) 데이터 분포가 변화하는 것처럼 SQL 도 매우 다양할 것이다. 오라클은 OPTIMIZER 가 테이블에 있는 데이터의 분포를 잘 인식하고 적절한 실행 계획을 선택하도록 하기 위해 오라클 7.3 에 HISTOGRAMS라는 기능을 추가했다.

15. KNOW WHEN TO USE LARGE-TABLE SCANS.
작거나 큰 테이블에서 행들을 추출할 때, 전체 테이블의 검색은 인텍스를 사용한 검색보다 성능이
더 좋을 수도 있다. 매우 큰 테이블의 인덱스 검색은 수많은 인덱스와 테이블 블록의 검색이 필요할
수도 있다. 이러한 블록들이 데이터베이 스 버퍼 캐쉬에 이동되면 가능한한 오래도록 그곳에 머무른
다. 그래서 이러한 블록들이 다른 질의등에 필요하지 않을 수도 있기 때문에, 데이터베이스 버퍼
히트 비율이 감소하며 다중 사용자 시스템의 성능도 저하되기도 한다. 그러나 전체 테이블 검색에
의해서 읽혀진 블록들은 데이터베이스 버퍼 캐쉬에서 일찍 제거가 되므로 데이터베이스 버퍼 캐쉬
히트 비율은 영향을 받지 않게 된다.

16. MINIMIZE TABLE PASSES.
보통, SQL질의시 참조하는 테이블의 숫자를 줄임으로 성능을 향상시킨다. 참조되는 테이블의 숫자
가 적을수록 질의는 빨라진다. 예를 들면 NAME, STATUS, PARENT_INCOME, SELF_INCOME의 네개
의 컬럼으로 이루어진 학생 테이블 에서 부모님에 의존하는 학생과 독립한 학생의 이름과 수입에
대해서 질의시, 이 학생 테이블을 두번 참조하여 질의하게 된다..
SELECT NAME, PARENT_INCOME
FROM STUDENT
WHERE STATUS = 1
UNION
SELECT NAME, SELF_INCOME
FROM STUDENT
WHERE STATUS = 0;
( NAME이 프라이머리 키이며, STATUS는 독립한 학생의 경우는 1, 부모님에 의존적인 학생은 0으로
표시한다)
위의 같은 결과를 테이블을 두번 참조하지 않고도 질의 할 수 있다.

SELECT NAME,PARENT_INCOME*STATUS + SELF_INCOME(1-STATUS)
FROM STUDENT;

17. JOIN TABLES IN THE PROPER ORDER.
다수의 테이블 조인시 테이블들의 조인되는 순서는 매우 중요하다. 전반적으로, 올바른 순서로 테이
블이 조인되었다면 적은 수의 행들이 질의시 참조된다. 언제나 다수의 조인된 테이블들을 질의시
우선 엄격하게 조사하여 행들의 숫자를 최대한으로 줄인다. 이러한 방법으로 옵티마이저는 조인의
차후 단계에서 적은 행들을 조사하게 된다. 뿐만 아니라, 여러 조인을 포함하는 LOOP JOIN에서는
가장 먼저 참조되는 테이블(DRIVING TABLE)이 행들을 최소한으로 리턴하도록 해야한다. 그리고,
마스터와 상세 테이블 조인시에는(예를 들면 ORDER & ORDER LINE ITEM TABLES) 마스터 테이블
을 먼저 연결 시켜야 한다. 규칙에 근거한 옵티마이저의 경우에는 FROM CLAUSE의 마지막 테이블
이 NESTED LOOP JOIN의 DRIVING TABLE이 된다. NESTED LOOP JOIN이 필요한 경우에는 LOOP
의 안쪽의 테이블에는 인텍스를 이용하는 것을 고려할 만하다. EXPLAIN PLAN과 TKPROF는 조인
타입, 조인 테이블 순서, 조인의 단계별 처리된 행들의 숫자들을 나타낸다.
비용에 근거한 옵티마이저의 경우에는 WHERE CLAUSE에 보여지는 테이블의 순서는 옵티마이저가
가장 최적의 실행 계획을 찾으려고 하는 것과 상관 없다. 조인되는 테이블의 순서를 통제하기 위해
서 ORDERED HINT를 사용하는 것이 낫다.

SELECT ORDERS.CUSTID, ORDERS.ORDERNO,
ORDER_LINE_ITEMS.PRODUCTNO --+ORDERED
FROM ORDERS, ORDER_LINE_ITEMS
WHERE ORDERS.ORDERNO = ORDER_LINE_ITEMS.ORDERNO;

18. USE INDEX-ONLY SEARCHES WHEN POSSIBLE.
가능하다면, 인덱스만을 이용하여 질의를 사용하라. 옵티마이저는 오직 인덱스만을 찾을 것이다.
옵티마이저는 SQL을 만족시키는 모든 정보를 인덱스에서 찾을수 있을때,인덱스만을 이용할 것이다.
예를들면, EMP테이블이 LANME과 FNAME의 열에 복합 인덱스를 가지고 있다면 다음의 질의는
인덱스만은 이용할 것이다.

SELECT FNAME
FROM EMP
WHERE LNAME = 'SMITH';

반면에 다음의 질의는 인덱스와 테이블을 모두 참조한다.

SELECT FNAME , SALARY
FROM EMP
WHERE LNAME = 'SMITH';

19. REDUNDANCY IS GOOD.

WHERE CLAUSE에 가능한한 많은 정보를 제공하라. 예를 들면 WHERE COL1 = COL2 AND COL1 = 10
이라면 옵티마이저는 COL2=10이라고 추론하지만, WHERE COL1 = COL2 AND COL2 = COL3이면
COL1=COL3이라고 초론하지는 않는다.

20. KEEP IT SIMPLE, STUPID.
가능하면 SQL문을 간단하게 만들라. 매우 복잡한 SQL문은 옵티마이저를 무력화시킬 수도 있다.
때로는 다수의 간단한 SQL문이 단일의 복잡한 SQL문보다 성능이 좋을 수도 있다.
오라클의 비용에 근거한 옵티마이저는 아직은 완벽하지않다. 그래서 EXPLAIN PLAN에 주의를
기울여야 한다. 여기서 비용이란 상대적인 개념이기에 정확히 그것이 무엇을 의미하는지 알지
목한다. 하지만 분명한 것은 적은 비용이 보다 좋은 성능을 의미한다는 것이다.
종종 임시 테이블을 사용하여 많은 테이블들을 포함하는 복잡한 SQL 조인을 쪼개는 것이 효율적일
수도 있다. 예를 들면, 조인이 대량의 데이터가 있는 8개의 테이블을 포함할 때, 복잡한 SQL을 두
세개의 SQL로 쪼개는 것이 낫을 수 있다. 각각의 질의는 많아야 네개정도의 테이블들을 포함하며
중간 값을 저장 하는 것이 낫을 수 있다.

21. YOU CAN REACH THE SAME DESTINATION IN DIFFERENT WAYS.
많은 경우에, 하나 이상의 SQL문은 의도한 같은 결과를 줄 수 있다. 각각의 SQL은 다른 접근 경로
를 사용하며 다르게 수행한다. 예를들면, MINUS(-) 산술자는 WHERE NOT IN (SELECT ) OR
ERE NOT EXISTS 보다 더 빠르다.
예를들면, STATE와 AREA_CODE에 각각 다른 인덱스가 걸려 있다. 인덱스에도 불구하고 다음의 질의
는 NOT IN의 사용으로 인해 테이블 전체를 조사하게된다.
SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE STATE IN ('VA', 'DC', 'MD')
AND AREA_CODE NOT IN (804, 410);

그러나 같은 질의가 다음 처럼 쓰여진다면 인덱스를 사용하게 된다
SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE STATE IN ('VA', 'DC', 'MD')
MINUS
SELECT CUSTOMER_ID
FROM CUSTOMERS
WHERE AREA_CODE IN (804, 410);

WHERE절에 OR을 포함한다면 OR대신에 UNION을 사용할 수 있다. 그래서, SQL 질의를 수행하기
전에 먼저 실행계획을 조심스럽게 평가해야 한다. 이러한 평가는 EXPLAIN PLAN AND TKPROF를 이
용하여 할 수 있다.

22. USE THE SPECIAL COLUMNS.
ROWID AND ROWNUM 열을 이용하라. ROWID를 이용하는 것이 가장 빠르다.
예를들면, ROWID를 이용한 UPDATE는 다음과 같다.

SELECT ROWID, SALARY
INTO TEMP_ROWID, TEMP_SALARY
FROM EMPLOYEE;

UPDATE EMPLOYEE
SET SALARY = TEMP_SALARY * 1.5
WHERE ROWID = TEMP_ROWID;

ROWID값은 데이터베이스에서 언제나 같지는 않다. 그래서, SQL이나 응용 프로그램이용시 ROWID값
을 절대화 시키지 말라. 리턴되는 행들의 숫자를 제한 시키기위해 ROWNUM을 이용하라. 만약에 리턴
되는 행들을 정확히 모른다면 리턴되는 행들의 숫자를 제한하기위해 ROWNUM을 사용하라
다음의 질의는 100개 이상의 행들을 리턴하지는 않는다.
SELECT EMPLOYE.SS#, DEPARTMENT.DEPT_NAME
FROM EMPLOYEE, DEPENDENT
WHERE EMPLOYEE.DEPT_ID = DEPARTMENT.DEPT_ID
AND ROWNUM < 100;

23.함축적인 커서대신 명시적인 커서를 사용하라.
함축적 커서는 여분의 FETCH를 발생시킨다. 명시적 커서는 DECLARE, OPEN, FETCH와 CLOSE
CURSOR문을 사용하여 개발자에 의해서 생성된다. 함축 커서는 DELETE, UPDATE, INSERT와
SELECT문을 사용하면 오라클에 의해서 생성된다.

24.오라클 병렬 쿼리 옵션을 찾아서 이용하라.
병렬 쿼리 옵션을 사용하면, 보다 빠른 성능으로 SQL을 병렬로 실행할 수 있다.
오라클 7에서는, 오직 FULL TABLE SCAN에 기반한 쿼리만이 병렬로 수행될 수 있다.
오라클 8에서는, 인덱스가 분할되어있다면 INDEXED RANGE SCANS에 기반한 쿼리도 병렬로 처리될
수 있다. 병렬 쿼리 옵션은 다수의 디스크 드라이버를 포함하는 SMP와 MPP SYSTEM에서만 사용될
수 있다.

오라클 서버는 많은 우수한 특성을 가지고 있지만, 이러한 특성의 존재만으로는 빠른 성능을 보장하
지 않는다. 이러한 특성을 위해서 데이터베이스를 조정해야하며 특성을 이용하기 위해 특별하게 SQL
을 작성해야 한다. 예를 들면, 다음의 SQL은 병렬로 수행될 수 있다.

SELECT * --+PARALLEL(ORDERS,6)
FROM ORDERS;

25.네트웍 소통량을 줄이고 한번에 처리되는 작업량을 늘려라.
ARRAY PROCESSING과 PL/SQL BLOCK을 사용하면 보다 나은 성능을 얻을 수 있고 네트웍 소통량을
줄인다. ARRAY PROCESSING은 하나의 SQL문으로 많은 ROW를 처리할 수 있게 한다. 예를 들면,
INSERT문에서 배열을 사용하면 테이블내의 1,000 ROW를 삽입할 수 있다. 이러한 기술을 사용하면
주요한 성능 향상을 클라이언트/서버와 배치시스템에서 얻어질 수 있다.

복합 SQL문은 과도한 네트웍 소통을 유발할 수 있다. 그러나 만일 SQL문이 단일 PL/SQL 블록안에
있다면, 전체 블록은 오라클 서버에 보내져서 그곳에서 수행되고, 결과는 클라이언트의
APPLICATION에게 돌아온다.

개발자와 사용자는 종종 SQL을 데이터베이스에서 데이터를 검색하고 전송하는 간단한 방법으로 사용
한다. 때때로 직접적으로 SQL을 작성하지 않고 코드 발생기를 사용하여 작성한 APPLICATION은 심
각한 성능 문제를 일으킨다. 이러한 성능감퇴는 데이터베이스가 커지면서 증가한다.

SQL은 유연하기 때문에, 다양한 SQL문으로 같은 결과를 얻을 수 있다. 그러나 어떤 문은 다른 것보
다 더 효율적이다. 여기에 기술된 팁과 기법을 사용하면 빠르게 사용자에게 정보를 제공할 수 있는
APPLICATION과 리포트를 얻을 수 있다.

AND

1.튜닝의 순서
       가.튜닝 단계
               1)설계 튜닝
               2)어플리케이션 튜닝
               3)메모리 튜닝
               4)IO 튜닝
               5)경합 튜닝
               6)운영체체 튜닝

       나.핵심 튜닝 이슈
               1)훌륭한 초기설계
               2)역할을 분명하게 정의
               3)어플리케이션 튜닝 수행
               4)수치로 표현할 수 있는 목표 설정


2.오라클 트레이스(추적) 파일.얼러트(경고) 파일
       가.백그라운드 프로세스 추적파일 제어
               1)오라클 서버는 백그라운드 프로세스에 의하여 탐지된 오류에 관한 정보를 추적 파일에 모아 놓는다
               2)Oracle Support는 이들 추적 파일을 이용하여 문제를 진단하고 해결.
               3)사용자 SQL문 추적한다.

       나.오라클 대기 이벤트
               1)대기 이벤트를 수집하여 여러 이유로 기다려야 하는 세션에  대하여 정보를 얻을 수 있다.
               2)통계 이벤트 뷰
                       가)모든 세션에 대한 이벤트 총대기(V$System_Event)
                       나)기다려야 했던 각 세션에 대한 이벤트 대기(V$Session_Event)
                       다)대기중에 있는 현활동 세션에 대한 이벤트 대기 (V$Session_Wait)

       다.진단 정보
               1)추적 파일
                       가)경고 로그 파일
                       나)백그라운드 프로세스 추적 파일
                       다)사용자 추적 파일
               2)이벤트
                       가)오라클 대기 이벤트
                       나)OEM 이벤트

       라.얼러트(경고)로그 파일
               1)경고 로그 파일은 시간 순으로 생성된 메시지와 오류 로그로  구성되어 있다.
               2)경고 로그 파일을 정기적으로 검사
                       가)내부오류(ORA-600) 및 블록 파손 오류 탐지
                       나)데이터베이스 작업 감시
                       다)비 디폴트 초기화 파라미터 조회
               3)정기적 점검 후 삭제 및 정리

       마.백그라운드 프로세스 추적(Trace) 파일 제어
                 1)오라클 서버는 백그라운드 프로세스에 의하여 탐지된 오류에 관한 정보를 추적파일에 모아 놓는다.
               2)ORacle Support는 이들 추적 파일을 사용하여 문제 진단 및 해결
       바.사용자 추적(Trace) 파일
               1)서버 프로세스 추적은 다음에 의하여 세션 레벨이나 인스턴스 레벨에서 활성화 또는 비활성화 된다.
                       가)Alter Session 명령어
                       나)Set_SQL_TRACE_IN_SESSION 프로시저
                       다)초기화 파라미터 SQL_TRACE
               2)사용자 추적 파일은 다음의 내용을 포함
                       가)세션에 대해 추적된 SQL문에 관한 통계
               3)사용자 추적 파일은 SQL 튜닝에 유용
               4)오라클은 서버 프로세스 마다 사용자 추적 파일 생성
       바.오라클 대기 이벤트
               1)대기 이벤트를 수집하여 여러 이유로 기다려야 하는 세션에 관한 정보 습득
                       가)V$EVENT_NAME view:
                               -event#
                               -name
                               -parameter1
                               -parameter2
                               -parameter3
       

3.라이브러리 캐쉬 튜닝
       가.라이브러리 캐쉬
               1)사용자가 공유하는 SQL문과 PL/SQL 블록을 저장하는 사용
               2)LRU(최근 최저사용빈도) 알고리즘에 의하여 관리
               3)사용자가 이미 캐쉬에 존재하는 문장을 실행 시킬 경우, 오라클 서버는 문장의 구문을 재분석 하지 않고 캐쉬에 저장된 버전을 사용함.
               4)문장이 이미 캐쉬에 저장되어 있는가를 찾기 위해 오라클 서버는 다음 수행
                       가)ASCII 텍스트의 수치고 문장을 줄임
                       나)이 수치에 해시 함수 사용

       나.라이브러리 캐쉬 튜닝 : 구문 분석을 최소로 유지하여 실패 감소.
               1)사용자가 문장을 공유할수 있도록 화인
               2)충분한 공간을 할당하여 문장이 오래되어 삭제되지 않도록 예방
               3)무효가 되어 구문을 재분석 하지 않도록 예방

       다.다음을 통하여 단편화를 피함
               1)대용량의 메모리 요구에 대해 공간예약
               2)빈번하게 요구되는 큰 객체 고정
               3)익명의 큰 PL/SQL 블록 제거
               4)MTS 연결의 UGA 소모 감소
       라.라이브러리 튜닝을 위한 진단 툴들
               1)뷰의 설명
               2)V$SGASTST : 모든 SGA 구조의 크기
               3)V$LibraryCache : 라이브러리 캐쉬 관리에 관한 통계
               4)V$SQLAREA : 모든 공유 커서에 대한 전체 통계와 SQL 문의 처음 1000개의 문자
               5)V$SQLTEXT : 자르지 않은 전체 SQL 텍스트, 복수 행으로 표시
               6)V$DB_OBJECT_CACHE : 패키지 등 캐쉬에 저장된 데이터베이스 객체; 또한 SQL 문에서 참조는 테이블 또는 동의어 와 같은 객체

       마.V$LibraryCache 뷰를 통해 커서가 공유되고 있는가 확인 GETHITratio는 비율이 90대 후반의 값이어야 함. 그렇지 않을 경우 애플리케이션 코드의 효율성을 향상시켜야 함.

       바.라이브러리 캐쉬 재로드
               1)V$LibraryCache 뷰 : 이뷰는 이미 구문분석이 된 문장들이 캐쉬에서 오래되어 삭제되었는지의 여부를 표시
               2)RELOADS 수는 PINS 수의 1%를 넘어서는 안됨

       사.라이브러리 캐쉬 크기 조정
               1)내장 객체(패키지,뷰 등)에 필요한 글로벌 공간 정의
               2)일반적인 SQL문에 의해 사용되는 메모리 양 정의
               3)캐쉬 실패와 단편화를 피하기 위하여 대용량 메모리 요구에 대해 공간 예약
               4)자주 사용되는 객체 보관
               5)익명의 큰 PL 블록을 패키지된 함수를 호출하는 익명의 작은 블록으로 전환

       아.대용량 메모리 요구
               1)대용량의 연속 메모리 요구 요청 만족
               2)공유 풀 내에 단편화 가능성이 없는 메모리 예약




4.버퍼 캐쉬 튜닝
       가.튜닝 목표
               -물리적 I/O 작업은 많은 시간을 소요하고 CPU 요구를 증가시키기 때문에, 서버가 필요로 하는 대부분의 블록을 메모리에서 찾게 될 때 오라클 성능이 향상될 수 있습니다. 데이터베이스 버퍼 캐쉬를 측정하는 통계는 캐쉬 적중율입니다. 이 통계는 메모리에서 발견되는 블록의 수 대 액세스된 블록의 수의 비율입니다. 데이터베이스 버퍼 캐쉬가 너무 작을 때, 시스템은 너무 많은 I/O 작업을 수행하기 때문에 더 느려집니다.  

       나.버퍼 캐쉬는 I/O 성능에 결정적
       다.주요 튜닝 목표는 캐쉬 적용율 90%
       라.필요한대로 DB_BLOCK_BUFFER를 조정
       마.객체들을 복수 버퍼 풀에 분리
       바.테이블을 캐쉬



5.리두로그 버퍼 튜닝
       가.목적
               1)프로세스가 리두로그 버퍼의 공간을 기다리고 ㅇ있는지의 여부 결정
               2)리두로그 버퍼의 크기 적절하게 조정
               3)리두 작업 감소
       나.리두로그 버퍼 크기 조정
               1)LOG_BUFFER 파라미터
               2)디폴트값 : 특정 OS에 따라 다름, 일반적으로 4* 최대 블록 크기
               3)특히 트랜잭션이 길거나 많을 경우, 값이 클수록 로그 파일 I/O가 감소
               4)빈번한 COMMIT 문은 버퍼를 비우게 되어, 버퍼 크기가 더 작게 됩니다.

       다.NOLOGGING 사용하여 리두 작업 감소
               1)테이블, 파티션, 테이블스페이스, 인덱스에 적용
               2)리두 로그 버퍼에 있는 데이터에 대한 변경내역을 기록하지 않습니다
               3)INSERT 문 레벨에서 속성으로 지정되어 있지 않지만, 테이블, 파티션, 인덱스, 또는  테이블스페이스에 대해 ALTER나 CREATE 명령어를 사용할 때 지정
               4)이 모드는 로드 이전에 설정되며 로드가 완료될 때 LOGGING으로 재설정


출처:http://blog.naver.com/hwknoc?Redirect=Log&logNo=130006215316
AND

왜 Oracle 공부를 하는가?

Oracle은 Oracle Corporation이란 미국의 기업에서 만든 데이터 베이스 관리 시스템  입니다.
Oracle 은 Database 에서 가장 많이 쓰이며, 기능 또한 가장 좋은 것으로 알려진 최고의 Database 입니다.
Oracle 을 잘 다룬다고 하면 Database 에 대해서 전문적인 지식을 가지고 있다고 할 만큼 Database = Oracle 라는 인식이 저변에 확대되어 있는 것이 사실입니다.
기업의 정보와 데이터는 앞으로 더욱 더 많이 늘어나게 될 것 입니다.
이 수많은 정보를 효과적으로 관리하기 위해서는 Database라는 것이 꼭 필요 합니다.
Database 라는 것이 이제는 몰라서는 안 되는 IT 기술의 하나 이고,  Database를 사용하는 곳이 많다 보니, DBA의 중요성은 높아진다고 할 수 있습니다.
Database중에서도 가장 많이 사용하는 것이 Oracle 입니다.
물로 MS SQL Server나 Sybase, DB2들도 많이 사용하지만, 우리나라의 대기업에서는 Oracle을 많이 사용합니다.
Database와 같은 경우는 처음에 공부하기가 조금은 힘이 듭니다.
용어도 생소하고, 또한 개념 이해도 힘들기 때문에, 처음에 많은 시간을 투자하셔서 공부를 해야 후에 다른 어떤 Database를 접하게 되더라도  쉽게 이해 할 수 있습니다.
Oracle은 다른 Database보다 훨씬 복잡하고 많은 기능들이 있어서 처음에 공부하는 것이 다른 DB보다 조금은 힘이 듭니다.
하지만 Oracle DB를 이해하고 난 다음에 다른 DB를 공부하는면 좀더 쉽게 공부 할 수 있습니다.
공부를 하시면서 가장 중요한 것은
실습위주와 이해 위주의 공부를 하셔야 실력이 빠르게 향상될 수 있습니다.
열심히 하셔서 모두들 Oracle 도사가 되었으면 좋겠습니다.

OracleClub을 활용해서 스터디 시작하기

OracleClub.com은 Oracle 초보자와 중급자를 위한 사이트 입니다.
Oracle을 처음 시작하는 분들께 Oracle과 친해지기 위한 여러가지 강좌들을 제공하고 있습니다.
우선 Oracle을 처음 시작하시는 분이라면..
홈페이지 메뉴 중에서
Oracle -> Oracle 강좌 -> Oracle 기초

Oracle -> Oracle 강좌 -> SQL
강좌를 하나하나 따라하면서 실습하세요..
SQL을 어느 정도 이해하셨으면  
Oracle -> Oracle 강좌 -> PL/SQL
 강좌를 실습하시고요..
어느 정도 기초를 공부하신다음에..
Oracle -> Oracle 강좌 -> Admin
강좌를 공부하세요..
일반적으로 SQL -> PL/SQL -> Admin 그다음에 Tuning이나 Backup을 공부 합니다.
SQL과 PL/SQL 그리고 Admin모두 실습 위주로 공부를 해야 빨리 실력을 키울수 있습니다.
그리고 명령어 하나하나 실행하면서 어떨 때 이 명령어가 필요한지 이해를 꼭 하셔야 되고요..
이해위주와 실습위주로 공부하시면 정말 빨리 실력을 키울 수 있습니다.
어느 정도 기초를 공부하시고 난 다음에는 Admin을 많이 공부하세요.
Admin을 많이 알면 Tuning과 Backup 공부하기가 훨씬 수월합니다.

◈  Oracle 추천 문서

※ 인터넷에 공유된 문서중에서 읽을만한 문서들을 모와 봤습니다.

== 제가 정리한 OracleClub.com 강좌 파일 입니다 ==
SQL강좌
 홈페이지 오라클강좌 -> SQL강좌 정리파일입니다.
PL/SQL 강좌
 홈페이지 오라클강좌 -> PL/SQL강좌 정리파일입니다.

== 초급에서 중급정도 ==
  ☞ SQL &PL/SQL 강의
 SQL/PLSQL 이 문서 하나만 봐도 충분하겠네요..
 정말 정리가 잘되어 있습니다.
 자료출처 : 현대정보기술 오라클과정 교재
 => 개인학습용으로만 사용해 주세요, 저작권에 위배되면 삭제하겠습니다.
OTN에서 제공하는 초보자를 위한 오라클 강좌

== 중급이상 ==
대용량 데이터베이스 솔루션
 이화식씨가 대표로 있는(주)엔코아 정보 컨설팅에서 나온 자료 입니다.
 교육용으로 제작된 파워포인트 자료 인데요..
 제본이나 복사는 법으로 금지한다고 나와 있네용..
 프린트 뽑아서 보관해 둘만한 자료 입니다..
☞ 효율적인 오라클 데이타베이스 성능 관리 세미나II 자료 입니다.. 파일1
, 파일2
 튜닝 방법론 &SQL 처리구조
 인덱스/조인/정렬
 효율적인 SQL 및 고급 인덱스
 Oracle Optimizer
Backup &Recovery
  1.고려사항, 2.구조, 3.구성, 4.물리적백업, 5.복구이론, 6.장애, 7.완전복구, 8.불완전복구, 9.논린적복구
더 많은 자료는 오라클 자료실
을 참고하세요..

◈  Oracle책 추전

 제가 가지고 있는 책들도 있고. 서점에서 읽어본 책도 있습니다.
 제가 공부하면서 그래도 괜찮다고 생각된 Oracle 서적들 입니다. 개인적으로 추천하는 서적들 입니다.
 그리고 제가 추천하는 한가지는
오라클 정식 교재를 구해서 보세요..제본이라도 해서요.
 저는 OCP공부하면서 봤는데요.. 실무에서 사용할때 참고하기도 좋고.. 많은 도움이 됩니다.

Oracle Bible Ver.8 X 2E [영진.com]
김종근, 송건철, 홍준호 저 / 국내서 / 2001-12-10

제가 오라클을 시작할때 처음으로 접한 서적입니다. 지금은 두번째 개정판인데요..
초보자들에게 권하는 책이죠.. 중급자 이상은 절대 구입하지 마시고요.
오라클에 대한 전반적인 내용이 소개되어 있습니다.
전체적으로 오라클을 이해할 수 있는 서적이라 생각 됩니다.

오라클(Oracle) 프로젝트 실무 - 기초에서 실무개발자로 [구민사]
이공명 저 / 국내서 / 2002-11-06

초/중급들이 쉽게 공부할 수 있는 책이라 생각됩니다.
실습하면서 쉽게 공부 할 수 있는 책입니다. 초보자들은 서점가서 한번 구경해보세요.
참고로 전 이책은 구입하지 않고 서점에서 읽기만 했습니다.

about Oracle9i PL/SQL [영진.com]
이태윤 저 / 국내서 / 2002-11-11

초급자를 벗어나
중급자로 가는 단계에서
PL/SQL을 자세히 공부하고 싶은 분들한테 추천합니다.
PL/SQL관련 유용한 내용들이 많이 있고요.. 조금은 딱딱한 내용도 있네요..

Advanced Oracle Database 활용과 튜닝 [영진.com]
임호진 저 / 국내서 / 2003-03-15

중급자이상의 실력을 가진분에게 추천 합니다.
오라클에 관한 전반적인 이해정도에서 전문가 정도의 수준으로 공부 하고싶은 분들은 보세요.
좋은 내용들이 많이 있는거 같습니다.

오라클사의 대표적 DB자격증인 OCP자격증는 국제자격증 중에서 상위의 가치를 가지고 있는 자격증입니다. OCP자격증을 따기 위해서는 오라클본사에서 하는 공인교육 또는 오라클사가 위탁한 교육기관(오라클공인교육기관,오라클WDP공인교육기관)에서 1과목 이상 수강을 해야 자격증이 인증이 됩니다.
공인교육기관에서 OCP자격증 4과목을 수강하려면 약 300여만원의 비용이 듭니다.한 과목당 $80 이기 때문에 회사에서 교육지원을 해주는 직장인을 제외하고는 부담을 느끼게 됩니다. 그래서 사람들이 많이 찾는 것이 오라클 WDP공인교육기관입니다.
서울에 2군데정도의 오라클WDP공인교육기관이 있는데, WDP란 취업을 위해 오라클자격증인 OCP자격증을 취득하려는 사람들에게 저렴한 가격으로 OCP교육을 하는 곳입니다.
OCP자격증은 재직자환급혜택이 적용되지 않는 단점이 있지만, 취득후의 이점을 생각해 보면 한번쯤 도전해볼만한 가치를 가진 자격증입니다.그리고 개인환급을 통해서 오라클을 공부하게되면 재직자환급만큼의 환급을 받을수 있기때문에 교육받는데 무리가 없습니다.
OCP 4과목(PL/SQL, FUNDAMENTAL 1|2, PERFORMANCE TUNNING)중 2과목을 패스하면 OCA라는 자격이 주어지고, 4과목을 패스하면 비로소 OCP자격증이 인증됩니다. OCP 윗단계 자격증으로는 OCM이라는 자격증이 있는데, OCM자격증은 우리나라에서 취득할 수 없습니다. 그리고 OCM은 현재 국내의 50여명의 소수만 취득한 자격증으로 고난이도를 자랑합니다.
OCP버젼은 현재 10g버젼이 나왔지만, 아직까지 실무에서 널리 쓰이는 것은 OCP-DBA 9i버젼입니다.개인적으로 많이 쓰이는 버젼은 OCP-DBA 8i정도이고 현장에서 쓰이는 버젼은 OCP 9i가 대표적입니다.
정보통신부에서도 50%이상의 서버가 오라클로 이루어져있기 때문에 OCP자격증 취득자를 대우하고 있는 형편입니다.많은 사람들이 인터넷에서 OCP학원을 검색하는데, 오라클 코리아에 들어가서 공인된 교육기관이 어디인지 확인한 후 OCP교육을 받아야 나중에 다시 교육받는 일 없이 자격증을 취득할 수 있습니다.
OCP자격증이 DB자격증이기 때문에 보안과정에서 필수적으로 공부해야 하는 자격증이기도 합니다. 서버보안에 관련하여 오라클OCP또는 리눅스 LPIC를 선택하는 사람들이 많고 그러한 공부를 하기 위해서 국제공인시험센터(www.hacker-academy.co.kr)등의 IT전문교육센터를 찾는 것이 보편화 되어 있습니다.
특히 오라클자격증을 불만업이 공부할 수 있는 곳이 강남의 국제공인시험센터(www.hacker-academy.co.kr)인데, 이곳은 2005년 오라클자격증 OCP취득률 1위의 오라클WDP공인교육기관으로 전임강사를 OCM취득자를 고용하는 등 교육적인 질면에서는 국내 어느 교육기관보다 높다고 할 수 있습니다.
오라클자격증인 OCP는 고용보험혜택이 되지는 않지만, 오라클WDP공인교육기관에서 공부하게 되면 저렴하게 공부할 수 있고, 개인환급을 통해 교육비적인 부담을 줄일 수 있습니다. 그리고 개인의 몸값을 높히기 위해서라면 어느정도의 투자는 각오하고 공부를 하는 것이 OCP자격증뿐만 아니라 기타 국제공인자격증(MCSE,CCNA,CCNP,SCJP,SCJD,SCSA,CISSP,CISA,SIS등)을 취득하는데 마음가짐을 새롭게 할 수 있을 것입니다.
오라클자격증 OCP는 JAVA자격증인 SCBCD(EJB)와 상호 연관이 많이 되는것에 착안하여 OCP와 EJB를 공부하게 되면 진로나 취업에서 많은 부분 유리하게 됩니다.

출처:http://blog.naver.com/vmflqkdl?Redirect=Log&logNo=20022409912

AND

select * from emp group by job having (select avg(sal) from emp group by job);

select job, avg(sal) as asal from emp e, (select job, avg(sal) as asal from emp group by job) a where e.asal
select e.job, e.asal from (select job, avg(sal) as asal from emp group by job) e, (select min(avg(sal)) a_sal from emp group by job) a where e.asal=a.a_sal;

select job, avg(sal) from emp group by job having avg(sal)=(select min(avg(sal)) from emp group by job);
//직업별 평균급여중 최소값

select ename, job, dname, loc from (select ename, job, deptno, empno from emp where job='MANAGER') e join dept d on e.deptno=d.deptno;
//직업이 MANAGER인 사람의 이름 직업 부서명 지역명

select ename, e.job, sal from (select job, min(sal) msal from emp group by job) m, emp e where e.job=m.job and sal=msal;

select ename, e.job, sal from (select job, min(sal) msal from emp group by job) m join emp e on e.job=m.job and sal=msal;
//업무별 최소급여를 받는 사람

select ename, sal from emp e where sal>(select avg(sal) from emp where e.deptno=deptno)
//효율이 떨어짐.. 10000x100

select ename, hiredate from emp where deptno=(select deptno from emp where ename='BLAKE');

select ename, job, sal from emp where deptno=(select deptno from dept where loc='DALLAS');
//달라스에 근무하는 사람들

select ename, job, sal from emp e join dept d on e.deptno=d.deptno and loc='DALLAS';
//구지 조인할필요가 없음
//효율이 떨어짐

select ename, job, sal, mgr, empno from emp
where mgr in (select ename, job, sal, mgr, empno from emp
where mgr in (select empno from emp where ename='KING'));

select * from emp where (job, sal) IN(select job, sal from emp where ename='FORD') and ename !='FORD';
//포드와 월급과 직업이 같은 사람을 출력
//본인 제외
select ename, job, sal from emp where job=(select job from emp where ename='JONES') or sal>=(select sal from emp where ename='FORD') order by job, sal desc;
//존과 직업이 같거나 포드보다 월급이 많은사람

select ename, job, sal from emp where sal in (select sal from emp where ename in ('SCOTT','WARD')) and ename not in ('SCOTT','WARD');
//스캇과 워드와 같은 월급 받는 사람

select ename, job, deptno from emp where job in (select job from emp natural join dept where loc='CHICAGO');
//하나로 처리
//주의!!

select * from emp where mgr=(select mgr from emp where ename='BLAKE') and ename!='BLAKE';
//BLAKE와 같은 상사를 가진 사람

select * from emp e where 5>(select count(*) from emp where sal>e.sal) order by sal desc;
//급여가 많은 순서로 5명 출력


select rownum, empno, ename, sal from emp;
//rownum 숨겨진 컬럼명
//
select rownum, empno, ename, sal from emp order by sal;

select rownum, empno, ename, sal from emp where rownum<=5 order by sal desc;

//rownum은 PK를 따라다님

select * from(select rownum, empno, ename, sal from emp order by sal desc) where rownum<=5;
//따라서 월급에 따라 정렬한 뷰를 만들어서 rownum을 호출하면 정렬된 순서대로 가져올 수 있다.!!!!!!!



**PLSQL**


ed
RUN(/)

>ed a
select * from emp; //<--작정 a라는 SQL 문

>/ //이전에 실행했던 SQL문 실행
>@a //a라는 SQL문 실행

>ed b
select * from emp; //<--작성 b라는 SQL 문

>/ //이전에 실행했던 SQL문 실행
>@b //b라는 SQL문 실행

>ed //버퍼영역 재실행
select ename from emp; //버퍼영역수정
>/
>@b //b는 수정되지 않은 dept가 실행

>ed b //<--기본확장자 SQL
select ename, sal from emp; //b를 수정
>@b //b를 실행

>get a //a를 버퍼로 불러옴
>/ //버퍼에 있는 a내용 실행
//위의 두개는 @a

>select empno, ename, sal, sal*12 from emp;
>save c:\c //버퍼의 내용을 c:\c.sql로 저장

>ed w
set linesize 120
set pagesize 50
/
>@W /저장해서 쓰면 편함
//



>select empno, ename
2 from emp
3 where deptno=10;
>L(ist)
>3
>L

>C/10/20 //바꾸기 10을 20으로(deptno)
>L
>1
>L
>A ,sal,job //추가 ,sal,job을 추가
>L

>del 3 //3행을 없앰
>L
>3 where sal>2000
4 //3수정후 엔터치면 4로..
>L

>2
>A join dept //추가 join dept
>L

>2
>i //input
>3i on emp.deptno=dept.deptno //세번째줄로 추가됨(2다음)
AND

select RPAD(RPAD(ename||' '||sal,15,' '),(sal/100)+15,'*') from emp;

select ename, job, dname, loc from emp e join dept d on e.deptno=d.deptno and ename like '%L%';

select ename, job, dname, loc from emp e natural join dept d where ename like '%L%';

select e.ename, sal, s.grade from emp e join salgrade s on sal between losal and hisal;



s1 (union all) s2 = a+b+b+c //중복해서 표시
s1 union s2 = a+b+c
s1 minus s2 = a
s1 intersect s2 = b

select ename, sal job from emp where ename like '%S%' //A
select ename sal, null(개수맞추기) from emp where ename like '%S%' //B

A minus B

20번 부서 이름 급여 부서 업무
2000이상 이름 급여 부서 업무


select e.empno, e.ename, e.mgr, m.ename from emp e join emp m on e.mgr=m.empno;

select e.empno, e.ename, e.mgr, m.ename from emp e left outer join emp m on e.mgr=m.empno;

select e.empno, e.ename, e.mgr, m.ename from emp e right outer join emp m on e.mgr=m.empno;

select e.empno, e.ename, e.mgr, m.ename from emp e full outer join emp m on e.mgr=m.empno;

select e.empno, e.ename, d.dname, d.loc, sal, grade from emp e join dept d on e.deptno=d.deptno join salgrade on sal between losal and hisal;
//세개 테이블 조인!!!!

select e.empno, e.ename, e.mgr, m.ename, d.dname from emp e full outer join emp m on e.mgr=m.empno join dept d on e.deptno=d.deptno;

select m.empno, m.ename, e.empno, e.ename from emp m join emp e on m.empno=e.mgr join dept d on d.deptno;
//
select e.empno, e.ename, m.empno, m.ename, d.dname from emp e full outer join emp m on e.mgr=m.empno join dept d on m.deptno=d.deptno;
//조건기술이 중요!!!!!
emp e right outer join emp m on e.mgr=m.empno left outer join dept d on e.deptno=d.deptno;

from emp e join dept d on e. deptno= d.deptno right outer join emp m on e. mgr=m.empno;
//조인 순서..가 다름!!!!!



select empno, ename, sal, job from emp where sal>3000;
select sal from emp where ename='SCOTT'; //3000
//합치면
select empno, ename, sal, job from emp where sal>(select sal from emp where ename='SCOTT');
//서브쿼리

select a.empno, a.ename, a.sal, a.job, b.ename, b.sal from emp a join emp b on a.sal > b.sal and lower(b.ename)=lower('scott');
//급여가 스캇의 급여보다 많이 받는 사번, 이름, 급여, 업무

select a.empno, a.ename, a.sal, a.job from emp a join emp b on a.job = b.job and lower(b.ename)=lower('scott');
select empno, ename, sal, job from emp where job=(select job from emp where ename='SCOTT');
//스캇의 업무와 같은 사람표시

select ename, job, sal from emp where job=(select job from emp where ename='SMITH') or sal>(select sal from emp where empno=7499);

select a.empno, a.ename, a.sal, a.job from emp a join emp b on (a.job = b.job and lower(b.ename)=lower('SMITH')) or (a.sal>b.sal and b.empno=7499);
//스미스와 업무가 같거나 7499의 급여보다 많이 받는 사람





select count(*), count(comm), avg(comm), count(distinct deptno) from emp;


select count(*), avg(sal), min(sal), max(sal), sum(sal) from emp group by deptno order by sum(sal) desc;

select deptno, avg(sal), max(sal), min(sal) from emp where sal>=2900 group by deptno;


select empno, ename, sal, job, deptno from emp where deptno=(select distinct deptno from emp where job='CLERK');
//두줄이상이 리턴되어 에러
select empno, ename, sal, job, deptno from emp where deptno in (select distinct deptno from emp where job='CLERK');
//IN을 사용해서 해결

단일행 연산자 비교시 >,=,<
복수행 연산자 비교시 in, any, all, exist


select empno, ename, sal, dname from emp natural join dept where sal>(select min(sal) from emp where deptno=10);
//10번 부서의 최소급여보다 많이 받는 사번 이름 급여 부서

//any (or)
//all (and) 연산자포함
//효율적이지 못함

select empno, ename, sal, dname from emp natural join dept where sal//10번 부서의 최대급여보다 적게 받는 사번 이름 급여 부서

select empno, ename, sal, dname from emp natural join dept where sal//10번 부서의 최소급여보다 적게 받는 사번 이름 급여 부서

select empno, ename, sal, dname from emp natural join dept where sal>any(select sal from emp where deptno=10);
//보다 효율적!!!!

select ename, job from emp where empno=any(select mgr from emp);
//관리자만
select ename, job from emp where empno=any(select distinct mgr from emp);
select ename, job, mgr from emp where empno not in(select distinct NVL(mgr,empno) from emp);
//말단사원만
//mgr중 NULL이 들어있으므로 not in 연산시 true와 NULL의 AND연산시 NULL이 되므로 값이 반환되지 않는다.
//표 참조
//NVL함수를 사용해서 실수값을 할당해야만 한다.!!!!
//
select ename, job, mgr from emp where empno e exists (select mgr from emp where e. empno=mgr);
//비효율적임

SELECT ename, sal, job, deptno from emp where job=(select job from emp where ename='SMITH') and deptno=(select deptno from emp where ename='SMITH');
//SMITH 와 급여가 같으면서 부서가 동일 사람

SELECT ename, sal, job, deptno from emp where job||deptno=(select job||deptno from emp where ename='SMITH');
//꽁수
select ename, job, deptno from emp where (job, deptno) in (select job, deptno from emp where ename='SMITH');

select empno, ename, deptno, sal, comm from emp where (sal,NVL(comm,-1)) in (select sal, NVL(comm,-1) from emp where deptno=30);
//()로 묶는것이 포인트.. N:N비교


01
select empno, ename, job, hiredate, sal from emp where job=(select job from emp where empno=7521) and sal>(select sal from emp where empno=7934);
02
select empno, ename, job, sal, deptno from emp where sal<(select avg(sal) from emp);
03
select deptno, min(sal) from emp group by deptno having min(sal)>(select min(sal) from emp where deptno=20);
04
select e.job, e.asal from (select job, avg(sal) as asal from emp group by job) e, (select min(avg(sal)) a_sal from emp group by job) a where e.asal=a.a_sal;

select job, avg(sal) from emp group by job having avg(sal)=(select min(avg(sal)) from emp group by job);
05
select empno, ename, job, hiredate, sal, deptno from emp where sal in (select min(sal) from emp group by job);
06
select empno, ename, job, hiredate, sal, deptno from emp where sal > any (select sal from emp where deptno=30) and deptno != 30;
//***
07
select empno, ename, job, hiredate, sal deptno from emp where sal>all(select sal from emp where deptno=30) and deptno!=30;
//***
08
select empno, ename, job, hiredate, sal, deptno from emp where empno in (select NVL(mgr,0) from emp);
select empno, ename, job, hiredate, sal, deptno from emp e where exists (select * from emp where e.empno=mgr);
//****

09
select ename, deptno, sal, comm from emp where (sal,comm) in (select sal, comm from emp where deptno=30);
//***
10
select empno, ename, job, sal, deptno from emp where sal in (select min(sal) from emp group by job) order by job;
11
select ename, deptno, sal, comm from emp where (sal, NVL(comm,0)) in (select sal, NVL(comm,0) from emp where deptno=30);
12
select empno, ename, job, sal, deptno from emp where (job, sal) in (select job, min(sal) from emp group by job ) order by job;
13
select e.ename, e.job, d.dname, d.loc from emp e, dept d where e.deptno=d.deptno and e.job='MANAGER';
14
select ename, job, dname, loc from (select deptno, ename, job from emp where job='MANAGER') e , dept d where e.deptno=d.deptno;

select ename, job, dname, loc from (select ename, job, deptno from emp where job='MANAGER') e join dept d on e.deptno=d.deptno;

01
select ename, hiredate from emp where deptno=(select deptno from emp where ename='BLAKE');
02
select empno, ename from emp where sal>(select avg(sal) from emp) order by sal desc;
03
select empno, ename, sal, deptno from emp where deptno in (select deptno from emp where ename like '%T%');
04
select ename, job, sal from emp where deptno=(select deptno from dept where lower(loc)=lower('dallas'));
05
select ename, sal, mgr from emp where mgr=(select empno from emp where ename='KING');
06
select ename, job from emp where deptno=(select deptno from dept where dname='SALES');
07
select ename, deptno, sal from emp where sal>(select min(sal) from emp where deptno=30);
08
select * from emp where deptno=10 and job in (select job from emp where deptno=30);
09
select * from emp where (job, sal) in (select job, sal from emp where ename='FORD');
10
select * from emp where job=(select job from emp where ename='JONES') or sal>=(select sal from emp where ename='FORD') order by job, sal desc;
11
select ename, job, sal from emp where sal in (select sal from emp where ename in ('SCOTT','WARD'));
12
select ename, job from emp where job in (select job from emp where deptno=(select deptno from dept where loc='CHICAGO'));
13. EMP 테이블에서 부서별로 월급이 평균 월급보다 높은 사원을 부서번, 이름, 급여를 출력하는 SELECT 문을 작성하시오.
select e.deptno, e.ename, e.sal, e.job, a.a_sal "jobsalavg" from emp e, (select deptno, avg(sal) as a_sal from emp group by deptno) a where a.deptno=e.deptno and e.sal>a.a_sal;

14. EMP 테이블에서 업무별로 월급이 평균월급보다 낮은 사원을 부서번호, 이름, 급여를 출력하는 SELECT 문을 작성하시오.
select e.deptno, e.ename, e.sal, e.job, a.a_sal "jobsalavg" from emp e, (select job, avg(sal) as a_sal from emp group by job) a where a.job=e.job and e.sal>a.a_sal;
//핵심은 알리아스!!!!
15
select job, ename, empno, deptno from emp where empno in (select distinct NVL(mgr,0) from emp);

16
select empno, ename, job, deptno from emp where empno not in (select distinct NVL(mgr,0) from emp);
AND