SQL - Functions

on under sql
6 minute read

모두의 SQL

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 첫걸음을 보세요!!

sql
comments powered by Disqus