SQL 함수(FUCNTION)_단일행함수

·2022년 11월 17일
0

Oracle/SQL

목록 보기
6/16

오라클의 함수는 무조건 리턴값이 있음
함수는 단일행 함수와 복수행 함수가 있음

1. 단일행 함수 : 하나의 행(ROW)당 하나의 결과값을 반환하는 함수(리턴값이 여러개)

문자함수

(1) CONCAT(컬럼명,'붙일문자') : 문자열연결. ||연산자와 동일함

예시)
SELECT EMPNO, CONCAT(DEPTNO,'번 부서') FORM EMP;
출력예시> 7989 10번 부서 등...


(2) LOWER('문자열') : 문자열을 소문자로 리턴

참고) DAUL: SELECT는 꼭 테이블이 있어야 하는데, 테이블이 없을때 임시로 써주는 임시테이블
예시)
SELECT LOWER('NOLJIS') FROM DUAL;
출력예시>noljis

(3) UPPER('문자열') : 문자열을 대문자로 리턴

예시)
SELECT UPPER('noljis') FROM DUAL;
출력예시>NOLJIS

(3-1) INITCAP('문자열'):맨 앞자리만 대문자로 출력


(4) INSTR('문자열','위치찾는문자열') : 문자열의 위치찾기

참고) SQL의 인덱스는 1부터 시작한다.
예시)
SELECT INSTR('NOLJIS',N) FROM DUAL;
출력예시> 1


(5) SUBSTR('문자열',시작인덱스,범위) : 문자열 추출하기

문자열 추출이지만 SQL은 형변환이 유연해서 숫자도 가능
예시)
SELECT SUBSTR('NOLJIS',1,3)
출력예시> NOL

범위가 없으면 끝까지 조회해서 출력함
SELECT SUBSTR('NOLJIS',4)
출력예시> JIS
마이너스로 값을 주면 오른쪽->왼쪽으로 값을 조회함. BUT 출력은 왼쪽->오른쪽 순으로 한다.
예시)
SELECT SUBSTR('NOLJIS',-5,3) FROM DUAL;
출력예시> OLJ

SELECT * FROM WHERE SUBSTR(HIREDATE,4,2)=12;
--입사한 월이 12월인 사원들의 모든 정보조회

(5-1) INSTR('문자열','찾는문자열',시작인덱스,문자열에 중복값이 있으면 몇번째에 있는걸 찾는지..) : 문자열 추출하기

예시
SELECT INSTR('RAINBOWROMANCE','R',1,2) FROM DUAL; --RAINBOWROMANCE 문자열에서 두번째로 오는 R은 어디에 위치하는가
출력예시> 8

SELECT INSTR('RAINBOWROMANCE','R',2,2) FROM DUAL;
출력예시>0
두번째글자부터 조회를 했기 때문에 AINBOWROMANCE중에서 조회를 함. 두번째 R은 없기 때문에 0을 리턴한다.


(6) LENGTH('문자열') : 문자열길이 구하기

예시)
SELECT LENGTH('NOLJIS') FROM DUAL;
출력예시> 6


(7) REPLACE('문자열','찾는문자열','바꿀문자열') : 문자열바꾸기

예시)
SELECT REPLACE('NOLJIS','S','N') FROM DUAL;
출력예시> NOLJIN

(8) LPAD('문자열',전체 자릿수,'채울문자'): 왼쪽남는자리에 문자열채우기 공백도 됨!

예시)
SELECT LPAD('JIS',6,'NOL') FROM DUAL;

(9) RPAD('문자열',전체자릿수,'채울문자') : 오른쪽남는자리에 문자열채우기

(10) LTRIM('문자열','없앨문자') : 왼쪽에 문자열 없애기(공백 제거하고 싶을때 공백써도 됨)

무조건 첫번째 문자열부터 없애줌
예시)
SELECT LTRIM('NOLJIS','NOLJ') FROM DUAL;
출력예시> IS

(11) RTRIM('문자열','없앨문자') : 오른쪽에 문자열 없애기

무조건 마지막 문자열부터 없애줌
SELECT RTRIM('NOLJIS','LJIS') FROM DUAL;
출력예시> NO

중첩해서 쓸 수도 있다
예시)
SELECT RTRIM(LTRIM('NOLJIS','NOLJ'),'S') FROM DUAL;
출력예시> I



