DB

내장형 함수, 형변환 함수, NULL함수

빵아지 2023. 2. 13. 01:18

내장형(built-in)함수

- 전부 안 외워도 됨
- 필요할 때마다 구글링하기 ex)오라클 내장형 함수


<문자형 함수>

#LOWER
=입력받은 문자열에서 대문자를 소문자로 바꿔줌

입력 값 : 문자형 리터럴 1개
출력 값 : 문자형 리터럴 1개

ex)

입력 값
출력 값

- DUAL = 테스트 할 때 쓰는 테이블!!! 기억하기
- FROM 뒤에 DUAL 적어놓고 SELECT 뒤에 이를테면 직원 이런 식으로 작성하면 오류값 뜸!
왜냐하면? 듀얼이란 테이블은 말 그대로 테스트용이여서 직원이라는 컬럼이 없어서




#UPPER
= 입력받은 문자열에서 소문자를 대문자로 바꿔줌

입력 값 : 문자형 리터럴 1개
출력 값 : 문자형 리터럴 1개

ex)

입력값
출력값





#SUBSTR
= 입력받은 문자형 리터럴에서 시작위치에서 길이만큼 잘라냄

입력 값 : 문자형 리터럴 1개, 시작위치, 길이
출력 값 : 문자형 리터럴 1개

ex)

입력 값
출력 값

-> 패스워드 컬럼에서 속성값의 두 번째부터 3개 잘라온다




#TRIM
= 입력받은 문자형 리터럴의 양 끝의 공백을 제거한다
(단, 문자 중간의 공백은 제거 안 됨)

ex)

입력 값
출력 값

-> TRIM을 SELECT에 두 개 작성 가능함
(다른 컬럼도 여러 개 쓸 수 있으니깐)





#REPLACE
= 입력받은 문자형 리터럴 안에 있는 바껴야 할 값을 바꾸고 싶은 값으로 변경하여 출력
(어디에서, 무엇을, 어떻게) 떠올리기!!!!!!!!!!
입력 값 : 문자형 리터럴 1개, 바뀔 값, 바꿀 값
출력 값 : 문자형 리터럴 1개

ex)

입력 값

-> REPLAE 해라! 주민등록번호 컬럼에서 '-' 표시를 ''를 통해 공백처리 해라!
내가 처음에 오류났던 부분인데 공백으로 값 보고싶다면 작은 따옴표를 두 개 작성해야 함
(=큰 따음표 하나 아님)

출력 값


- 문자형 함수 끝 -





<숫자형 함수>

#MOD
= 피제수를 제수로 나눈 나머지 숫자형 리터럴을 출력
(무엇에서, 무엇으로 나눈 나머지를 알고싶은지)
+ 숫자끼리 나눈 나머지와 컬럼 값을 나눈 나머지도 확인 가능

입력 값 : 숫자형 리터럴 2개 ( 피제수, 제수 ) ex) 피제수 : 10, / 제수 : 3
출력 값 : 숫자형 리터럴 1개 ex) 10 % 3 = 1

ex)

입력 값

-> 연봉 컬럼을 1000으로 나눈 나머지값을 알고싶어요!

출력 값






#ROUND
= 실수를 소수점 자릿수까지 반올림한 결과를 출력
(무엇에서 소수 몇째자리까지 나타내고 싶은지)

입력 값 : 숫자형 리터럴 2개 (실수, 소수점자릿수)
출력 값 : 숫자형 리터럴 값

ex)

입력 값

-> 반올림해라! 1.452라는 값을 소수 둘째자리까지 나타나게
(= 이러면 컴퓨터가 소수 셋째자리에서 반올림해서 값을 알려줌)

-> 반올림해라! 1.452라는 값을 소수 첫째자리까지 나타가게
(= 이러면 컴퓨터가 소수 둘째자리에서 반올림해서 값을 알려줌)

출력 값




- 숫자형 함수 끝 -


<날짜형 함수>

#SYSDATE
= 입력 시 바로 출력 됨(= (SYSDATE함수 뒤에 뭐 입력 안해도 됨)
현재 시간을 초단위까지 날짜형 리터럴로 출력

입력 값

적절한 테이블이 없을 경우에는 DUAL로 표시

출력 값

-> 년/ 월/ 일만 나오는 이유는 SQL DEVELOPER 상에서 YY/MM/DD 형태로 설정돼서!



< SYSDATE로 날짜 조작하기 >
-> 실무에서는 날짜 조작 한대

(내가 테스트 해봤는데 날짜를 더할 수도 있고 뺄 수도 있음)
SYSDATE + 1 ------> 하루더함
SYSDATE + 1/24 ------> 한시간더함
SYSDATE + 1/24/60 ------> 일분더함
SYSDATE + 1/24/60/60 ------> 일초더함

입력 값

- AS 뒤 별칭에 1일 더함 이런 식으로 작성하면 안 됨
(=자바 변수명 작성처럼 숫자로 시작? 안 된다)
- 숫자로 시간 표현하고 싶어도 참기!!!

출력 값

- 년/월/일만 나오는 이유는 SQL DEVELOPER 상에서 YY/MM/DD 형태로 설정




#LAST_DAY
= 입력받은 날짜형 값에 대해 해당 월의 마지막 날짜를 출력

입력 값 : 날짜형 리터럴 1개
출력 값 : 날짜형 리터럴 1개

ex)

