본문 바로가기
  • 문과생의 백엔드 개발자 성장기
|Playdata_study/SQL.Oracle

210518_DB2 (SQL)

by 케리's 2021. 5. 19.

 NULL 값

  - 한 행의 특정 열에 데이터 값이 없으면 NULL이라고 한다..
  - NULL 값은 알 수 없는 값으로 00 또는 공백과 다르다.
  - NULL 값을 포함하는 연산의 경우 결과도 NULL이다.
  - 모르는 데이터에 숫자를 더하거나 빼도 결과는 모르는 데이터인 것과 같다.
  - 숫자를 0으로 나누면 오류가 발생하지만 NULL로 나누면 결과는 NULL이다.

 

Literal 문자열


  - 열 이름 열 별칭이 아니면서 SELECT 목록에 포함된 문자, 숫자, 또는 날 짜이며 각 행이 반환될 때마다 출력된다.
  - 텍스트 리터럴 문자열은 질의 결과(SQL 구문)에 포함되어 SELECT 목록의 열과 동일하게 취급된다.
  - 날짜 및 문자 리터럴은 반드시 작은따옴표(' ')로묶지 않는다.

 



Pseudo Column 의사 열

  : QUERY 가 가능 한열
  - ROWNUM을.
  - ROWNUM은 각 검색된 행의 일련변호로써 , ORDER BY에 의한 정렬 이전에 부여된다.
  - ROWID 는 테이블 내의 특정한 행을 유일하게 구별해 주는 값으로 데이터 타입은 ROWID이다.

 

 

 

 



✔ SELECT 컬럼 [AS] 별칭 , , ,
   FROM 테이블명 별칭 , , ,  ;
   WHERE condition(s)

    - 검색 결과에 대한 제한을 둘 때 사용
    - WHERE FROM 절 뒤에 온다.
    - 문자열과 날짜 값은 작은 따옴표로 묶어서 표시
    - WHERE 절은 생략 가능하고 생략할 경우 모든 행이 검색됨
    - WHERE 조건식의 결과가 TRUE ROW만 선택한다.
    - WHERE 절은 별칭은 사용할 수 없다.
    - 테이블의 데이터를 추출하는 필터 역할은 한다.
    - 조인시 테이블들을 연결하는 조건으로 사용된다.
    - 산술 연산, 비교 연산, 칼럼, 숫자, 문자상수, LIKE, IN BETWEEN, IS NULL, IN NOT NULL 함수, 논리연산자, ANY, ALL

       → 조건식의 표현식

 

 


Q1) 사원테이블에서 사원의 이름이 FORD인 정보를 출력하자.


  SELECT *
  FROM EMP
  WHERE ENAME = 'FORD';  #VALUE는 대소문자를 가린다.

 


Q2) 사원테이블에서 직업이 매니저인 사원의 번호, 이름, 직업 급여를 리턴하자.


  SELECT EMPNO, ENAME, JOP, SAL
  FROM EMP
  WHERE JOB = 'MANAGER';
  


Q3) 사원테이블에서 급여가 3000 이상인 사원의 번호, 이름, 직업, 급여를 조회하자.


  SELECT EMPNO, ENAME, JOB, SAL
  FROM EMP
  WHERE SAL >= 3000;

 

 


Q4)

 

   □NOT BETWEEN 하한값(a) AND 상한 값(b)
      - expr < a OR expr > b와 같다.

 

    BETWEEN 하한 값(a) AND 상한 값(b)
      - 두 사이의 값을 출력할 때 사용되면 조건절에 명시된 범위의 값을 리턴한다.
      - expr >= a AND expr <= b와 같다.

 

  # 사원 테이블에서 급여가 1300에서 1700 사이에 해당되는 사원의 이름, 직업, 급여 부서 번호를 출력하자.


    SELECT ENAME, JOB, SAL, DEPTNO
    FROM EMP
    WHERE SAL BETWEEN 1300 AND 1700;

 



 

  # 사원 테이블에서 급여가 1300에서 1700 사이에 해당되지 않는 사원의 이름, 직업, 급여 부서 번호를 출력하자.

 

    SELECT ENAME, JOB, SAL, DEPTNO
    FROM EMP
    WHERE SAL NOT BETWEEN 1300 AND 1700;




