본문 바로가기

빅데이터/개념 정리

Null, DISTINCT, DECODE, CASE, 오라클 함수

 

 

 

 

 

 

Null

값이 정의되지 않은, 존재하지 않는, 할당되지 않은, 현재 데이터를 입력하지 못한 경우, 적용 불가능한 상태

ex)
숫자 0 의 경우 -> ASCII 코드: 48
공백 ' '의 경우 -> ASCII 코드: 32
null 의 경우 -> ASCII 코드: 00

WHERE 절에서 사용할 경우에는 is null 또는 is not null 로 쓴다.
null 은 연산할 수 없다.
null 은 정렬시 가장 큰 값으로 간주한다.

 

DISTINCT

중복되지 않는 유니크한 튜플만 가져온다.

Oracle version 원리 처리 데이터
10g 이전 ORDER BY 규모가 작은 데이터량
10g 이후 Hash 빅데이터

 

DECODE 함수

Oracle 에서만 지원하는 함수이다.
SELECT 문장 내에서 if문을 수행해준다.

 

CASE

DECODE와 달리 비교연산이 가능하다.

 

1) CASE ~ WHEN

CASE [대상값] WHEN [비교값1] THEN [결과1] 

                   WHEN [비교값2] THEN [결과2] 

                   WHEN [비교값3] THEN [결과3] 

                   ELSE [결과4] 

END;

위 SQL을 DECODE로 바꿔 표현해보면..
DECODE(대상갑,비교값1,결과1,비교값2,결과2,비교값3,결과3,결과4);

 

2) CASE ~ WHEN 2

CASE WHEN [대상컬럼1] [비교연산1] [비교값1] THEN [결과1] 

        WHEN [대상컬럼2] [비교연산2] [비교값2] THEN [결과2] 

        WHEN [대상컬럼3] [비교연산3] [비교값3] THEN [결과3] 

        ELSE [결과4] 

END;

 

예제)

SELECT GRADE

CASE WHEN GRADE>=90 THEN 'A+'

        WHEN GRADE>=80 THEN AND GRADE<90 THEN 'B+'

        WHEN GRADE>=70 THEN AND GRADE<80 THEN 'C+'

        ELSE 'F'

FROM SUBJECT

학생의 과목 점수가 90점이상이면 'A+' 학점을 주고, 80~89점이면 'B+', 60~79점이면 'C+' 이고, 나머지는 'F'이다.

 

ROWNUM

가상의 컬럼, 쿼리가 실행될 때 레코드에 번호를 나타내어 주는 필드이다.

* Query 처리 순서

⑧  SELECT DISTINCT <TOP_specification> <select_list>

  FROM <left_table>

      <join_type> JOIN <right_table>

         ON <join_condition>

  WHERE <where_condition>

  GROUP BY <group_by_list>

  WITH {CUBE | ROLLUP}

  HAVING <having_condition>

  ORDER BY <order_by_list>

1. FROM <테이블 이름>
2. ON <조인 조건>
3. <조건 타입> JOIN <조인할 테이블>
4. WHERE <조건절>
5. GROUP_BY <그룹할 컬럼>
6. WITH <결과집합>
7. HAVING <HAVING_조건절>
8. SELECT
9. DISTINCT
10. ORDER BY <정렬할 컬럼>
11. 가져올 데이터 리스트

 

많이 쓰는 함수

/*   단일행: 문자 함수   */

lower(A)  -> A 문자를 소문자로 변환한다
upper(a)   -> a 문자를 대문자로 변환한다
substr(x,n,m)  -> x 문자를 n번째 부터 m개 추출한다.
instr(x,y,n,m)  -> x 문자에서 y를 찾는데, n번째 부터 m까지 범위에서 찾고 인덱스 값을 반환한다.
length(x)  -> x 문자의 길이를 반환한다.
concat(x,y)  -> x 문자와 y 문자를 합친다.

