Study

[Oracle/오라클] 함수 (형변환 / NULL / 선택 / 그룹)

_유니 2022. 12. 29. 20:31

 

 

형 변환 함수

 

 

- TO_CHAR : 날짜 혹은 숫자형 데이터를 문자형 데이터로 변환하여 반환

작성법 - TO_CHAR(DATE | NUMBER, [FORMAT])

 

// 숫자 타입 => 문자 타입

SELECT TO_CHAR(1234)
FROM DUAL;
// '1234'

SELECT TO_CHAR(1234, '999999') 
FROM DUAL;
// '  1234'
// 6칸짜리 공간 확보, 오른쪽 정렬, 빈칸 공백

SELECT TO_CHAR(1234, 'L99999') 
FROM DUAL;
// '₩1234'
// 현재 설정된 나라(LOCAL)의 화폐단위

SELECT TO_CHAR(1234, '$99999')
FROM DUAL;
// '$1234'

SELECT TO_CHAR(1234, 'L99,999')
FROM DUAL; 
// '₩1,234'
// 날짜 타입 => 문자 타입

SELECT TO_CHAR(SYSDATE) 
FROM DUAL;

SELECT TO_CHAR(SYSDATE, 'HH:MI:SS') 
FROM DUAL;
// HH : 12시간 형식

SELECT TO_CHAR(SYSDATE, 'HH24:MI:SS') 
FROM DUAL;
// HH : 24시간 형식

SELECT TO_CHAR(SYSDATE, 'AM HH:MI:SS')
FROM DUAL;

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD DAY DY') 
FROM DUAL;
// DAY : 월요일, DY : 월

SELECT TO_CHAR(SYSDATE, 'MON, YYYY')
FROM DUAL;
// 12월, 2022

SELECT TO_CHAR(SYSDATE, 'YYYY"년" MM"월" DD"일"')
FROM DUAL;
// 년도와 관련된 포맷
SELECT TO_CHAR(SYSDATE, 'YYYY'), -- 2022
       TO_CHAR(SYSDATE, 'YY'), -- 22
       TO_CHAR(SYSDATE, 'RRRR'), -- 2022
       TO_CHAR(SYSDATE, 'RR'), -- 22
       TO_CHAR(SYSDATE, 'YEAR') -- TWENTY TWENTY-TWO
FROM DUAL;

// 월과 관련된 포맷
SELECT TO_CHAR(SYSDATE, 'MM'), -- 12 
       TO_CHAR(SYSDATE, 'MON'), -- 12월
       TO_CHAR(SYSDATE, 'MONTH'), -- 12월
       TO_CHAR(SYSDATE, 'RM') -- XII / 월을 로마 숫자로 표시
FROM DUAL;

// 일에 관련된 포맷
SELECT TO_CHAR(SYSDATE, 'DDD'), -- 올해 기준으로 오늘이 며칠째인지
       TO_CHAR(SYSDATE,  'DD'), -- 월 기준으로 오늘이 며칠째인지
       TO_CHAR(SYSDATE, 'D') -- 주 기준으로 며칠째인지
FROM DUAL;

// 요일에 관련된 포맷
SELECT  TO_CHAR(SYSDATE, 'DAY'), -- 월요일
        TO_CHAR(SYSDATE, 'DY') -- 월
FROM DUAL;

 

 

 

- TO_DATE : 숫자 혹은 문자형 데이터를 날짜형 데이터로 변환하여 반환

작성법 - TO_DATE(CHARACTER | NUMBER [FORMAT])

 

SELECT TO_DATE(20100101)
FROM DUAL; 
// 10/01/01

SELECT TO_DATE(100101)
FROM DUAL; 
// 10/01/01

SELECT TO_DATE('070101') 
FROM DUAL;
// 07/01/01
// 첫 글자가 0인 경우 문자 타입으로 변경해줘야함

SELECT TO_DATE('041030 143000', 'YYMMDD HH24MISS') 
FROM DUAL;
// 시간을 표시하고 싶을 때는 꼭 포맷이 있어야 됨

SELECT TO_DATE('140630', 'YYMMDD') 
FROM DUAL;
// 14/06/30
// 2014년

SELECT TO_DATE('980630', 'YYMMDD') 
FROM DUAL;
// 98/06/30
// 2098년
// 현재 세기(21세기)로 반영

SELECT TO_DATE('980630', 'RRMMDD') 
FROM DUAL; -- 1998년
// 98/06/30
// 1998년
// RR : 해당 두자리 년도 값이 50 미만일 경우 현재 세기 반영, 50 이상일 경우 이전 세기 반영

 

 

 

- TO_NUMBER : 날짜 혹은 문자형 데이터를 숫자형 데이터로 변환하여 반환

작성법 - TO_NUMBER (CHARACTER, [FORMAT])

 

SELECT TO_NUMBER('05123475') 
FROM DUAL; 
// 5123475

SELECT '1000000' + '55000'
FROM DUAL; 
// 1055000
// 자동형변환

SELECT TO_NUMBER('1,000,000', '9,999,999') + TO_NUMBER('55,000', '99,999')
FROM DUAL; 
// 1055000 
// 강제형변환

 

 

 

NULL 처리 함수

 

- NVL : NULL로 되어 있는 컬럼의 값을 인자로 지정한 숫자 혹은 문자로 변경하여 반환

작성법 - NVL(P1, P2)

 

