[오라클] null 은 연산 안됨, 문자, 날짜, 연산자, 정렬함수
본문 바로가기
IT. 컴퓨터

[오라클] null 은 연산 안됨, 문자, 날짜, 연산자, 정렬함수

by 솔기잇 2020. 6. 6.

NULL 존재하지 않는 값이므로 연산에 사용할 없다.

SELECT 1+2+3+4+5, 5-2, 5*2, 5/2

FROM DUAL;

 

SELECT 1+2+3+4+5, 5-NULL, 5*NULL, 5/1, 5/NULL

FROM DUAL;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE COMM =0;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE COMM IS NULL;  -- = 대신 IS 해서 쓴다.

 

 

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE NOT COMM IS NULL;

 

SELECT NAME, COMM

FROM TBL_NEWSAWON

WHERE  COMM IS NOT NULL;   -- 위의 것과 같은 결과 값

 

----------------------------------------------------------------------------

 

SELECT NAME AS "사원명", SAL "급여",  COMM 커미션,

       --연봉 => 12달 급여 + 커미션

       -- SAL*12 + COMM 이것이 아니라

       NVL(COMM,0) "연봉",  -- NULL이라면 0로 나타내라

       NVL2(COMM, 999, 888), -- NULL이라면 999, NULL이 아니라면 888

       NVL2(COMM, COMM, 0)

FROM TBL_NEWSAWON;

 

SELECT NAME,SAL, COMM,            -- 위와 똑같은 것

       SAL*12+ NVL(COMM, 0),

       NVL2(COMM, SAL*12 + COMM, SAL*12)

FROM TBL_NEWSAWON;

 

SELECT NAME,SAL, COMM,           

       SAL*12+ NVL(COMM, 0),

       NVL2(COMM, SAL*12 + COMM, SAL*12),

       COALESCE(SAL*12 + COMM, SAL*12, COMM,0)

-- NULL이면 그 다음 값을, 그 다음 값을 ..., NULL 이 안 나올 때까지 나온다. 

FROM TBL_NEWSAWON;

 

-----------------------------------------------------------------------------------------

 

 

<<급여와 보너스를 합해서 연봉을 구하기>>

SELECT FIRST_NAME AS "",

            SALARY AS "급여",

            COMMISSION_PCT AS "보너스%",

            (SALARY + NVL(SALARY*COMMISSION_PCT,0) ) * 12  AS "연봉1",

            NVL2(COMMISSION_PCT,

                     (SALARY + SALARY*COMMISSION_PCT) * 12,

                      SALARY * 12)  AS "연봉2",

            COALESCE((SALARY + SALARY*COMMISSION_PCT) * 12,

                             SALARY * 12, 0) AS "연봉3"

FROM EMPLOYEES;

 

 

 

/*** 문자, 날짜, 숫자, 어떤 것이든 연결시켜주는 연결 연산자인 || 연산자 ***/

   

    SELECT *

    FROM TBL_NEWSAWON;

   

    SELECT '사원번호가'|| SANO || '' || NAME || HIREDATE || '입니다.'

    FROM TBL_NEWSAWON;

   

<<값>>

사원번호가1001인한석규90/01/02입니다.

사원번호가1002인두석규92/01/03입니다.

사원번호가1003인세석규94/01/04입니다.

사원번호가1004인네석규96/01/05입니다.

사원번호가1005인오연수96/01/06입니다.

사원번호가2001인일용이00/01/07입니다.

사원번호가2002인이미자01/01/08입니다.   

   

   

   

    --------------------------------------------------------------------

   <문제>

    --TBL_NEWSAWON 테이블에서 급여가 2000 이상 4000 이하인

    --직원들의 정보를 사원번호, 사원명, 직급, 급여로

    --나타내세요.

   

  

<답1>  

    SELECT DEPTNO, SANO, NAME, JIK, SAL   -- 이것을 권장

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000;

   

<답2>   

SELECT DEPTNO, SANO, NAME, JIK, SAL  -- (위의 값과 같음)

    FROM TBL_NEWSAWON                   

    WHERE SAL BETWEEN 2000 AND 4000;     -- 2000 이상 4000이하

   

   

<답3>     

SELECT DEPTNO, SANO, NAME, JIK, SAL  

    FROM TBL_NEWSAWON

    WHERE SAL < 2000 OR SAL > 4000;      --2000 작고  4000크다

 

 

<답4>    

      SELECT DEPTNO, SANO, NAME, JIK, SAL   --위의 값과 같음

    FROM TBL_NEWSAWON

    WHERE NOT (SAL BETWEEN 2000 AND 4000); 

   

 

---------------------------------------------------------------------------

 

--정렬함수 (ORDER BY) --

    SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

   WHERE SAL >= 2000 AND SAL <= 4000

   ORDER BY NVL2(COMM, SAL*12 + COMM, SAL*12) DESC;

 

 

   

    SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000

    ORDER BY 5 DESC; -- 내림차순 (5:다섯번째 컬럼을 내림차순으로)

   

 

<값>

DEPTNO  SANO NAME    JIK        YEARPAY

10         1002    두석규    부장       48600

30         3002    노주현    과장       48600

20         2002    이미자    과장       48600

20         2001    일용이    부장       48500

10         1003    세석규    과장       36500

20         2003    삼미자    사원       36500

30         3001    고소영    부장       36400

30         3003    도지원    사원       36200

30         3009    이자연    대리       36000

20         2004    사미자    사원       36000

10         1004    네석규    사원       24000

 

-----------------------------------------------------------------------

 

SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000

    ORDER BY 5 ASC; -- 오름차순 (생략가능)

      

<값>

DEPTNO  SANO NAME    JIK        YEARPAY

30         3005    마광수    사원       24000

10         1004    네석규    사원       24000

10         1005    오연수    사원       24000

30         3004    류시원    사원       24000

20         2002    이미자    과장       48600

10         1002    두석규    부장       48600

30         3002    노주현    과장       48600   

 

 

----------------------------------------------------------------------

 

    SELECT DEPTNO, SANO, NAME, JIK,

           NVL2(COMM,SAL*12 + COMM, SAL *12)

           AS "YEARPAY"

    FROM TBL_NEWSAWON

    WHERE SAL>=2000 AND SAL <=4000

    ORDER BY 4,5 DESC;-- 같은 차순에 연봉을 내림차순으로 보고 싶다.

                                           

<값>

DEPTNO SANO    NAME    JIK        YEARPAY

30         3002    노주현    과장       48600

20         2002    이미자    과장       48600

10         1003    세석규    과장       36500

10         1005    오연수    사원       24000

10         1004    네석규    사원       24000

30         3004    류시원    사원       24000

30         3005    마광수    사원       24000 

                     

                     

------------------------------------------------------------------------------------- 

 

 

SELECT DISTINCT DEPTNO, JIK -- DISTINCT는 중복되는 값을 하나만 출력

 FROM TBL_NEWSAWON

 ORDER BY 1;  --NULL을 오라클은 가장 큰 값으로 간주

 

 <값>

DEPTNO     JIK

10           과장

10           사원

10           사장

20           과장

20           사원

30           과장

30           사원

NULL      사원      


close