입력 값

-> SYSDATE= 오늘 날짜를 의미
오늘 날짜가 속한 달의 마지막 날짜를 구해라!

출력 값

-> 저 데이터를 출력시킨 오늘 날짜가 속한 달은 22년 12월이였나봄




#ADD_MONTHS
= 입력받은 날짜형 값에 대해 숫자형 리터럴만큼 개월 수를 가감(+, -)하여 출력
함수 마지막은 S가 들어간다
ex)ADD_MONTH 라고 치면 안 됨

입력 값 : 날짜형 리터럴 1개, 숫자형 리터럴 1개
출력 값 : 날짜형 리터럴 1개

ex)

입력 값
출력 값

-> 60을 작성하면 60개월로 컴퓨터가 인식해줌
ADD가 들어갔다고 해서 더해진 개월 수만 값을 출력하진 않음 개월 수 빼기도 가능!
(즉 -인지 +인지 꼭 적어라)



- 날자형 함수 끝 -




형변환함수

= 특정 자료형으로 값을 변경해줌!!!


* 실무 팁 : 날짜형 -> 문자형 // 문자형 -> 날짜형은 자주 사용



1. 문자형을 숫자형으로 형변환>

이런 식으로 작성

-> 바꾸고 싶은 문자를 괄호 안에 작성하면 됨


2. 숫자형을 문자형으로 형변환


3. 날짜형을 문자형으로 형변환

입력 값

-> 오늘 날짜 데이터를 'YYYY/MM/DD HH24: MI :SS'형태로 바꾸고 싶어요!

출력 값
입력 값

-> 오늘 날짜를 구체적으로 어떻게 문자로 바꿀지 지정 안하게 되면? (SQL DEVELOPER 기준)

출력 값

-> 이렇게 값이 나옴 (=며칠인지까지만 나옴)


Q. 직원 테이블에서 입사일시 컬럼을 이용해 입사한 년도(YYYY)만 추출해주세요-> 입사한 년도를 문자형으로 형변환 해야 함!!!(YYYY면 날짜형이네---->X)

문제

->입사연도 추출하고 나면 컬럼에 줄줄이 내가 입력한 컬럼명 떠버리니깐 AS 필수임

문자형으로 형변환 하려면 TO_CHAR() 필요함
내가 처음에 TO_CHAR인지 TO_DATE인지 TO_NUMBER인지 헷갈렸음
TO_CHAR을 입력해놓고선 오류값 떠서 짜증나서 답 봤는데 언더바 입력 안 했었음!
형변환 할 때 꼭 언더바 써라



<날짜 및 시간관련 용어>
YYYY = 년도
MM = 월
DD = 일
HH24 = 시간 (hours에서 따옴)
MI = 분 (minutes 약자)
SS = 초 (second)


형변환 우선순위

날짜형 > 숫자형 > 문자형

-> 문자랑 숫자 만나면 문자가 숫자형으로 형변환 되어야 함



자동형변환 *** 내가 살짝 헷갈리니 기억해두기

= 연산을 하기 전에 먼저 형변환이 발생함

입력 값
출력 값

-> 문자형과 숫자형 형변환을 시도했는데 우선순위에서 밀린 문자형이 자동으로 형변환됨
-> 형변환 되니 사칙연산 알아서 해줌




NULL함수
= NVL, NVL2, DECODE, COALESCE

NULL함수 출현 배경 NULL은 산술, 비교, 연산 모두 불가능


ex)

나이 컬럼에 1을 더해서 올해나이를 출력했는데 null 부분은 1을 더해도 null임
왜냐하면null은 정해지지 않은 값이여서 0이 아님

NULL함수 종류 (4가지 있음)

-이 중 NVL과 DECODE는 실무에서 자주 사용되니 필히 기억해두자




#NVL(data1, data2)
= data 1에 null값이 들어오면 data2를 출력하고 null이 아니면 data1을 출력

ex)


-> NVL(나이, 0)을 해석하자면 나이컬럼에서 null이 아닌 사람들은 나이 데이터가 출력되는데
null인 사람은 0으로 데이터 출력해줌!!!




#NVL2(data1, data2, data3)
= data1에 null이 아닌 값이 들어오면 data2를 출력, null이면 data3 출력

내가 그림판에서 그림

-내가 선생님께 무려 두 번이나 물어봤는데 당 떨어져서 이해 못한 NULL함수임ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
선생님 나를 이해시키기 위해 예시도 여러 개 알려주셨는뎈,,, 그때 당시 이해는 못했으나 지금 생각하니 감사합니다.....
-별거아니네

ex)





#DECODE(data1, data2, data3, data4)
이해가 좀 잘 안 됨
= data1과 data2가 동일하면 data3을 출력하고, 그렇지 않으면 data4를 출력

ex)





#COALESCE(data1, data2, data3, ... dataN)
= 앞에서부터 data를 확인하다가 null이 아닌 값이 나오면 출력

ex)