Q5) 

□ IN (여러 값 중 하나와 일치하는 값)


  - 여러 값 중에 어느 하나와 일치한다.
  - IN = ANY와 같다.
  - NOT IN 은!= ALL과 같다.
  - 형태는 IN(값 1, 값 2, 값 3)이며 비교대상이 괄호 안의 값에 포함될 경우 조건을 만족하게 된다.
  - IN은 비교하는 값이 하나이더라도 ( )와 같이  사용하며, 여러 형태의 데이터 타입 모두 비교 가능하다.

# 사원 테이블에서 사원번호가 7902, 7788, 7566인 사원의 사번, 이름, 급여, 입사일을 출력하자.


    SELECT EMPNO, ENAME, SAL, HIREDATE
    FROM EMP
    WHERE EMPNO IN(7902, 7788, 7566);


Q6)

 

□ LIKE 연산자 (문자의 패턴이 일치하는 값)


  - % : 임의의 길이 문자열(공백 문자 가능), 0개 또는 1개 이상의 문자와 대응
  - _; 한 글자.
  - ESCAPE : 검색할 문자에 % _ 문자를 포함할 때

# 사원의 이름 중D자로 끝나는 사원을 출력해보자.


  SELECT ENAME
  FROM EMP
  WHERE ENAME LIKE'% D';

 


# 사원의 이름 중 A로 시작하는 사원을 출력해보자.

 

  SELECT ENAME
  FROM EMP
  WHERE ENAME LIKE 'A%';

 

 

# 사원의 이름 중_ A (두 번째 글자가 A)인 사원

 

  SELECT ENAME
  FROM EMP
  WHERE ENAME LIKE'_A%';

 


# 사원의 이름 중W로 시작하되 _ _ (두 칸) 건너뛰고 D로 끝나는 사원


  SELECT ENAME
  FROM EMP
  WHERE ENAME LIKE 'W__%D';

 


□ 칼럼, VALUE 생성 및 삭제
  

  # 칼럼 생성 및 삭제

    CREATE TABLE TEST(NAME VARCHAR2(15));
    DROP TABLE TEST;

 

 

# VALUE 생성 및 삭제


    INSERT INTO TEST VALUES('22222');
    DELETE FROM TEST;

 


□ ESCAPE 

 

  SELECT * FROM TEST WHERE NAME LIKE '%_%' 입력하게 되면 모든 행을 리턴하게 된다.

  따라서 LIKE 연산자로 '%' 나 '_' 등과 같은 특수문자를 검색하기 위해 ESCAPE를 사용한다. 

 


   # 이름에 _문자가 들어있는 이름을 출력하고 싶다.


     SELECT *
     FROM TEST

     WHERE NAME LIKE '%#_%' ESCAPE '#';

     (해당 쿼리에서는 #을 사용했지만 ** , #, ! 다 사용할 수 있음)

 

 

  # 두 번째 글자가 % 인 이름을 출력하고 싶다.

 

    SELECT *
    FROM TEST
    WHERE NAME LIKE '%#%%' ESCAPE '#';

 

 

Q7) 


□ NULL 


 # 사원 테이블에서 커미션이 NULL인 사원을 조회하자. (책정되지 않는)


  SELECT *
  FROM EMP
  WHERE COMM IS NULL;

 

 

 # 사원테이블에서 커미션이 책정되는 사원을 조회하자

 

    SELECT *
    FROM EMP
    WHERE COMM IS NOT NULL;

 

 

함수 

 

 단일행(문자 함수, 숫자 함수, 날짜 함수, 변환 함수, 기타 함수), 다중행


✔ 문자 함수 

 

  UPPER, LOWER, INITCAP(단어의 첫 문자는 대문자 나머지 소문자), CONCAT(결합), SUBSTR
  INSTR(특정 문자열의 위치를 숫자로 리턴), LENGTH, CHR, ASCII

Q8)

 

□ LOWER (소문자 변환) 

 

