코딩하는 문과생
[SQL] 4. Additional SELECT(2) 본문
# 데이터 타입 변환 함수:
- 암시적 변환
- 명시적 변환
- TO_CHAR( input_type[, format] )
SELECT TO_CHAR(1234, '09999')
FROM DUAL;
//01234
//****************************************
SELECT TO_CHAR(1234, '99,999')
FROM DUAL;
//1,234
SELECT EMP_NAME,
SALARY
FROM EMPLOYEE
WHERE EMP_ID = 100;
//묵시적 형변환은 성능을 떨어뜨린다.
//왜냐하면 묵시적 형변환은 값이 아닌 칼럼을 변환시키기 때문에
//****************************************
SELECT EMP_NAME,
SALARY
FROM EMPLOYEE
WHERE EMP_ID = TO_CHAR(100);
//명시적으로 해주는 것이 좋다.
- TO_DATE
SELECT TO_CHAR( SYSDATE, 'PM HH24:MI:SS' )
FROM DUAL;
// 오전 09:32:39
//****************************************
SELECT TO_CHAR( SYSDATE, 'Year, Q' )
FROM DUAL;
// Twenty Twenty, 1
//****************************************
SELECT TO_CHAR( SYSDATE, 'MON DAY, YYYY' )
FROM DUAL;
// 1월 화, 2020
SELECT EMP_NAME AS 이름,
TO_CHAR(HIRE_DATE, 'YYYY-MM-DD') AS 입사일
FROM EMPLOYEE
WHERE JOB_ID = 'J7';
//****************************************
SELECT EMP_NAME AS 이름,
TO_CHAR(HIRE_DATE, 'YYYY"년" MM"월" DD"일"') AS 입사일
FROM EMPLOYEE
WHERE JOB_ID = 'J7';
SELECT EMP_NAME
FROM EMPLOYEE
WHERE HIRE_DATE='04/04/30';
// 강중훈
- 복합
SELECT TO_DATE('20100101', 'YYYYMMDD')
FROM DUAL;
// 2010-01-01 00:00:00.0
//****************************************
SELECT TO_CHAR(TO_DATE('20100101', 'YYYYMMDD'), 'YYYY, MON')
FROM DUAL;
// 2010, 1월
//****************************************
SELECT TO_CHAR(TO_DATE('980630', 'YYMMDD'), 'YYYY.MM.DD')
FROM DUAL;
// 2098.06.30
// 세기가 부여된다.
//****************************************
SELECT TO_CHAR(TO_DATE('980630', 'RRMMDD'), 'YYYY.MM.DD')
FROM DUAL;
// 1998.06.30
//****************************************
SELECT TO_CHAR(TO_DATE('980630', 'YYMMDD'), 'RRRR.MM.DD')
FROM DUAL;
// 2098.06.30
// 의미가 없다.
- TO_NUMBER
오라클에서 문자열과 문자열을 더하는 부분은 '+' 가 아닌 '||'를 사용해야 한다.
SELECT EMP_NAME, EMP_NO,
SUBSTR(EMP_NO, 1, 6) AS 앞부분,
SUBSTR(EMP_NO, 8) AS 뒷부분,
TO_NUMBER( SUBSTR(EMP_NO, 1, 6) ) + TO_NUMBER( SUBSTR(EMP_NO, 8) ) AS 결과
FROM EMPLOYEE
WHERE EMP_ID = '101';
// 강중훈 621136-1006405 621136 1006405 1627541
# 기타함수:
- NVL(expr1, expr2) : NULL을 지정한 값으로 변환하는 함수
SELECT EMP_NAME,
(SALARY*12) +
( (SALARY*12) + NVL(BONUS_PCT, 0) )
FROM EMPLOYEE
WHERE SALARY > 3500000;
// 한선기 216000000.2
// 강중훈 132000000
- DECODE( expr, search1, result1 [ , searchN, resultN, ... ] [ , default ]):
SELECT 구문으로 IF-ELSE 논리를 제한적으로 구현한 오라클 DBMS 전용함수
expr과 search를 비교하고 true면 result 부분과, else면 default부분과 매칭된다.
SELECT EMP_NAME
, EMP_NO
, SALARY
, DECODE(SUBSTR(EMP_NO, 8, 1)
, '1', '남'
, '2', '여'
, '3', '남'
, '4', '여'
, '기타') AS 성별
FROM EMPLOYEE
WHERE JOB_ID = 'J7';
//성별이 여자인 사람들의 정보를 모두 출력
SELECT *
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO, 8, 1) IN ('2', '4');
//사수가 있으면 직원, 아니면 관리자인 경우
SELECT EMP_ID
, EMP_NAME
, MGR_ID
, DECODE(MGR_ID, NULL, '관리자', '직원') AS 직원구분
FROM EMPLOYEE
WHERE JOB_ID = 'J4' ;
SELECT EMP_ID
, EMP_NAME
, MGR_ID
, NVL2(MGR_ID, '직원', '관리자') AS 직원구분
FROM EMPLOYEE
WHERE JOB_ID = 'J4' ;
//NVL2는 삼항연산자와 비슷하다.
//직급별 인상급여를 확인하고 싶다.
//J7은 20%, J6은 15%, J5는 5% 인상, 나머지 직급은 해당 급여를 받는 직원의
//이름, 직급, 급여, 인상급여를 조회하라.
SELECT EMP_NAME
, JOB_ID
, SALARY
, DECODE(JOB_ID, 'J7', SALARY * 1.2, 'J6', SALARY * 1.1, 'J5', SALARY * 1.05, SALARY) AS 인상급여
FROM EMPLOYEE
- CASE expr WHEN search1 THEN result1 [WHEN..THEN..][ELSE default] END
- CASE WHEN condition1 THEN result1 [WHEN..THEN..][ELSE default] END
SELECT EMP_NAME
, JOB_ID
, SALARY
, CASE JOB_ID WHEN 'J7' THEN SALARY*1.2
WHEN 'J6' THEN SALARY*1.15
WHEN 'J5' THEN SALARY*1.05
ELSE SALARY
END AS 인상급여
FROM EMPLOYEE
//결과는 위와 동일
//*************************************
SELECT EMP_NAME
, JOB_ID
, SALARY
, CASE WHEN JOB_ID = 'J7' THEN SALARY*1.2
WHEN JOB_ID ='J6' THEN SALARY*1.15
WHEN JOB_ID ='J5' THEN SALARY*1.05
ELSE SALARY
END AS 인상급여
FROM EMPLOYEE
//결과는 위와 동일
// 직원들의 급여등급을 확인하고 싶다.
// 급여가 300 이하면 초급, 400 이하면 중급, 400 이상이면 고급으로 간주한다.
// 직원들의 이름, 급여, 급여등급을 출력하라...
SELECT EMP_NAME
, SALARY
, CASE WHEN SALARY <= 3000000 THEN '초급'
WHEN SALARY <= 4000000 THEN '중급'
ELSE '고급'
END AS 급여등급
FROM EMPLOYEE
- 함수의 복합
//사원 테이블에서 사원의 이름, 메일, 메일아이디를 조회하라
SELECT EMP_NAME
, EMAIL
, SUBSTR(EMAIL, 1, INSTR(EMAIL, '@')-1)
FROM EMPLOYEE
'프로그래밍 > SQL' 카테고리의 다른 글
[SQL] 6. JOIN (0) | 2020.01.21 |
---|---|
[SQL] 5. Additional SELECT(3) (0) | 2020.01.21 |
[SQL] 3. Additional SELECT (0) | 2020.01.20 |
[SQL] 2. SQL 기초 & SELECT (0) | 2020.01.20 |
[SQL] 1. 환경 설정 (0) | 2020.01.20 |