rpad("대상값","총 문자길이","채움문자")  ->  문자길이를 기준으로 대상값의 오른쪽으로 문자를 채운다.
ex) rpad('WEB',5,'a')    ->    WEBaa

lpad("대상값","총 문자길이","채움문자")  ->   문자길이를 기준으로 대상값의 왼쪽으로 문자를 채운다.
ex) lpad('server',8,'#')    ->    ##server

TRIM("문자열")  ->  문자열의 양쪽 공백(스페이스바)을 제거한다.

 

/*   단일행: 숫자 함수   */

round(x,n)  ->  x 숫자를 n+1번째에서 반올림한다.
trunc(x,n)  ->  x 숫자를 n+1번째 부터 버린다.

 

/*   단일행: 날짜 함수   */

last_day("날짜")  ->  입력한 날짜의 마지막 날짜를 반환한다.
ex) last_day(20190814)    ->    2019/08/31

next_day("날짜","요일")   ->  입력한 날짜 이후의 첫 번째 요일의 날짜를 계산한다.
ex) next_day(sysdate,'월')  ->  2019/08/19

round("날짜","지정 값")  ->  지정한 값 기준으로 반올림한다.
trunc("날짜","지정 값")  ->  지정한 값 기준으로 절삭한다.

 

날짜 포맷

sysdate => 2019/08/14/21:19:03

SELECT to_char(sysdate 'PM') FROM DUAL;
     결과->   오후

SELECT to_char(sysdate 'HH') FROM DUAL;
    결과->   09

SELECT to_char(sysdate 'HH24') FROM DUAL;
    결과->   21

SELECT to_char(sysdate 'HH12') FROM DUAL;
    결과->    09

SELECT to_char(sysdate 'MI') FROM DUAL;
    결과->   17

SELECT to_char(sysdate 'SS') FROM DUAL;
    결과->   03

SELECT to_char(sysdate 'SSSSS') FROM DUAL;
    결과->   76745

SELECT to_char(sysdate 'D') FROM DUAL;
    결과->   4

SELECT to_char(sysdate 'd') FROM DUAL;
    결과->   4

SELECT to_char(sysdate 'DD') FROM DUAL;
    결과->   14

SELECT to_char(sysdate 'dd') FROM DUAL;
    결과->   14

SELECT to_char(sysdate 'DDD') FROM DUAL;
    결과->   226

SELECT to_char(sysdate , 'ddd') FROM DUAL;
    결과->   226

SELECT to_char(sysdate , 'DAY') FROM DUAL;
    결과->   수요일

SELECT to_char(sysdate 'DY') FROM DUAL;
    결과->   

SELECT to_char(sysdate 'day') FROM DUAL;
    결과->   수요일

SELECT to_char(sysdate , 'FM') FROM DUAL;
    결과->   (null)

SELECT to_char(sysdate 'MM') FROM DUAL;
    결과->   08

SELECT to_char(sysdate 'MON') FROM DUAL;
    결과->   8월

SELECT to_char(sysdate 'MONTH') FROM DUAL;
    결과->   8월

SELECT to_char(sysdate , 'YYYY') FROM DUAL;
    결과->   2019

SELECT to_char(sysdate 'YYY') FROM DUAL;
    결과->   019

SELECT to_char(sysdate 'YY') FROM DUAL;
    결과->   19

SELECT to_char(sysdate 'Y') FROM DUAL;
    결과->   9

SELECT to_char(sysdate , 'y') FROM DUAL;
    결과->   9

SELECT to_char(sysdate , 'RRRR') FROM DUAL;
    결과->   2019

SELECT to_char(sysdate , 'RR') FROM DUAL;
    결과->   19

SELECT to_char(sysdate 'YEAR') FROM DUAL;
    결과->   TWENTY NINETEEN

SELECT to_char(sysdate 'Year') FROM DUAL; 
    결과->   Twenty Nineteen