사원 테이블에서 JAMES의 사원번호, 성명, 직업, 부서 번호를 출력하되 모두 소문자로 출력하자.


  SELECT EMPNO, LOWER(ENAME), LOWER(JOB), DEPTNO
  FROM EMP
  WHERE ENAME ='JAMES';

 



Q9)

 

□ INITCAP (단어의 첫 문자는 대문자 나머지 소문자)

 

# DEPT 테이블에서 칼럼의 첫 글자만 대문자로 변환하여 모든 정보를 출력하자.


  SELECT DEPTNO, INITCAP(DNAME), INITCAP(LOC)
  FROM DEPT;

 


Q10)

 

□ CONCAT (결합) 

 

  SELECT EMPNO, ENAME, CONCAT(EMPNO, ENAME) ENAME
  FROM EMP
  WHERE DEPTNO = 10;


Q11)

 

  □ SUBSTR ("문자열", "시작 위치", "길이") 

  문자 단위로 시작 위치와 자를 길이를 지정하여 문자열을 자른다.

 

  # 사원 테이블에서 이름의 첫 글자가 K보다 크고 Y보다 작은 사원의 정보를 출력하되 이름순으로 정렬해보자.


     SELECT *
     FROM EMP
     WHERE SUBSTR(ENAME,1,1) > 'K' AND SUBSTR (ENAME,1,1) < 'Y'
     ORDER BY ENAME;

 


  😃 알고 가기  

 

      칼럼 폭조절 숫자
      COLUMN COMM FORMAT 9999


      컬럼폭 조절 문자
      COLUMN ENAME FORMAT A10

□ TRIM 문자열 삭제 (LTRIM 왼쪽 삭제, RTRIM 오른쪽 삭제)

 

 

Q12) 

 

□ PAD 문자열 채우기 (LPAD 왼쪽 채우기, RTRIM 오른쪽 채우기)

   : LPAD("값", "총 문자 길이", "채움 문자")

 

 # 부서 번호가 10번인 사원의 이름을 왼쪽으로부터 "*"로 채워서 출력하자.


    SELECT ENAME, LPAD(ENAME,15, '*'), SAL, LPAD(SAL,10, '*')
    FROM EMP
    WHERE DEPTNO = 10;

 


Q13)

 

□ LTRIM 

 

  # EMP 테이블에서 10번 부서의 사원에 대하여 담당 업무 중 좌측에 'A'를 삭제하고

    급여 중 좌측의 1을 삭제하여 출력하여라.

   SELECT ENAME, JOB, LTRIM(JOB, 'A'), SAL, LTRIM(SAL,1)
   FROM EMP;

 



Q14)

 

□ RTRIM 

 

  # EMP 테이블에서 10번 부서의 사원에 대하여 담당 업무 중 우측에 'T'를 삭제하고

     급여 중 우측의 0을 삭제하여 출력하여라

   SELECT ENAME, JOB, RTRIM(JOB, 'T'), SAL, RTRIM(SAL,0)
   FROM EMP
   WHERE DEPTNO = 10;

 


Q15)

 

□ REPLACE (문자열 변경)

   : REPLACE ( 문자열 , "바꿀 문자열", "바뀔 문자열")

 

# 사원 이름에 ON문자열을 *?로 변경해서 조회


   SELECT ENAME, REPLACE(ENAME, 'ON', '*?')
   FROM EMP;

 

 

Q16)

 

□ TRANSLATE (문자열 한 글자씩 변경, 규칙성 가짐)

   : TRANSLATE ( 문자열 , "바꿀 문자열", "바뀔 문자열")

     

  # 사원 이름에 ON문자열을 *?로 변경해서 조회

 

     SELECT ENAME, TRANSLATE(ENAME, 'ON', '*?') 결과
     FROM EMP;

 



✔ 숫자 함수

 

  ROUND : 반올림
  TRUNK : 버림
  MOD(M, N) : MN으로 나눈 나머지
  ABS : 숫자 값을 절댓값으로
  FLOOR : 해당 수보다 작거나 같은 정수 중 큰 정수 갑을 리턴 (반내림)
  CEIL : 해당 수보다 크거나 같은 정수중 가장 작은 정수 값을 리턴
  SIGN : 1, -1, 0 (양수, 음수, 0)
  POWER(M, N) : MN

