본문 바로가기
카테고리 없음

ORACLE 5

by Real Iron 2007. 3. 29.

문제1) emp 테이블에서

          현재 날짜, 입사일,

          scott 사원이 입사한 날부터 현재까지 근무한 날수를 출력


SQL> SELECT SYSDATE, HIREDATE, SYSDATE-HIREDATE
  2  FROM EMP                                     * DUAL은 조건절을 사용할수 없다.??? 확인요망.
  3  WHERE ENAME='SCOTT'
  4  ;

SYSDATE  HIREDATE SYSDATE-HIREDATE
-------- -------- ----------------
07/03/28 87/04/19       7283.60706


SQL>SELECT SYSDATE, HIREDATE, MONTHS_BETWEEN(SYSDATE,HIREDATE)
  2  FROM EMP
  3  WHERE ENAME='SCOTT'
  4  ;
SYSDATE  HIREDATE MONTHS_BETWEEN(SYSDATE,HIREDATE)
-------- -------- --------------------------------
07/03/28 87/04/19                       239.309944



문제2) 시간을 보고 싶다.

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YY/MM/DD HH:MI:SS'
  2  ;

세션이 변경되었습니다.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-----------------
07/03/28 02:42:17


문제3) 시간을 24시간으로 보고 싶다.

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
  2  ;

세션이 변경되었습니다.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
2007/03/28 14:44:35




31PAGE


예제1) 오전, 오후를 표기하는 방법


SQL> ALTER SESSION SET NLS_DATE_FORMAT='YY/MM/DD HH:MI:SS AM';

세션이 변경되었습니다.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
----------------------
07/03/28 03:00:10 오후


예제2) 달과 서기 추가


SQL> ALTER SESSION SET NLS_DATE_FORMAT='YY/MON/DD HH:MI:SS BC';

세션이 변경되었습니다.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------------
07/MAR/28 03:01:30 서기


예제3)

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YY/MONTH/DD HH:MI:SS BC';

세션이 변경되었습니다.

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------------------
07/MARCH    /28 03:03:15 서기



* 일시적이다. 다른 창을 불러 왔을 때 적용 안된다.



