0913 DB - 형 변환 함수
형 변환 함수란?
형변환이라는 것은 두개의 데이터의 데이터 타입이 일치하도록 변환하는 것이다.
숫자와 문자열의 비교나 문자열과 날짜의 비교처럼 데이터타입이 같지않을때 사용한다.
오라클에는 크게 숫자, 문자, 날짜의 3가지 데이터 타입이 있는데, 이 타입들은 함수를 통해 서로 형 변환이 가능하다.
물론, 묵시적으로도 DBMS가 자동 형 변환해주는 경우도 있지만 다음과 같이 함수를 통해 명시적으로 형 변환해주는 것이 권장된다.
'A' 를 숫자로 바꾸는 것
-> TO_NUMBER 함수 사용
'1' (문자)을 숫자로 바꾸는 것
무조건 적인 변환을 지원하진 않지만, 숫자인 양식을 띄고 있는 것은 다시 숫자로 변환을 해줄 수 있다.
=> TO_NUMBER 함수 사용
숫자를 문자로 바꾸는 것
제한 없이 변환이 가능하다.
=> TO_CHAR 함수 사용
문자를 날짜로 바꾸는 것
날짜의 형식만 갖추고 있다면 가능함.
=>TO_DATE 함수 사용
날짜를 문자로 바꾸는 것
=> TO_CHAR 함수 사용
암시적 형변환 / 명시적 형변환
명시적(Explicit) 형변환
형변환함수를 사용해서 데이터 타입을 일치시키는 것으로 개발자가 SQL을 사용할 때 형변환 함수를 사용해야 한다.
TO_NUMBER(문자열) : 문자열을 숫자로 변환한다.
TO_CHAR(숫자, 날짜,[ FORMAT]) : 숫자 혹은 문자를 지정된 FORMAT문자로 변환한다.
TO_DATE(문자열, FORMAT) : 문자열을 지정된 FORMAT의 날짜형으로 변환한다.
=> 단순한 숫자이긴 하지만, 문자로 변환해서 쓰는 것을 추천한다. 혹시나 문법이 바뀌더라도, 검색만 하면 찾을 수 있기 때문에
ex) 회사에 입사했더니, 너무 오래된 문법이라 새롭게 고치고 싶을 경우.. 암시적 형변환 일 때는 파악하기 힘들고, 수정하기 힘들다.
암시적(Implicit) 형변환
개발자가 형변환을 하지 않은 경우 데이터베이스 관리시스템이 자동으로 형변환되는 것을 의미한다.
※인덱스 컬럼에 형변환을 수행하면 인덱스를 사용하지 못한다.
인덱스 데이터를 빠르게 조회하기 위해 인덱스 키를 기준으로 정렬해 놓은 데이터 이다.
BUT 인덱스는 기본적으로 변형이라는 것이 발생하면 사용할 수 없다.(예외 유있음)
인덱스가 있다하더라도 인덱스 컬럼에 형변환이 발생하면 인덱스를 사용할수 없다.
=> 가급적이면 쓰지 않는 것을 추천
1) TO_CHAR 함수 (DATE -> CHAR)
날짜데이터를 원하는 형식의 문자열로 변환하여 출력하는 함수
TO_CHAR(날짜데이터, '형식 문자') / TO_CHAR(date, 'format_model')
SELECT employee_id, HIRE_DATE ,TO_CHAR(hire_date, 'MM/YY') Month_Hired
FROM EMPLOYEES
WHERE last_name = 'Higgins';
hire_date 를 -> mm/yy 형식으로 가공을 한 것.
TO_CHAR(날짜 -> 문자) 함수의 형식 문자
1. 온전한 영단어 형태
날짜의 요소들을 영문 스펠링 형태로 출력해주는 형식 문자
- YEAR
- MONTH
- DAY
SQL> SELECT TO_CHAR(sysdate, 'DAY / YEAR / MONTH / DAY')
2 FROM dual;
DBEAVER
SQL
출력
TO_CHAR(SYSDATE,'YEAR/MONTH/DAY')
--------------------------------------------------------------------------------
TWENTY TWENTY-TWO / SEPTEMBER / TUESDAY
2. 줄임말 영단어 형태의 형식 문자
- MON : MONTH의 3자리 약어
- DY : DAY의 3자리 약어
SQL> SELECT TO_CHAR(sysdate, 'MON / DY')
2 FROM dual;
출력
TO_CHAR(SYSDATE,'MON/DY')
---------------------------
SEP / TUE
3자리로 출력 됨.
3.형식 요소 단어의 첫 글자 반복
-각 날짜의 요소값을 숫자문자 형태로 표현하는 형식문자
-YYYY : 년도의 네자리 숫자값
-MM : 월의 두자리 숫자값
-DD : 한 달 중 몇 번째 날인지 숫자로 표현
SQL> SELECT TO_CHAR(sysdate, 'YYYY / MM / DD')
2 FROM dual;
TO_CHAR(SYSDAT
--------------
2022 / 09 / 13
숫자로 출력된다.
문제
1. employees 테이블로부터 사원들의 employee_id, last_name, salary 15.5% 인상된 급여(New salary),
새 급여에서 이전 급여를 뺀 값 (Increase)을 출력하는 구문을 작성하시오. (단, 4,5번째 컬럼은 소수점 첫째자리에서 반올림하여 정수로 표현하시오.)
내가 푼 쿼리
SELECT employee_id, last_name, salary, ROUND(salary*1.155,0) AS newsalary, round((salary*1.155)-salary,0) AS increase
FROM EMPLOYEES ;
컬럼명도 지정을 해줘야 하는 문제이다. (as 변경하고 싶은 테이블명)
강사님이 푼 쿼리
SELECT employee_id, last_name, salary,
ROUND(salary*1.155, 0) "New Salary", ROUND(salary*1.155 - salary, 0) "INCREASE"
FROM EMPLOYEES
확실히 깔끔하고 차이가 나는 부분..,
문제
2. employees 테이블로부터 사원들의 last_name 과 salary 를 출력하되 특히 급여 15자리로 표시하고 왼쪽부터 $ 기호가 채워지도록 지정하시오.
내가 푼 쿼리
SELECT employee_id, last_name, salary,
LPAD(salary, 15, '$') lpad
FROM EMPLOYEES
강사님이 푼 쿼리
SELECT last_name, LPAD(salary,15,'$') salary
FROM employees;
이 문제도 역시나 테이블 명을 SALARY 로 변경해줘야 한다.