DB는 보편적으로 일관성 및 무결성 유지를 위해 단일 DB로 설계하는 경우가 많다. (분산 설계는 특수)
이 때 함수 사용은 집합 처리•필터링•기본 집계(필요 시 윈도우•다차원 집계)와 같은 결정적•인덱스 친화 영역으로 한정하여, 포맷팅•문자열 결합•복잡한 비즈니스 규칙은 애플리케이션 계층으로 위임한다.
| 구분 | 설명 |
|---|---|
| 권장 함수 | 집계(통계) → SUM, AVG, COUNT, MIN, MAX 다차원 집계 → GROUP BY ROLLUP, GROUPING SETS, 윈도우/랭킹 → ROW_NUMBER, RANK, DENSE_RANK, LAG/LEAD NULL 처리 → COALESCE, NULLIF 기간 버킷팅/추출 → DATE_TRUNC, EXTRACT 문자열 집계/결합 → STRING_AGG, CONCAT_WS 단순 매핑 → CASE 최댓값/최솟값 선택 → GREATEST, LEAST JSON 존재성/키 조회 → @>, ?, `? |
| 지양 패턴 | 표현/포맷팅 → TO_CHAR, FORMAT, 화면용 CONCAT 인덱스 무력화 필터 → WHERE LOWER(col)=..., SUBSTRING(col,...) 비결정/시간의존 필터 → random(), now()을 조건/조인키에 사용 고비용 정규식/대량 치환 → REGEXP_REPLACE, REGEXP_MATCHES 남용 컬럼 산술 변환 비교 → col + interval '9h' < now(), col + 1 = 3 JSON 깊은 경로 직접 필터 → GIN 없이->> 조건 남용 |
| 함수 | 설명 | 결과값 |
|---|---|---|
ASCII('A') | 첫 문자에 대한 ASCII 코드 반환 | 65 |
CHR(65) | ASCII 코드에 해당하는 문자 반환 | 'A' |
CHAR_LENGTH('가나다') | 문자 수 반환 | 3 |
OCTET_LENGTH('가') | 바이트 길이 반환 (UTF-8 기준 한글 3바이트) | 3 |
CONCAT('A','B') | 문자열 연결 | 'AB' |
CONCAT_WS('-', 'A','B') | 구분자 포함 연결 | 'A-B' |
FORMAT('Hello, %s %s', 'A','B') | 서식 문자열로 포맷팅 | 'Hello, A B' |
TO_CHAR(12345.678, 'FM999G999D00') | 숫자/날짜 서식화 | '12,345.68' |
LEFT('abcdef', 3) | 왼쪽에서 n글자 추출 | 'abc' |
RIGHT('abcdef', 2) | 오른쪽에서 n글자 추출 | 'ef' |
SUBSTRING('abcdef' FROM 2 FOR 3) | 부분 문자열 추출 | 'bcd' |
POSITION('cd' IN 'abcde') | 부분 문자열 위치 (1부터 시작) | 3 |
STRPOS('abcde','cd') | 부분 문자열 위치 (POSITION과 동일 기능) | 3 |
OVERLAY('abcde' PLACING 'X' FROM 3 FOR 1) | 지정 구간을 다른 문자열로 덮어쓰기 (=삽입/치환) | 'abXde' |
REPLACE('abab','a','x') | 모든 매칭 문자열 치환 | 'xbxb' |
TRANSLATE('2019-01-01','-','/') | 문자 단위 치환 | '2019/01/01' |
LPAD('1', 3, '0') | 왼쪽 패딩 | '001' |
RPAD('hi', 5, '!') | 오른쪽 패딩 | 'hi!!!' |
TRIM(' hi ') | 양쪽 공백 제거 | 'hi' |
LTRIM('---hi','-') | 왼쪽 지정 문자 제거 | 'hi' |
RTRIM('hi!!!','!') | 오른쪽 지정 문자 제거 | 'hi' |
LOWER('XYZ') | 소문자 변환 | 'xyz' |
UPPER('xyz') | 대문자 변환 | 'XYZ' |
INITCAP('hello world') | 단어별 첫 글자 대문자화 | 'Hello World' |
SPLIT_PART('a,b,c', ',', 2) | 구분자로 분리 후 n번째 요소 반환 | 'b' |
STRING_AGG(col, ', ') | 여러 행 값을 구분자로 연결 (집계) | 예: 'A, B, C' |
REGEXP_REPLACE('abc123','[0-9]','','g') | 정규식 치환 | 'abc' |
REGEXP_MATCHES('a1b2','[0-9]+') | 정규식 매칭 (집합 반환) | {'1'}, {'2'} |
REPEAT('ab', 3) | 문자열 반복 | 'ababab' |
주어진 컬럼 값/문자열의 길이(BYTE) 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| OCTET_LENGTH(CHAR | STRING) | INTEGER |
SELECT emp_name, OCTET_LENGTH(emp_name), email, OCTET_LENGTH(email)
FROM employee;
주어진 컬럼 값/문자열의 길이(문자 개수) 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| CHAR_LENGTH (CHAR | STRING) | INTEGER |
SELECT emp_name, CHAR_LENGTH(emp_name),
email, CHAR_LENGTH(email) FROM employee;
지정한 위치부터 지정한 숫자 번째로 나타나는 문자의 시작 위치 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| POSITION(str, string, [start]) | NUMBER |
-- EMaIL 컬럼의 문자열 중 '@'의 위치를 구하시오
SELECT email, POSITION('@' IN email) FROM employee;
주어진 컬럼, 문자열에 임의의 문자열을 왼쪽 / 오른쪽에 덧붙여 길이 N의 문자열 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| LPAD(STRING, N, [STR]) / RPAD(STRING, N, [STR]) | CHARACTER |
SELECT LPAD(email, 20, '#')
FROM EMPLOYEE;
SELECT RPAD(email, 20, '#')
FROM EMPLOYEE;
주어진 컬럼, 문자열의 왼쪽/오른쪽에서 공백을 제거한 나머지 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| LTRIM(STRING / RTRIM(STRING) | CHARACTER |
SELECT emp_name, LTRIM(phone, RTRIM(email) FROM employee;
SELECT LTRIM(' 공백 '), RTRIM(' 공백 '); -- 테이블 이름이 없어도 쿼리 완성
주어진 컬럼, 문자열에서 특정 문자열을 찾아 새로운 문자열로 교체
| 작성법 | 리턴 값 타입 |
|---|---|
| REPLACE(string, substring, new_string) | CHARACTER |
SELECT emp_name, REPLACE(phone, '010', ''),
REPLACE(EMAIL, '@codeit.com', '@codeit.net') FROM employee;
컬럼이나 문자열에서 지정한 위치부터 지정한 개수의 문자열을 잘라내어 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| SUBSTR(STRING, POSITION, [LENGTH]) | CHARACTER |
SELECT SUBSTR('SHOWMETHEMONEY', 5, 2); -- ME
SELECT SUBSTR('SHOWMETHEMONEY', 7); -- THEMONEY
SELECT SUBSTR('SHOWMETHEMONEY', 1, 6); -- SHOWME
SELECT SUBSTR('SHOWMETHEMONEY', -8, 3); -- THE
SELECT SUBSTR('SHOWMETHEMONEY', -10, 2); -- ME
컬럼의 문자 혹은 문자열을 소문자/대문자/첫 글자만 대문자로 변환하여 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| LOWER(STRING) / UPPER(STRING) | CHARACTER |
SELECT LOWER('Welcome To My World'); -- welcome to my world
SELECT UPPER('Welcome To My World'); -- WELCOME TO MY WORLD
컬럼의 문자 혹은 문자열을 두 개 전달 받아 하나로 합친 후 반환
| 작성법 | 리턴 값 타입 |
|---|---|
| CONCAT(STRING, STRING ….) | CHARACTER |
SELECT CONCAT('가나다라', 'ABCD'); -- 가나다라ABCD
SELECT '가나다라' || 'ABCD'; -- 가나다라ABCD
| Function | 설명 |
|---|---|
| ABS | 숫자의 절대값을 반환합니다. |
| AVG | 표현식의 평균값을 반환합니다. |
| CEIL | 숫자보다 크거나 같은 가장 작은 정수 값을 반환합니다. |
| CEILING | 숫자보다 크거나 같은 가장 작은 정수 값을 반환합니다. |
| COUNT | 선택 쿼리에서 반환된 레코드 수를 반환합니다. |
| DIV | 정수 나눗셈에 사용 |
| FLOOR | 숫자에 대해 <=인 가장 큰 정수 값을 반환합니다. |
| GREATEST | 인수 목록의 가장 큰 값을 반환합니다. |
| LEAST | 인수 목록의 가장 작은 값을 반환합니다. |
| MAX | 값 집합에서 최대값을 반환합니다. |
| MIN | 값 집합에서 최소값을 반환합니다. |
| MOD | 숫자를 다른 숫자로 나눈 나머지를 반환합니다. |
| RANDOM | 난수를 반환합니다. |
| ROUND | 지정된 소수 자릿수로 숫자를 반올림합니다. |
| SIGN | 숫자의 부호를 반환합니다. |
| SUM | 값 집합의 합계를 계산합니다. |
| TRUNC | 지정된 소수점 이하 자릿수로 숫자를 자릅니다 |