Q17)

 

□ ROUND(반올림, 자릿수)


  SELECT ROUND(456.678) RES1, ROUND(456.678,0) RES2, ROUND(456.678,2) RES3, ROUND(456.678,-2) RES4
  FROM DUAL;

 


Q18)

 

□ TRUNC (버림, 자릿수)


   SET NUM 7 (소수점 제대로 나오지 않을 때 입력)
   SELECT TRUNC(456.678) RES1, TRUNC(456.678,0) RES2, TRUNC(456.678,2) RES3, TRUNC(456.678,-2) RES4
   FROM DUAL;

 



 날짜 데이터

 

  CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECONDS = 7BYTE

 

  기본 date format 

  'RR/MM/DD', 'DD-MON-RR'

  RR = Y2K 고려해서 연도를 표기한 것 (00~49 : 2000년대, / 50~99:1900년대)
          81/09/28

ex) 201167일 오전 3시 15분47초 → 07-JUN-11
    CENTURY, YEAR, MONTH, DAY, HOURS, MINUTES, SECOND
         20        11      06       07      3           15          47

 


  - DATE + NUMBER : 날짜에 해당 일수를 더한 결과를 리턴, 날짜 형태로 표시
  - DATE - NUMBER : 날짜에 해당 일수를 뺀 결과를 리턴, 날짜 형태로 표시
  - DATE1 - DATE2 : 두 날짜 사이의 경과 일수 나타냄, 숫자로 표시
  - DATE + NUMBER/24 : 날짜에 해당 시간을 더해서 리턴. 날짜 형태로 리턴


# 입사일이 81년도 9월 9일 이후에 입사한 사원을 출력해보자.

 

#1
  SELECT ENAME, HIREDATE
  FROM EMP
  WHERE HIREDATE >='81/09/09';

 

#2 

  SELECT ENAME, HIREDATE
  FROM EMP
  WHERE HIREDATE >='81-09-09';

 

#3
  SELECT ENAME, HIREDATE
  FROM EMP
  WHERE HIREDATE >='1981-09-09';

 

 


□ SYSDATE 

   : 7BYTE를 가지고 있지만 리턴되는 것은YY/MM/DD형식이다.

 

  SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD-HH:MM')

  FROM DUAL;


□ SYSTIMESTAMP 

  : TIMESTAMP WITH TIME ZONE 형식의 시스템 날짜를 리턴한다.


  SELECT SYSTIMESTAMP

  FROM DUAL;

 

 


□ CURRENT_DATE

  : 현재 SESSION의 날짜 정보를 일//년도 24: : 초 리턴


□  CURRENT_TIMESTAMP

  : TIMESTAMP WITH TIME ZONE 형식으로 CURRENT_DATE SESSION TIME ZONE형식으로 리턴

 


□ EXTRACT

  : DATETIME 또는 INTERVAL의 값 표현 형식에 지정된 DATETIME 필드의 값을 추출해서 리턴한다.

  # 오늘 날짜에서 연도만 출력하고 싶다.


   SELECT EXTRACT (YEAR FROM SYSDATE)

   FROM DUAL;

 


# 사원 테이블에서 사원의 이름, 입사일자에서 입사한 월 정보만 조회하자.


   SELECT ENAME, EXTRACT (MONTH FROM HIREDATE)

   FROM EMP;

 

 

# 사원테이블에서 사원의 이름, 입사일자에서 입사한 일 정보만 조회하자.


   SELECT ENAME, EXTRACT(DAY FROM HIREDATE)

   FROM EMP;

 

 


 □ MONTHS_BETWEEN(D1, D2)

    : 두 날짜 간의 경과를 개월 수

 □ ADD_MONTHS(D1, N)

    : D1날짜에 N개월을 더함

 □ NEXT_DAY(D1, 'CHAR')

    : D1보다 이후 날짜이고 'CHAR'에 지정한 요일에 해당하는 날짜

 □ LAST_DAY

   : 해당 월의 마지막 날짜를 리턴한다.