(12) 날짜함수 SYSDATE: 현재 날짜

예시)
SELECT SYSDATE FROM DUAL;
출력예시> 22/11/17
연산도 가능함
예시)
SELECT SYSDATE+30 FROM DUAL; --현재날짜에서 30일 후
출력예시> 22/12/17
SELECT SYSDATE-30 FROM DUAL; --현재날짜에서 30일전
출력예시> 22/10/18

(12-1) 날짜함수 ADD_MONTHS(날짜,더할개월수): 개월단위로 연산

예시)
SELECT SYSDATE,ADD_MONTHS(SYSDATE,3) FROM DUAL;-- 현재날짜와 3개월 후의 날짜 출력
출력예시> 22/11/17 23/02/17

(12-2) 날짜함수 MONTHS_BETWEEN(날짜1,날짜2) : 날짜사이의 개월수 구하기

예시) 근무 개월수 구하기
SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE) "근무개월수" FROM EMP;
출력예시>
근무개월수
500.9257
...
(소수점이 나오는 이유는 날짜 시간까지 계산해서! 신경쓰지 말자)

(12-3) 날짜함수 TO_CHAR(날짜,'출력형식') : 날짜형식을 지정된 형식의 문자열로 얻어오는 함수. 얻어온 값은 스트링으로 처리됨

예시)
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD HH:MI:SS') FROM DUAL;--YYYY/MM/DD HH:MI:SS 형식으로 현재 날짜,시간 표현
출력예시> 2022-11-17 10:13:33

한글을 쓸땐 ""이용
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD ""HH"시"MI"분"SS"초"') FROM DUAL;
출력예시> 2022-11-17 10시16분04초
24시로 표현 : HH24
오전/오후를 표현: AM HH

(12-4) 날짜함수 TO_DATE('날짜가 쓰인 문자열','바꿔줄 날짜형태') --문자를 날짜로 변환하는 함수

예시)
SELECT TO_DATE('2022/02/01','YYYY/MM/DD') FROM DUAL;
출력예시> 22/02/01

문자열이 아니기 때문에 연산이 가능해진다
예시)
SELECT TO_DATE('2022/02/01','YYYY/MM/DD')-20 FROM DUAL;
출력예시> 22/01/12



(13-1) 수학함수 ABS(숫자): 절대값 구하기 함수

예시)
SELECT ABS(-10) FROM DUAL;
출력예시> 10

(13-2) 수학함수 CEIL(숫자) : 정수 올림값 구하기--소수점에서 올림함

예시)
SELECT CEIL(43.24424) FROM DUAL;
출력예시> 44

(13-3) 수학함수 FLOOR(숫자) : 정수 내림값 구하기 -- 소수점에서 내림함

예시)
SELECT FLOOR(43.26564) FROM DUAL
출력예시> 43

(13-4) 수학함수 ROUND(숫자,출력할 소수자리수) : 반올림 하기

예시)
SELECT ROUND(43.26564,2) FROM DUAL; -- 두번째 자리까지 반올림한다
출력예시> 43.27

없으면 소수점에서 반올림한다!
예시)
SELECT ROUND(43.26564) FROM DUAL;
출력예시> 43

두번째 인자값이 0이면 1의 자리까지 마이너스면 10의자리부터...!
예시)
SELECT ROUND(43.26564,0) FROM DUAL;
출력예시>43

SELECT ROUND(43.26564,-1) FROM DUAL;
출력예시>40

(13-5) 수학함수 MOD(숫자,나눌값) : 나머지값구하기

예시)
SELECT MOD(10,3) FROM DUAL;
출력예시> 1

(13-6) 수학함수 TRUNC(숫자,절삭할소수점자리) : 소수 미만 절삭하기

예시)
SELECT TRUNC(5.66232,2) FROM DUAL;
출력예시> 5.66

(13-6) 수학함수 POWER(숫자, 제곱해줄 숫자): N제곱

예시)
SELECT POWER(2,3) FROM DUAL;
출력예시> 8



(14) NVL(컬럼, NULL일때 치환할 값)

왜쓰냐? > NULL이 있는 행도 포함해서 연산하고 싶어서!
예시)
SELECT AVG(NVL(COMM,0)) FROM EMP; --COMM컬럼의 NULL값들을 0으로 치환한 뒤 COMM의 평균을 구한다.
출력예시> 183.33333

profile
웹개발입문자

0개의 댓글