SQL - Functions
6 minute read
SQL 함수의 목적
- 데이터 값을 계산하거나 조작한다. (단일 행 함수)
- 행의 그룹에 대해 계산하거나 요악한다. (그룹 합수)
- 열의 데이터 타입을 변환한다. 즉, 날짜와 숫자 등 데이터 타입을 상호 변환한다.
단일 행 함수
데이터 값을 하나씩 계산하고 조작한다.
데이터 타입의 종류
저장 데이터 | 데이터 타입 | 설명 |
---|---|---|
문자 | CHAR(n) | n 크기만큼 고정 길이의 문자 타입을 저장한다. 최대 2,000byte까지 저장할 수 있다. |
문자 | VARCHAR2(n) | n 크기만큼 가변 길이의 문자 타입을 저장한다. 최대 4,000byte까지 저장할 수 있다.(실무에서 CHAR보다 더 많이 사용) |
숫자 | NUMBER(p, s) | 숫자 타입을 저장한다.(p: 정수, s: 소수) |
날짜 | DATE | 날짜 타입을 저장한다. |
단일 행 함수의 종류
종류 | 설명 |
---|---|
문자 타입 함수 | 문자를 입력받아 문자와 숫자를 반환 |
숫자 타입 함수 | 숫자를 입력만아 숫자를 반환 |
날짜 타입 함수 | 날짜에 대한 연산을 한다.MONTHS_BETWEEN (숫자를 반환)를 제외한 모든 날짜 타입 함수는 날짜 값을 반환 |
변환 타입 함수 | 임의의 데이터 타입의 값을 다른 데이터 타입으로 변환 |
일반 함수 | 그외 NVL, DECODE, CASE, WHEN 등 |
특징
- 각 행에 대해 수행
- 데이터 타입에 맞는 함수를 사용해야 함
- 행별로 하나의 결과를 반환
- SELECT, WHERE, ORDER BY 절 등에서 사용
- 함수를 중첩해서 사용 가능
- 중첩으로 사용할 경우 가장 안쪽부터 바깥쪽 순으로 진행
문자 타입 함수
문자 함수의 종류
함수 | 설명 | 예 | 결과 |
---|---|---|---|
LOWER | 값을 소문자로 변환 | LOWER(‘ABCD’) | abcd |
UPPER | 값을 대문자로 변환 | UPPER(‘abcd’) | ABCD |
INITCAP | 첫 글자만 대문자로 변환 | INITCAP(‘abcd’) | Abcd |
SUBSTR | 문자열 중 일부분을 선택 | SUBSTR(‘ABC’, 1, 2) | AB |
REPLACE | 특정 문자열을 교체 | REPLACE(‘AB’, ‘A’, ‘E’) | EB |
CONCAT | 두 문자열을 연결 | CONCAT(‘A’, ‘B’) | AB |
LENGTH | 문자열의 길이 | LENGTH(‘AB’) | 2 |
INSTR | 문자열의 위치 | INSTR(‘ABCD’, ‘D’) | 4 |
LPAD | 왼쪽부터 특정 문자로 자리 채움 | LPAD(‘ABCD’, 6, ‘*’) | **ABCD |
RPAD | 오른쪽부터 특정 문자로 자리 채움 | RPAD(‘ABCD’, 6, ‘*’) | ABCD** |
LTRIM | 주어진 문자열의 왼쪽 문자 삭제 | LTRIM(‘ABCD’, ‘AB’) | CD |
RTRIM | 주어진 문자열의 오른쪽 문자 삭제 | RTRIM(‘ABCD’, ‘CD’) | AB |
- LOWER, UPPER, INITCAP
# employees 테이블에서 last_name을 소문자와 대문자로 각각 출력, email의 첫 번째 문자는 대문자로 출력
SELECT last_name,
LOWER(last_name) LOWER적용,
UPPER(last_name) UPPER적용,
email,
INITCAP(email) INITCAP적용
FROM employees;
- SUBSTR
# employees 테이블에서 job_id 데이터 값의 첫째 자리부터 시작해서 두 개의 문자를 출력
SELECT job_id,
SUBSTR(job_id, 1, 2) 적용결과
FROM employees;
- REPLACE
# employees 테이블에서 job_id 문자열 값이 ACCOUNT면 ACCNT로 출력
SELECT job_id,
REPLACE(job_id, 'ACCOUNT', 'ACCNT') 적용결과
FROM employees;
- LPAD, RPAD
# employees 테이블에서 first_name에 대해 12자리의 문자열 자리를 만들되 first_name의 데이터 값이 12자리보다 작으면 왼쪽부터 *를 채워서 출력
SELECT first_name,
LPAD(first_name, 12, '*') LPAD적용결과
FROM employees;
- LTRIM, RTRIM
# employees 테이블에서 job_id의 데이터 값에 대해 왼쪽 방향부터 'F'문자를 만나면 삭제하고 오른쪽 방향부터 'T'문자를 만나면 삭제해서 출력
SELECT job_id,
LTRIM(job_id, 'F') LTRIM적용결과,
TRTIM(job_id, 'T') RTRIM적용결과
FROM employees;
- TRIM: 공백 제거
SELECT 'start'||TRIM(' - space - ') ||'end' 제거된_공백
FROM dual;
숫자 타입 함수
- 숫자 타입 함수의 종류
함수 | 설명 | 예 | 결과 |
---|---|---|---|
ROUND | 반올림 | ROUND(15,351, 0) | 15 |
TRUNC | 절삭 | TRUNC(15.351, 1) | 15.3 |
MOD | 나머지 | MOD(15, 2) | 1 |
CEIL | 정수로 올림 | CEIL(15.351) | 16 |
FLOOR | 정수로 내림 | FLOOR(15.351) | 15 |
SIGN | 양수(1), 음수(-1), 0을 구분 | SIGN(15) | 1 |
POWER | 거듭제곱 | POWER(2, 3) | 8 |
SQRT | 제곱근 | SQRT(4) | 2 |
- ROUND
# employees 테이블에서 salary를 30일로 나눈 후 나눈 값의 소수점 첫째 자리, 소수점 둘째 자리, 정수 첫째 자리에서 반올림한 값을 출력
SELECT salary,
salary/30 일급,
ROUND(salary/30, 0) 적용결과0,
ROUND(salary/30, 1) 적용결과1,
ROUND(salary/30, -1) 적용결과MINUS1
FROM employees;
- TRUNC
# employees 테이블에서 salary를 30일로 나누고 나눈 값의 소수점 첫째 자리, 소수점 둘째 자리, 정수 첫째 자리에서 절삭하여 출력
SELECT salary,
salary/30 일급,
TRUNC(salary/30, 0) 적용결과0,
TRUNC(salary/30, 1) 적용결과1,
TRUNC(salary/30, -1) 적용결과MINUS1
FROM employees;
날짜 타입 함수
- 날짜에 숫자를 연산하면 날짜 결과를 출력
- 날짜에 날짜를 빼면 두 날짜 사이의 일수를 출력
-
날짜에 시간을 연산하려면 24로 나누어서 연산한다.
- 날짜 연산 규칙 사례
날짜 연산 | 설명 | 반환값 |
---|---|---|
Date + Num | 날짜에 일수를 더함 | Date |
Date - Num | 날짜에 일수를 뺌 | Date |
Date - Date | 날짜에서 날짜를 뺌 | 일수 |
Date + Num / 24 | 날짜에 시간을 더할때는 24로 나누어서 날짜에 더함 | Date |
SELECT TO_CHAR(SYSDATE, 'YY/MM/DD/HH24:MI') 오늘날짜,
SYSDATE + 1 더하기1,
SYSDATE -1 빼기1,
TO_DATE('20200210')-TO_DATE('20200209') 날짜빼기,
SYSDATE + 13/24 시간더하기
FROM DUAL;
- 날짜 함수의 종류
날짜 함수 | 설명 | 예 | 결과 |
---|---|---|---|
MONTHS_BETWEEN | 두 날짜 사이의 월수를 계산 | MONTHS_BETWEEN(SYSDATE, HIRE_DATE) | 171.758 |
ADD_MONTHS | 월을 날짜에 더함 | ADD_MONTHS(HIRE_DATE, 5) | 20/02/15 |
NEXT_DAY | 명시된 날짜로부터 돌아오는 요일(Sunday:1) | NEXT_DAY(HIRE_DATE, 1) | 20/02/16 |
LAST_DAY | 월의 마지막 날 | LAST_DAY(HIRE_DATE) | 20/02/29 |
ROUND | 가장 가까운 연도나 월로 반올림 | ROUND(HIRE_DATE, ‘MONTH’) | 20/02/01 |
TRUNC | 가장 가까운 연도나 월로 절삭 | TRUNC(HIRE_DATE, ‘MONTH’) | 20/02/01 |
- MONTHS_BETWEEN
# employees 테이블에서 department_id가 100인 직원에 대해 오늘 날짜, hire_date, 오늘날짜와 hire_date 사이의 개월 수를 출력
SELECT SYSDATE,7
hire_date,
MONTHS_BETWEEN(SYSDATE, hire_date) 적용결과
FROM employees
WHERE department_id = 100;
- ADD_MONTHS
# employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date에 3개월을 더한 값, hire_date에 3개월을 뺀 값을 출력
SELECT hire_date,
ADD_MONTHS(hire_date, 3) 더하기_적용결과,
ADD_MONTHS(hire_date, -3) 빼기_적용결과,
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
- NEXT_DAY
# employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date에서 가장 가까운 금요일의 날짜가 언제인지 문자로 지정해서 출력, 숫자로도 출력
SELECT hire_date,
NEXT_DAY(hire_date, '금요일') 적용결과_문자지정,
NEXT_DAY(hire_date, 6) 적용결과_숫자지정
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
- LAST_DAY
# employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date를 기준으로 해당 월의 마지막 날짜를 출력
SELECT hire_date,
LAST_DAY(hire_date) 적용결과
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
- ROUND, TRUNC
# employees 테이블에서 employee_id가 100과 106 사이인 직원의 hire_date에 대해 월 기준 반올림, 연 기준 반올림, 월 기준 절삭, 연 기준 절삭을 출력
SELECT hire_date,
ROUND(hire_date, 'MONTH') 적용결과_ROUND_M,
ROUND(hire_date, 'YEAR') 적용결과_ROUNT_Y,
TRUNC(hire_date, 'MONTH') 적용결과_TRUNC_M,
TRUNC(hire_date, 'YEAR') 적용결과_TRUNC_Y
FROM employees
WHERE employee_id BETWEEN 100 AND 106;
좋은 책이긴 하나 Oracle에 한정된 내용으로, 당장 필요로 하는 지식의 범위는 아니기 때문에, 실습과 정리는 여기까지만 하고, 그냥 읽어보기로만 함.
MySQL을 사용한다면 SQL 첫걸음을 보세요!!
I feedback.
Let me know what you think of this article in the comment section below!
Let me know what you think of this article in the comment section below!
comments powered by Disqus