Q19)

 

 # 사원 테이블에서 현재까지 근무일수가 몇 주 며칠인지 조회한다.


   SELECT ENAME, HIREDATE, SYSDATE, (SYSDATE-HIREDATE) "TOTAL DAYS",

             TRUNC((SYSDATE-HIREDATE)/7) WEEKS, ROUND(MOD((SYSDATE-HIREDATE),7)) DAYS
   FROM EMP
   ORDER BY 4 DESC;

 

 




Q20)

 

  # 사원 테이블에서10번 부서의 사원의 현재까지의 근무 월 수를 계산해서 리턴 받자. 


     SELECT ENAME, HIREDATE, SYSDATE, MONTHS_BETWEEN(SYSDATE, HIREDATE) AS M_BETWEEN,      TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE),0) AS T_BETWEEN
    FROM EMP
    WHERE DEPTNO=10
    ORDER BY 4 DESC;

 


Q21)

 

 # 사원 테이블에서10번 부서 사원의 입사일로부터5개월이 지난 날짜를 계산하여 출력하자.


    SELECT ENAME, HIREDATE, ADD_MONTHS(HIREDATE,5) A_MONTH

    FROM EMP
    WHERE DEPTNO = 10
    ORDER BY HIREDATE DESC;

 


Q22)

 

  # 사원 테이블에서 10번 부서 사원의 입사일로부터 돌아오는 금요일을 계산해보자.


    SELECT ENAME, HIREDATE, NEXT_DAY(HIREDATE, 6)
    FROM EMP
    WHERE DEPTNO = 10
    ORDER BY HIREDATE DESC;

 

 

□ 날짜 데이터의 ROUND 

 

  은 반올림할 때 정오를 넘으면 (PM) 다음날 자정을 출력하고, 넘지 않으면 그날 자정을 출력한다.
  을 반올림할 경우 15일 이상이면 다음 달1일을 출력하고 넘지 않으면 현재 달 1일을 출력한다.
  도를 반올림하는 경우에는 6월을 넘으면 다음 해11일을 출력하고 넘지 않으면 그 해 1월 1일을 출력한다.

□ 날짜 데이터의 TRUNC 

 

  은 절삭할 때 그날 자정을 출력하고, 을 절삭하면 그 달의 1일을 출력한다.
  도를 절삭하면 그 해 11일을 출력한다.
  단, 주의할 점은 시간 정보가 중요하지 않을 경우 시간 정보를 생략하고 입력하거나 연산할 때 편리하다.



✔ TO_CHAR


숫자 FORMAT 
  숫자(9, 0), 그룹 구분자(,), G, 소수점, 통화 $ L ,
  공백 제거FM, 표기법 EEEE(지수), RN(로마 표기자), rn, X(16진수 표기),
  기호 표시MI : 숫자가 음수일 경우에 마지막에 - ,
  PR : 음수인 경우 <> 안에 숫자 표시,
  S : 음수인 경우 숫자 앞에-

□ 숫자(9,0)


  SELECT TO_CHAR(1000, '9999')

  FROM DUAL;


  SELECT TO_CHAR(1000, '00009999')

  FROM DUAL;


  SELECT TO_CHAR('1000', '00009999')

  FROM DUAL;


  SELECT TO_CHAR(12.3, '009.90')

  FROM DUAL;

 


□ 그룹 구분자


  SELECT TO_CHAR(12345, '99.999.9') AS RES FROM DUAL;

날짜 FORMAT 


  기원 : AD/BC, A.D./B.C.
  년도 : YYYY(2021), YYY(021), YY(21), Y(1), YEAR, SYYYY(BC인 경우 음수로 표시), PR
  분기 : Q (4분기)
  월 : MM(1~12), MON(월 이름 약어 JAN, FEB), MONTH(January), RM (로마식)
  주 : W(1,2,3,4,5주 표시), WW(년 주표시:1월 1일- 1월 7일까지가 1주 차가 된다.),
  IW (IOS주표시 : 1월 1일부터 첫 번째 일요일까지가 1주 차가 된다.)
  일자 : D, DD, DDD, J(BC4712 이후의 줄리 안력 일자.)
  요일 : DY(MON), DAY(Monday)

