[정리노트] SQLD 2024년 개정판 - 함수
함수
정의
- input value와 output vale의 관계를 정의하는 객체 (input 값을 출력해줌)
- FROM 절을 제외한 모든 절에서 사용 가능
기능
- 기본적인 쿼리문을 강력하게 해줌
- 데이터의 계산을 수행
- 개별 데이터의 항목을 수정
- 표시할 날짜 및 숫자 형식을 지정
- 열 데이터의 유형을 변환
종류
- 단일행 함수: input과 output의 관계가 1:1
- 복수행 함수: 여러 건의 데이터를 동시에 입력 받아서 하나의 요약값을 리턴 (그룹함수 또는 집계 함수 라고도 함)
문자 함수의 종류와 특징
- 대부분 단일행 함수를 취함
함수명 | 함수 기능 | 사용예시 | 출력 | 기타 설명 |
LOWER(대상) | 문자열을 소문자로 | LOWER(’ABC’) | abc | |
UPPER(대상) | 문자열을 대문자로 | UPPER(’abc’) | ABC | |
SUBSTR(대상,m,n) | 문자열 중 m위치에서 n개의 문자열 추출 | SUBSTR(’ABCDE’,2,3) | BCD | n 생략시 끝까지 추출 추출 위치가 -면 뒤에서 부터 n번째 앞의 오른쪽으로 스캔 |
INSTR(대상,찾을 문자열,찾을시작위치,반복횟수)) | 대상에서 찾을 문자열 위치 반환 | INSTR(’A#B#C#’,’#’,1,1) | 2 | |
INSTR(’A#B#C#’,’#’,3,2) | 6 | 3번째부터 두번째 발견된 # 위치 | ||
LTRIM(대상,삭제문자열) | 문자열 중 특정 문자열을 왼쪽에서 삭제 | LTRIM(’AABABAA’,’A’) | BABAA | 삭제문자열 생략 시 공백 삭제 |
RTRIM(대상,삭제문자열) | 문자열 중 특정 문자열을 오른쪽에서 삭제 | RTRIM(’AABABAA’,’A’) | AABAB | 삭제문자열 생략 시 공백 삭제 |
TRIM(대상) | 문자열 중 특정 문자열을 양쪽에서 삭제 | TRIM(’ ABCDE ’) | ABCDE | ORACLE TRIM은 공백만 삭제 가능 |
LPAD(대상,n,문자열) | 대상 왼쪽에 문자열을 추가하여 총 n의 길이 리턴 | LPAD(’ABC’,5,’*’) | **ABC | |
RPAD(대상,n,문자열) | 대상 오른쪽에 문자열을 추가하여 총 n의 길이 리턴 | RPAD(’ABC,5,’*’) | ABC** | |
CONCAT(대상1,대상2) | 문자열 결합 | CONCAT(’A’,’B’) | AB | 두 개의 인수만 전달 가능 |
LENGTH(대상) | 문자열 길이 | LENGTH(’ABCDE’) | 5 | |
REPLACE(대상,찾을문자열,바꿀문자열) | 문자열 치환 및 삭제 | REPLACE(’ABBA’,’AB’,’ab’) | abBA | 세번째 인수를 생략하거나, 빈 문자열 전달 시 찾을문자열 삭제가능 |
TRANSLATE(대상,찾을문자열,바꿀문자열) | 글자를 1대1로 치환 | TRANSLATE(’ABBA’,’AB’,’ab’) | abba | 매칭되는 글자끼리 치환(A는a로,B는b로 각각) 바꿀문자열 생략 불가, 빈문자열 전달 시 null 리턴 |
- CHR (숫자): 아스키 코드에 대한 문자 출력
- TRIM (문자열, 점검문자): 문자열의 양쪽으로부터 점검문자를 제거, 점검누자를 지정하지 않으면 공백 문자를 대상으로 함
SELECT LTRIM(' CHRIS') FROM DUAL;
SELECT TRM ('~~~Hi~~~','~") FROM DUAL;
SELECT SUBSTR('MyHome',3) FROM DUAL;
SELECT SUBSTR('YourHome', 1, 3) FROM DUAL;
SELECT REPLACE('MyHome','My','Your') FROM DUAL;
SELECT LPAD('Hi', 5, '~') FROM DUAL;
숫자 함수의 종류와 특징
- 단일행 함수 형태의 숫자함수
함수명 | 함수 기능 | 사용 예시 | 출력 | 기타 설명 |
ABS(숫자) | 절대값 반환 | ABS(-1.5) | 1.5 | |
ROUND(숫자,자리수) | 소수점 특정 자리에서 반올림 | ROUND(123.456,2) | 123.46 | 자리수가 음수이면 정수자리에서 반올림 |
소수점 특정 자리에서 반올림 | ROUND(123.456,-2) | 100 | 자리수를 지정하지 않을 경우 0을 기본값으로 사용 | |
TRUNC(숫자,자리수) | 소수점 특정 자리에서 버림 | TRUNC(123.456,2) | 123.45 | 자리수를 지정하지 않을 경우 0을 기본값으로 사용 |
SIGN(숫자) | 숫자가 양수면 1 음수면 -1 0이면 0 반환 | SIGN(-2) | -1 | |
FLOOR(숫자) | 작거나 같은 최대 정수 리턴 | FLOOR(3.5) | 3 | |
CEIL(숫자) | 크거나 같은 최소 정수 리턴 | CEIL(3.5) | 4 | |
MOD(숫자1,숫자2) | 숫자1을 숫자2로 나누어 나머지 반환 | MOD(7,2) | 1 | 숫자2가 0일 경우 숫자 1을 반환 |
POWER(m,n) | m의 n거듭제곱 | POWER(2,4) | 16 | |
SQRT(숫자) | 루트값 리턴 | SQRT(16) | 4 |
SELECT ROUND(123.76, 1) FROM DUAL; = 123.8
SELECT ROUND(173.76, -2) FROM DUAL; = 200
SELECT TRUNC(123.76, 1) FROM DUAL; = 123.7
SELECT TRUNC(123.76, -1) FROM DUAL; = 120
SELECT CEIL (12.77) FROM DUAL; = 13
SELECT FLOOR (25.4) FROM DUAL; = 25
SELECT FLOOR (25.4) FROM DUAL; = 26
SELECT MOD (15, -2) FROM DUAL; = 1
SELECT MOD (-15, -2) FROM DUAL; = -1
날짜형 함수의 종류와 특징
- 날짜 연산과 관련된 함수
- ORACLE과 SQL-Sever 함수 거의 다름
함수명 | 함수 기능 | 사용예시 | 출력 | 기타 설명 |
SYSDATE | 현재 날짜와 시간 리턴 | SYSDATE | 2024/02/14 18:44:34 | 날짜 출력형식에 따라 다르게 출력됨 (날짜만 출력될 수 있음) |
CURRENT_DATE | 현재 날짜 리턴 | CURRENT_DATE | 2024/02/14 | 날짜 출력형식에 따라 다르게 출력됨 (날짜만 출력될 수 있음) |
CURRENT_TIMESTAMP | 현재 타임스탬프 리턴 | CURRENT_TIMESTAMP | 2024/02/14 18:45:29 +09:00 | |
ADD_MONTHS(날짜,n) | 날짜에서 n개월 후 날짜 리턴 | ADD_MONTHS(SYSDATE,3) | 2024/05/14 18:44:34 | n이 음수인 경우 n개월 이전 날짜 리턴 |
LAST_DAY(날짜) | 주어진 월의 마지막 날짜 리턴 | LAST_DAY(SYSDATE) | 2024/02/29 18:44:34 | |
NEXT_DAY(날짜,n) | 주어진 날짜 이후 지정된 요일의 첫 번째 날짜 리턴 | NEXT_DAY(SYSDATE,1) | 2024/02/18 18:51:35 | 1:일요일, 2:월요일, … 7:토요일 |
ROUND(날짜,자리수) | 날짜 반올림 | ROUND(SYSDATE,’MONTH’) | 2024/02/01 0:00 | 월 이전자리에서 반올림 |
TRUNC(날짜,자리수) | 날짜 버림 | TRUNC(SYSDATE,’MONTH’) | 2024/02/01 0:00 | 월 이전자리에서 버fla |
MONTH_BETWEEN(날짜1,날짜2) | 날짜1과 날짜2 사이의 개월 수 리턴 | MONTH_BETWEEN(SYSDATE,HIREDATE) | 3.7234 | 날짜1 < 날짜2로 전달 시 음수 리턴 |
- SQL-Server
- SYSDATE → GETDATE
- ADD_MONTHS → DATEADD (월 뿐만 아니라 모든 단위 날짜 연산 가능)
- MONTHS_BETWWEN → DATEDIFF (두날짜 사이의 년,월,일 추출)
변환 함수의 종류와 특징
- 데이터 타임을 변환
- 문자를 숫자로, 숫자를 문자로, 날짜를 문자로 변경
함수명 | 함수 기능 | 사용예시 | 출력 | 기타 설명 |
TO_NUMBER(대상) | 숫자 타입으로 변경하여 리턴 | TO_NUMBER(’100’) | 100 | 문자100을 숫자 100으로 리턴 |
TO_CHAR(대상,포맷) | 1) 날짜의 포맷 변경 | TO_CHAR(SYSDATE,’MM/DD-YYYY’) | 02/14-2024 | 날짜 형식 변경(리턴은 문자타입) |
2) 숫자의 포맷 변경 | TO_CHAR(9000,’9,999’) | 9,000 | 천단위 구분기호 생성 (리턴은 문자타입) | |
TO_DATE(문자,포맷) | 주어진 문자를 포맷형식에 맞게 읽어 날짜로 리턴 | TO_DATE(’2024/01/01’,’YYYY/MM/DD’) | 2024/01/01 00:00:00 | 날짜로 리턴됨 * 포맷과 문자가 동일 해야함 |
FORMAT(날짜, 포맷) | 날짜의 포맷 변경 | FORMAT(GETDATE(), 'YYYY') | 2024 | SQL SERVER 함수 |
CAST(대상 AS 데이터타입) | 대을 주어진 데이터타입으로 변환 | CAST(’100’ AS int) | 100 | 문자100을 숫자100으로 리턴 |
- SQL-Sever
- TO_NUMBER, TO_DATE, TO_CHAR → CONVERT (포맷 전달 시)
- 단순 변환일 경우 주로 CAST 사용
그룹 함수의 종류와 특징
- 다중행 함수
- 여러 값이 input값으로 들어가 하나의 요약된 값으로 리턴
- group by와 함께 자주 사용됨
- Oracle과 SQL-Server 거의 동일
- COUNT의 경우 컬럼이 모두 NULL 값이면 0를 리턴, 나머지 함수는 다 NULL값은 계산에 포함하지 않고 무시
함수명 | 함수기능 | 사용예시 | 출력 | 기타 설명 |
COUNT(대상) | 행의 수 리턴 | SELECT COUNT(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
SUM(대상) | 총 합 리턴 | SELECT SUM(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
AVG(대상) | 평균 리턴 | SELECT AVG(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
MIN(대상) | 최솟값 리턴 | SELECT MIN(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
MAX(대상) | 최댓값 리턴 | SELECT MAX(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
VARIANCE(대상) | 분산 리턴 | SELECT VARIANCE(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
STDDEV(대상) | 표준편차 리턴 | SELECT STDDEV(SAL) FROM EMP; | 각 연산 결과 | NULL 무시하고 연산 |
- SQL-Sever
- VARIANCE → VAR
- STDDEV → STDEV
일반 함수의 종류와 특징
- 기타 함수 (NULL 치환 함수 등)
함수명 | 함수기능 | 사용예시 | 출력 | 기타 설명 |
DECODE(대상,값1,리턴1,값2,리턴2,…,그외 리턴) | 대상이 값이1이면 리턴1, 값이 2이면 리턴2, 그외에는 그외 리턴값 리턴 | DECODE(DEPTNO,10,A,B) | A 또는 B | 대소비교에 따른 치환 불가 그외 리턴 생략시 NULL 리턴 * Oracle 전용 함수 |
NVL(대상,치환값) | 대상이 NULL이면 치환값으로 치환하여 리턴 | NVL(COMM,0) | COMM값 또는 0 리턴 | |
NVL2(대상,치환값1,치환값2) | 대상이 NULL이면 치환값2로 치환, NULL이 아니면 치환값1로 리턴 | NVL2(COMM,COMM*1.1,0) | COMM*1.1값 또는 0 | COMM값 NULL이면 0, 아니면 COMM*1.1 리턴 |
COALSESCE(대상1,대상2,….,그외리턴) | 대상1이 NULL이면 대상2,대상2가 NULL이면 대상3,…,모두가 NULL이면 그외 리턴값이 리턴됨 | COALESCE(NULL, 100) | 100 | 그외리턴값 생략 시 널 리턴 |
ISNULL(대상, 치환값) | 대상이 NULL이면 치환값이 리턴 | ISNULL(NULL,100) | 100 | SQL서버 함수 |
NULLIF(대상1, 대상2) | 두값이 같으면 NULL 리턴, 다르면 대상1 리턴 | NULLIF(10,20) | 10 | |
CASE문 | 조건별 치환 및 연산 수행 | 밑에 참고 | 밑에 참고 |
ex) DECODE 사용 예시 (부서번호가 10번이면 인사부, 20번이면 재무부, 나머지는 NULL 리턴
SELECT DEPTNO,DECODE(DEPTNO,10,'인사부',20,'재무부') AS DNAME
FROM EMP;

ex) DECODE 사용 예시2 (DEPTNO가 10이면서 JOB이 CLERK면 A, DEPTNO가 10 이면서 CLERK가 아니면 B, TEPTNO가 10이 아니면 C
SELECT DEPTNO, JOB, DECODE(DEPTNO,10,DEODE(JOB,'CLERK','A','B'),'C') AS RESULT
FROM EMP;

ex) NVL, NVL2 사용 예제 (NVL2의 경우 NVL이랑 다르게 COMM의 값이 널이 아닐때도 치환값 정의 가능, NVL2의 경우 COMM이 널이 아니면 10% 인상값, 널이면 500 리턴)
SELECT COMM,NVL(COMM,0),NVL2(COMM,COMM*1.1,500)
FROM EMP;

ex) COALESCE 사용 예제 (DEPTNO1과 DEPTNO2중 널 아닌값 출력, 둘다 널이 아니면 맨 앞 순서대로 출력, 모두 널인 경우 마지막 인수값(0) 출력
SELECT DEPTNO1,DEPTNO2,COALESCE(DEPTNO1,DEPTNO2,0) AS RESULT
FROM STUDENT;

ex) CASE문 사용 예제 1 (CASE문을 사용하여 여러 조건(대소비교 가능)에 대한 치환 및 연산 가능
SELECT SAL,CASE WHEN SAL < 2000 THEN 'C'
WHEN SAL < 3000 THEN 'B'
ELSE 'A'
END AS SAL_GRADE
FROM EMP;

ex) CASE문 사용 예제2 (동등비교 시 위처럼 비교대상(DEPTNO)를 CASE와 WHEN 사이에 배치하면서 WHEN절 마다 반복하지 않아도 됨, 이때 DEPTNO. 데이터 타입과 WHEN절의 명시된 비교대상의 데이터 타입 반드시 일치해야 함)
SELECT DEPTNO,
CASE DEPTNO WHEN 10 THEN '인사부'
WHEN 20 THEN '총무부'
WHEN 30 THEN '재무부'
ELSE '기타'
END AS DNAME1,
CASE WHEN DEPTNO = 10 THEN '인사부'
WHEN DEPTNO = 20 THEN '총무부'
WHEN DEPTNO = 30 THEN '재무부'
ELSE '기타'
END AS DNAME2
FROM EMP;

반응형
'스터디 > SQL' 카테고리의 다른 글
[정리노트] SQLD 개정판 - GROUP BY (4) | 2024.08.21 |
---|---|
[정리노트] SQLD 2024년 개정판, WHERE (55) | 2024.08.20 |
[정리노트] SQLD 2024년 개정판 - SELECT (FROM 포함) (45) | 2024.08.20 |
[정리노트] SQLD 2024년 개정판 - 관계형 데이터베이스 개요 (41) | 2024.08.19 |
[기출문제] 1과목 - 데이터 모델링의 이해 (2024 개정판, 해설 포함) (3) | 2024.08.19 |