예제1) ROUND(날짜,'DD') / ROUND(날짜,'MM' /ROUND(날짜,'YY')을 이용


SQL> SELECT SYSDATE, ROUND(SYSDATE,'DD') FROM DUAL;

SYSDATE  ROUND(SY
-------- --------
07/03/28 07/03/29

* 시간을 기준으로 바뀐다. 현제가 오후이기 때문에 다음날로 바뀐다.


SQL> SELECT SYSDATE, ROUND(SYSDATE,'DD'), ROUND(SYSDATE,'MM'), ROUND(SYSDATE,'YY') FROM DUAL;

SYSDATE  ROUND(SY ROUND(SY ROUND(SY
-------- -------- -------- --------
07/03/28 07/03/29 07/04/01 07/01/01

SQL>




* ROUND : 15일 이상이면 다음달 1일

* ROUND : 6월 이상이면 다음년 1일

* TRUNC :날-> 그날자정 / 월 -> 그달 1일 / 년 -> 금년 1월1일


예제1) TRUNC 사용


SQL> SELECT TRUNC(SYSDATE,'DD'), TRUNC(SYSDATE,'MM'), TRUNC(SYSDATE,'YY') FROM DUAL;

TRUNC(SY TRUNC(SY TRUNC(SY
-------- -------- --------
07/03/28 07/03/01 07/01/01


* ROUND,TRUNC 보험 가입한 날짜 4시간이후 적용됩니다. 일괄적으로 절삭이나 반올림 할 때 사용



데이터 타입의 변환


명시적 데이터 타입의 변환

* 일시적으로 날짜 타입을 문자 형태로 변형 ->변환함수


TO_CHAR(날짜,'~~~;)


예제1)

SQL> SELECT SYSDATE, TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS')
  2  FROM DUAL
  3  ;

SYSDATE  TO_CHAR(SYSDATE,'YY
-------- -------------------
07/03/28 2007/03/28 15:25:22


예제2)

SQL>SELECT SYSDATE, TO_CHAR(ROUND(SYSDATE),'YYYY/MM/DD HH24:MI:SS'), TO_CHAR(TRUNC(SYSDATE), 'YYYY/MM/DD HH24:MI:SS')
  2* FROM DUAL
  3  ;

SYSDATE  TO_CHAR(ROUND(SYSDA TO_CHAR(TRUNC(SYSDA
-------- ------------------- -------------------
07/03/28 2007/03/29 00:00:00 2007/03/28 00:00:00

SQL>


* 함수 안에 함수가 존재하면 가장 안에 있는 함수 부터 적용된다.




문제1) SCOOT  사원의 입사일을

          반올림하여 출력하시오

SQL>

 SELECT HIREDATE, ROUND(HIREDATE,'MM')
  2  FROM EMP
  3* WHERE ENAME='SCOTT'
  4  ;

HIREDATE ROUND(HI
-------- --------
87/04/19 87/05/01


예제1)

 SQL> SELECT HIREDATE, ROUND(HIREDATE,'MM'), TO_CHAR(ROUND(HIREDATE,'MM'),'YYYY/MM/DD HH24:MI:SS CC')
  2  FROM EMP
  3* WHERE ENAME='SCOTT'
  4  ;

HIREDATE ROUND(HI TO_CHAR(ROUND(HIREDATE
-------- -------- ----------------------
87/04/19 87/05/01 1987/05/01 00:00:00 20



묵시적인 데이터 타입 변환


문법)

WHERE A=B

A컬럼의 데이터 다입이 문자=숫자 - > 문자 타입이 NUMBER 형변환

유형부터 확인해야 한다.


문제1) WHERE  NUMBER 타입의 칼럼 = 문자 타입의 상수값

          10 번 부서의                     * 조건

          사원이름, 부서 번호 출력    * 출력


* 묵시적 방법

SQL> SELECT ENAME, DEPTNO
  2  FROM EMP
  3  WHERE DEPTNO='10'   * 숫자 이기 때문에 '' 가 없어야 되지만 묵시적으로 변형이 된것이다.
  4  ;

ENAME          DEPTNO
---------- ----------
CLARK              10
KING               10
MILLER             10


* 명시적 방법

SQL> SELECT ENAME, DEPTNO
  2  FROM EMP
  3  WHERE DEPTNO=TO_NUMBER('10')
  4  ;

ENAME          DEPTNO
---------- ----------
CLARK              10
KING               10
MILLER             10



*형 변환 함수들


NUMBER       CHAR       DATE

              <- TO_NUMBER

                             -> TO_DATE

              ->TO_CHAR

                             <- TO_CHAR




문제2)  사원명, 업무, 급여, 급여 *12 연봉도 출력

           급여을 $와 , 를 이용하여 변환

SQL>SELECT ENAME, JOB, SAL,TO_CHAR(SAL,'$99,999'), SAL*12 "연봉", TO_CHAR(SAL*12,'$99,999')
  2* FROM EMP
  3  ;

ENAME      JOB              SAL TO_CHAR(       연봉 TO_CHAR(
---------- --------- ---------- -------- ---------- --------
SMITH      CLERK            800     $800       9600   $9,600
ALLEN      SALESMAN        1600   $1,600      19200  $19,200
WARD       SALESMAN        1250   $1,250      15000  $15,000
JONES      MANAGER         2975   $2,975      35700  $35,700
MARTIN     SALESMAN        1250   $1,250      15000  $15,000
BLAKE      MANAGER         2850   $2,850      34200  $34,200
CLARK      MANAGER         2450   $2,450      29400  $29,400
SCOTT      ANALYST         3000   $3,000      36000  $36,000
KING       PRESIDENT       5000   $5,000      60000  $60,000
TURNER     SALESMAN        1500   $1,500      18000  $18,000
ADAMS      CLERK           1100   $1,100      13200  $13,200

JAMES      CLERK            950     $950      11400  $11,400
FORD       ANALYST         3000   $3,000      36000  $36,000
MILLER     CLERK           1300   $1,300      15600  $15,600

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


* # 표시는 데이터 값이 표시 값보다 많을때 표시 된다.




TO_DATE : 문자를 날짜 타입으로 변환(문자열을 DATE 타입의 컬럼에 값을 입력)

               

예제1)

SQL> SELECT TO_DATE('21-JUL-07','DD-MM-YY') FROM DUAL;

TO_DATE(
--------
07/07/21


NVL함수


문제1) 사원명, 급여, 커미션, 커미션 NULL이면 0



SQL> SELECT ENAME, SAL, COMM, NVL(COMM,0)
  2  FROM EMP
  3  WHERE DEPTNO=10
  4  ;

ENAME             SAL       COMM NVL(COMM,0)
---------- ---------- ---------- -----------
CLARK            2450                      0
KING             5000                      0
MILLER           1300                      0

NVL2 함수


문법)

NVL2(표현식1, 표현식2, 표현식3)

첫번째 인수값이 NULL 아니면 두번째 인수값이 출력

                       NULL 이면    세번째 인수값이 출력


문제1) 사원명, 업무, 급여, 커미션

          커미션이 널이 아니면 SAL+COMM

                       널이면        SAL            출력


SQL> SELECT ENAME, JOB, SAL, COMM, NVL2(COMM, SAL+COMM, SAL)
  2  FROM EMP
  3  ;

ENAME      JOB              SAL       COMM NVL2(COMM,SAL+COMM,SAL)
---------- --------- ---------- ---------- -----------------------
SMITH      CLERK            800                                800
ALLEN      SALESMAN        1600        300                    1900
WARD       SALESMAN        1250        500                    1750
JONES      MANAGER         2975                               2975
MARTIN     SALESMAN        1250       1400                    2650
BLAKE      MANAGER         2850                               2850
CLARK      MANAGER         2450                               2450
SCOTT      ANALYST         3000                               3000
KING       PRESIDENT       5000                               5000
TURNER     SALESMAN        1500          0                    1500
ADAMS      CLERK           1100                               1100

JAMES      CLERK            950                                950
FORD       ANALYST         3000                               3000
MILLER     CLERK           1300                               1300

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


 

--  한줄 주석

/*   한줄 이상의 내용    */


COALESCE(표현식1,표현식2,.......표현식N)

첫번째 인수가          NULL이 아니면     첫번째 인수값을

                             NULL이면            두번째 인수값을

두번째 인수도          NULL이면            세번째 인수값을

세번째 인수도          NULL이면            네번재 인수값을

... NULL이 아닐때 까지 뒤의 값을 인식 하며 NULL 이면 N번째 인수값을 출력

첫번째 와 두번째가   NULL이면            N번째 인수값을 출력



문제1) 사원면, 커미션, 급여

          커미션이 NULL이 아니면 커미션을

                       NULL이면 급여를                 출력


SQL> SELECT ENAME, COMM, SAL, COALESCE(COMM,SAL)
  2  FROM EMP
  3  ;

ENAME            COMM        SAL COALESCE(COMM,SAL)
---------- ---------- ---------- ------------------
SMITH                        800                800
ALLEN             300       1600                300
WARD              500       1250                500
JONES                       2975               2975
MARTIN           1400       1250               1400
BLAKE                       2850               2850
CLARK                       2450               2450
SCOTT                       3000               3000
KING                        5000               5000
TURNER              0       1500                  0
ADAMS                       1100               1100

JAMES                        950                950
FORD                        3000               3000
MILLER                      1300               1300

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



예제1) DATE 입력

     INSERT INTO EMP(EMPNO, ENAME, COMM, SAL)

     VALUES(777,'김진철',NULL,NULL);   * DATE 입력


SAL가 NULL 사원을 검색

SQL> SELECT EMPNO, ENAME, COMM, SAL
  2  FROM EMP
  3  WHERE SAL IS NULL;

     EMPNO ENAME            COMM        SAL
---------- ---------- ---------- ----------
       777 김진철



문제3) 커미션이 확정되었으면 커미션을

                       미확정되었으면 급여를

          급여도    미확정 되었으면 0을 출력하여

          사원면, 커미션, 급여와 더불어 출력하시오


SQL> SELECT ENAME, COMM, SAL, COALESCE(COMM,SAL,0)
  2  FROM EMP
  3  ;

ENAME            COMM        SAL COALESCE(COMM,SAL,0)
---------- ---------- ---------- --------------------
SMITH                        800                  800
ALLEN             300       1600                  300
WARD              500       1250                  500
JONES                       2975                 2975
MARTIN           1400       1250                 1400
BLAKE                       2850                 2850
CLARK                       2450                 2450
SCOTT                       3000                 3000
KING                        5000                 5000
TURNER              0       1500                    0
ADAMS                       1100                 1100

JAMES                        950                  950
FORD                        3000                 3000
MILLER                      1300                 1300
김진철                                              0

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






NULLIF(표현식1, 표현식2)

두개의 표현식값이 동일하면 NULL,           

                          불일치 하면 첫번째 인수값이 출력



문제1) 사원번호, 사원명, 커미션 출력

          커미션이 0  이면 NULL로 표현


SQL> SELECT EMPNO, ENAME, COMM, NULLIF(COMM,0)
  2  FROM EMP
  3  ;

     EMPNO ENAME            COMM NULLIF(COMM,0)
---------- ---------- ---------- --------------
      7369 SMITH
      7499 ALLEN             300            300
      7521 WARD              500            500
      7566 JONES
      7654 MARTIN           1400           1400
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER              0
      7876 ADAMS

      7900 JAMES
      7902 FORD
      7934 MILLER

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




* 오늘 가장 중요한 함수 변환 함수.묵시적이 아닌 명시적 변환 중요

   날짜 출력 형식의 종류 참고, 숫자를 문자 형식으로 변환 참고