* P1 : NULL데이터를 처리할 컬럼명 혹은 값
* P2 : NULL값을 대체하고자 하는 값

 

// 사원들의 이름과 보너스 조회
SELECT EMP_NAME, NVL(BONUS, 0)
FROM EMPLOYEE;

// 사원들의 이름과 부서 조회
SELECT EMP_NAME, NVL(DEPT_CODE, '부서없음')
FROM EMPLOYEE;

 

 

- NVL2

작성법 - NVL2(컬럼, 반환값1, 반환값2)


* 컬럼값이 존재할 경우 반환값1 반환
* 컬럼값이 NULL일 경우 반환값2 반환

 

// 사원들의 부서 여부 조회
SELECT EMP_NAME, NVL2(DEPT_CODE, '부서있음', '부서없음')
FROM EMPLOYEE;

 

 

 

- NULLIF

작성법 - NULLIF(비교대상1, 비교대상2)


* 두 개의 값이 일치하면 NULL 반환
* 두 개의 값이 일치하지 않으면 비교대상1 값을 반환

 

SELECT NULLIF('123', '123')
FROM DUAL; 
// NULL

SELECT NULLIF('123', '456')
FROM DUAL;
// 123

 

 

 

 

선택 함수

 

- DECODE : 비교하고자 하는 값 또는 컬럼이 조건식과 같으면 결과 값 반환

작성법 - DECODE(표현식, 조건1, 결과1, 조건2, 결과2, ..., DEFAULT)

 

* DEFAULT : 모든 조건이 불일치 시 반환할 값

 

// 사원명, 주민번호, 성별 조회
SELECT EMP_NAME, EMP_NO, SUBSTR(EMP_NO, 8, 1),
DECODE(SUBSTR(EMP_NO, 8, 1), '1', '남', '2', '여') AS "성별"
FROM EMPLOYEE;

// 직원의 급여 조회시 각 직급별로 인상해서 조회
// J7인 사원은 급여를 10% 인상, J6인 사원은 급여를 15% 인상, J4인 사원은 급여를 20% 인상
// 그 외의 사원은 급여를 5% 인상 

SELECT EMP_NAME, JOB_CODE, SALARY,
DECODE(JOB_CODE, 'J7', SALARY * 1.1,
                 'J6', SALARY * 1.15,
                 'J5', SALARY * 1.2,
                 SALARY * 1.05) AS "인상된 급여"
FROM EMPLOYEE;

 

 

 

- CASE : 비교하고자 하는 값 또는 컬럼이 조건식과 같으면 결과 값 반환(조건은 범위 값 가능)

작성법

CASE 

WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
WHEN 조건3 THEN 결과3
...
ELSE 결과N
END

 

// 사원들의 연봉 레벨 조회
SELECT EMP_NAME, SALARY,
    CASE WHEN SALARY >= 5000000 THEN '고급'
         WHEN SALARY >= 3500000 THEN '중급'
         ELSE '초급'
    END AS "레벨"
FROM EMPLOYEE;

 

 

 

 

그룹 함수

하나 이상의 행을 그룹으로 묶어 연산하며 총합, 평균 등을 하나의 컬럼으로 반환하는 함수

 

- SUM : 해당 컬럼 값들의 총합 반환

// 전 사원의 총 급여합
SELECT SUM(SALARY) || '원' AS "총 급여합"
FROM EMPLOYEE;
// 70096240원

// 부서코드가 D5인 사원들의 총 연봉합
SELECT SUM(SALARY * 12)
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
// 189120000

 

 

- AVG : 해당 컬럼 값들의 평균 반환

// 전체 사원들의 평균 급여 조회
SELECT ROUND(AVG(SALARY)) || '원' AS "평균 급여"
FROM EMPLOYEE;
// 3047663원

// 전체 사원들의 보너스 평균 조회
SELECT ROUND(AVG(NVL(BONUS, 0)), 2)
FROM EMPLOYEE;
// 0.08

 

 

 

- MAX / MIN : 그룹의 최대값과 최소값 반환

// 가장 높은 급여와 가장 낮은 급여 조회
SELECT MAX(SALARY), MIN(SALARY)
FROM EMPLOYEE;

// 가장 오래된 입사일과 가장 최근 입사일 조회
SELECT MAX(HIRE_DATE), MIN(HIRE_DATE)
FROM EMPLOYEE;

 

 

 

- COUNT : 테이블 조건을 만족하는 행의 개수 반환

 

* COUNT(*) : 조회된 결과의 모든 행 개수를 세서 반환
* COUNT(컬럼) : 제시한 해당 컬럼값이 NULL이 아닌 것만 행 개수 세서 반환
* COUNT(DISTINCT 컬럼) :  해당 컬럼값 중복을 제거한 후 행 개수 세서 반환

// 전체 사원 수
SELECT COUNT(*)
FROM EMPLOYEE;
// 23

// 여자 사원 수
SELECT COUNT(*)
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO, 8, 1) IN ('2', '4');
// 8

// 보너스를 받는 사원 수
SELECT COUNT(BONUS) 
FROM EMPLOYEE;
// 9

// 부서 배치를 받은 사원 수
SELECT COUNT(DEPT_CODE)
FROM EMPLOYEE;
// 21

// 중복 제거
SELECT COUNT(DISTINCT DEPT_CODE)
FROM EMPLOYEE;
// 6