시간 FORMAT


  오전/오후 : AM/PM, A.M./P.M.
  시간 : HH, HH12, HH24
  분 : MI
  초 : SS, SSSS
  시간대 : TZD(서머타임), TZH, TZM, TZR(US/Central)
  기타 :../;

 

□ FM 표기법

  : 날짜의 두 자리 숫자를 한자리로 표기

 

 ex)

    SELECT TO_CHAR(SYSDATE, 'DD') FROM DUAL; 

    해당 날짜가 02로 표기됨

    SELECT TO_CHAR(SYSDATE, 'FMDD') FROM DUAL;

    해당 날짜가 2로 표기됨

 

  SELECT ENAME,
  HIREDATE, TO_CHAR(HIREDATE, 'FMDD, MONTH, YYYY') T_HIREDATE,
  TO_CHAR(HIREDATE, 'YYYY"년"MM"월"DD"일"') T_KOR
  FROM EMP
  WHERE DEPTNO = 10
  ORDER BY HIREDATE DESC;

 

Q23)

 

    # 사원테이블에서 20번 부서중 급여 앞에$를 삽입하고 천 단위 구분자를 표시하면서 조회하자.
       단 사원의 번호 이름, 직업, 봉급, 봉급 포맷을 출력하자.

  SELECT EMPNO, ENAME, JOB, SAL, TO_CHAR(SAL, '$999,999')
  FROM EMP

  WHERE DEPTNO=20
  ORDER BY SAL DESC;

 

 

  # L은 로컬 화폐단위 

 

  SELECT EMPNO, ENAME, JOB, SAL, TO_CHAR(SAL, 'L999,999')
  FROM EMP
  WHERE DEPTNO = 20
  ORDER BY SAL DESC;

 

 

 

Q24)

 

    # 날짜 포맷 표기

     : WW는 주기 표시

 

 

    # 년도가 다르게 출력되는 경우를 살펴보자


  SELECT TO_CHAR(TO_DATE('98', 'RR'), 'YYYY') TEST 1,
  TO_CHAR(TO_DATE('05', 'RR'), 'YYYY') TEST 2,
  TO_CHAR(TO_DATE('98', 'YY'), 'YYYY') TEST 3,
  TO_CHAR(TO_DATE('05', 'YY'), 'YYYY') TEST 4
  FROM DUAL;

 

 


❔ YY형식이 날짜의 연도 부분을 현재의 세기로 해석
    RR형식은 현재 연도와 지정된 년도의 두 자리를 바 교하여50년을 기준으로 해석을 달리한다.
    현재의 연도가2000 ~ 2050년도 사이라면 'RR' 01~49까지는 2000년대로 해석하고
    '50'~'99'까지는 1900년대로 해석한다.

Q25)

 

숫자형과 문자형을 확인

 

 

ex)


CREATE TABLE TEST(NO NUMBER(4), CH VARCHAR2(4));
INSERT INTO TEST
VALUES(1,1);

 


❔ 문자는 왼쪽 정렬,, 숫자는 오른쪽 정렬


Q26)

 

  □ 추가 변환 함수

  TO_TIMESTAMP : CHAR, VARCHAR2 데이터 타입을TIMESTAMP 변환
  TO_TIMESTAMP_TZ : CHAR, VARCHAR2 데이터타입을 TIMESTAMP WITH TIME ZONE 타입으로 변환
  TO_YMINTERVAL : CHAR, VARCHAR2 데이터타입을 INTERVAL DAY TO SECOND 타입으로 변환


     SELECT SYSDATE, SYSDATE + TO_YMINTERVAL('01-03') "15 MONTH LATER"
     FROM DUAL;

TO_YMINTERVAL ('01-03') 1년 3년 더하기


  TO_DSINTERVAL : CHAR, VARCHAR2 데이터 타입을INTERVAL DAY TO SECOND 타입으로 변환


     SELECT SYSDATE, SYSDATE + TO_DSINTERVAL('003 17:00:00') AS "3 DAY 17 HOURS LATER"
     FROM DUAL;

 


Q27)

 

□ 기타 함수

 

  MVL (COLUMN, EXP1) : NUL값을 EXP1값으로 변환
  NVL2 (COLUMN, EXP1, EXP2) : 해당 칼럼이NULL일 경우 EXP2값을, NULL이 아니면 EXP1값을 리턴
  NULLIF (EXP1, EXP2) : EXP1EXP2값을 비교해 같으면 NULL, 다르면 EXP1값을 리턴
  COALESCE (EXP1... EXPN) : EXP1, EXP2,... EXPN 중NULL이 아닌 첫 번째 값을 이용
  DECODE : IF ~THEN~ELSE 문의 역할 수행(조건부 조회를 쉽게...)
  CASE WHEN 조건식 THEN : IF~THEN~ELSE 문의 역할 수행
      EXP1 END

 

 


 # 사원 테이블의 사원 이름, 매니저, 매니저가 없다면 '상위관리자'로 표시하고 매니저가 있으면 '담당'으로 출력하자
   

    SELECT ENAME, MGR, NVL2 (MGR, MGR||'담당', '상위 관리자')
    FROM EMP;

 

  NVL2 (COLUMN, EXP1, EXP2) :   해당 컬럼이  NULL 일 경우  EXP2 값을 , NULL 이 아니면  EXP1 값을 리턴

 


 # 사원 테이블의 사원 이름,, 직업, 직업이 'CLERK' 인경우 NULL로 출력하자.


    SELECT ENAME, JOB, NULLIF(JOB, 'CLERK') AS RESULT
    FROM EMP;

 

NULLIF (EXP1, EXP2) :  EXP1 과  EXP2 값을 비교해 같으면  NULL,  다르면  EXP1 값을 리턴

 

 


Q28)

 

  □ COALESCE : NVL 함수를 일반화시킨 함수


  # 사원 테이블에서 이름커미션 , 연봉, 커미션 NULL이 아닌 경우 커미션을, 커미션이 NULL인 경우 연봉을,
     모두 NULL인 경우엔 50을 출력하자.

    SELECT ENAME, COMM, SAL, COALESCE(COMM, SAL*12,50) RESULT
    FROM EMP;

 

 

COALESCE (EXP1...EXPN) :  EXP1, EXP2, ...EXPN중 NULL이 아닌 첫번째 값을 이용

 


Q29)

 

  DECODE : 데이터들을 다른 값으로 리턴

  : DECODE(VALUE, IF1, THEN1, IF2, THEN2...)
    VALUE 값이 IF1일 경우 THEN1 값으로 리턴, VALUE IF2일 경우에는 THEN2 값으로 리턴된다.

  # 봉급이 1000보다 작으면 'A', 1000 이상 2500미만 'B', 2500 이상이면 'C'로 표시한다.
    (DECODE + SIGN)

    SELECT ENAME, SAL, DECODE(SIGN(SAL-1000),-1, 'A',
    DECODE(SIGN(SAL -2500),-1, 'B', 'C')) GRADE
    FROM EMP;

 

 ❔ SIGN : 인자가 양수, 0, 음수인지 판단하여 값을 리턴함

    N < 0 : -1

    N = 0 : 0

    N > 0 : 1

 

 

 

  CASE WHEN THEN 

 


  [형식

  CASE [대상 값, 대상 값은] WHEN 비교조건 1 THEN 처리 1
  WHEN 비교조건 2 THEN 처리 2
  ELSE 디폴트 처리END

 

 # 봉급이 1000보다 작으면 'A', 1000 이상 2500 미만 'B', 2500 이상이면 'C'로 표시한다

    (CASE WHEN THEN 사용)


    SELECT ENAME, SAL,
    CASE WHEN SAL < 1000 THEN 'A'
    WHEN SAL >= 1000 AND SAL <2500 THEN 'B'
    ELSE 'C' END AS GRADE
    FROM EMP;

 

CASE WHEN 조건식 THEN :  IF~THEN~ELSE  문의 역할 수행

 

댓글