MySQL/MariaDB에서 자주 사용하는 내장 함수를 카테고리별로 정리합니다.
문자열 함수
| 함수 |
설명 |
예시 |
결과 |
| CONCAT |
문자열 연결 |
CONCAT('Hello', ' ', 'World') |
Hello World |
| CONCAT_WS |
구분자로 연결 |
CONCAT_WS('-', '2024', '01', '15') |
2024-01-15 |
| SUBSTRING |
부분 문자열 |
SUBSTRING('Hello', 1, 3) |
Hel |
| LEFT / RIGHT |
왼쪽/오른쪽 n자 |
LEFT('Hello', 2) |
He |
| LENGTH |
바이트 길이 |
LENGTH('가나다') |
9 (UTF-8) |
| CHAR_LENGTH |
문자 길이 |
CHAR_LENGTH('가나다') |
3 |
| UPPER / LOWER |
대/소문자 변환 |
UPPER('hello') |
HELLO |
| TRIM |
양쪽 공백 제거 |
TRIM(' hi ') |
hi |
| LTRIM / RTRIM |
왼쪽/오른쪽 공백 제거 |
LTRIM(' hi') |
hi |
| REPLACE |
문자열 치환 |
REPLACE('abc', 'b', 'x') |
axc |
| LPAD / RPAD |
왼쪽/오른쪽 패딩 |
LPAD('5', 3, '0') |
005 |
| REVERSE |
문자열 뒤집기 |
REVERSE('abc') |
cba |
| INSTR |
위치 찾기 |
INSTR('Hello', 'lo') |
4 |
| FORMAT |
숫자 포맷 |
FORMAT(1234567.89, 2) |
1,234,567.89 |
-- 실전 예시: 이메일에서 도메인 추출
SELECT
email,
SUBSTRING(email, INSTR(email, '@') + 1) AS domain
FROM users;
-- 이름 마스킹
SELECT CONCAT(LEFT(name, 1), '**') AS masked_name FROM employees;
-- 홍** , 김** , 이**
숫자 함수
| 함수 |
설명 |
예시 |
결과 |
| ROUND |
반올림 |
ROUND(3.456, 2) |
3.46 |
| CEIL / CEILING |
올림 |
CEIL(3.1) |
4 |
| FLOOR |
내림 |
FLOOR(3.9) |
3 |
| TRUNCATE |
절삭 |
TRUNCATE(3.456, 2) |
3.45 |
| ABS |
절대값 |
ABS(-5) |
5 |
| MOD |
나머지 |
MOD(10, 3) |
1 |
| POWER |
거듭제곱 |
POWER(2, 10) |
1024 |
| SQRT |
제곱근 |
SQRT(16) |
4 |
| RAND |
난수 (0~1) |
RAND() |
0.7342… |
-- 실전 예시: 급여를 만원 단위로 반올림
SELECT name, ROUND(salary, -4) AS rounded_salary FROM employees;
-- 랜덤 정렬 (무작위 추출)
SELECT * FROM employees ORDER BY RAND() LIMIT 3;
날짜/시간 함수
| 함수 |
설명 |
예시 |
결과 |
| NOW() |
현재 날짜+시간 |
NOW() |
2026-05-04 14:30:00 |
| CURDATE() |
현재 날짜 |
CURDATE() |
2026-05-04 |
| CURTIME() |
현재 시간 |
CURTIME() |
14:30:00 |
| DATE() |
날짜 부분 추출 |
DATE(NOW()) |
2026-05-04 |
| YEAR / MONTH / DAY |
연/월/일 추출 |
YEAR(NOW()) |
2026 |
| HOUR / MINUTE / SECOND |
시/분/초 추출 |
HOUR(NOW()) |
14 |
| DATE_ADD |
날짜 더하기 |
DATE_ADD(NOW(), INTERVAL 7 DAY) |
+7일 |
| DATE_SUB |
날짜 빼기 |
DATE_SUB(NOW(), INTERVAL 1 MONTH) |
-1개월 |
| DATEDIFF |
날짜 차이 (일) |
DATEDIFF('2026-12-31', '2026-01-01') |
364 |
| TIMESTAMPDIFF |
단위별 차이 |
TIMESTAMPDIFF(MONTH, '2024-01-01', '2026-05-04') |
28 |
| DATE_FORMAT |
날짜 포맷 |
DATE_FORMAT(NOW(), '%Y년 %m월 %d일') |
2026년 05월 04일 |
| STR_TO_DATE |
문자→날짜 변환 |
STR_TO_DATE('2026-05-04', '%Y-%m-%d') |
2026-05-04 |
| LAST_DAY |
해당 월 마지막 날 |
LAST_DAY('2026-02-01') |
2026-02-28 |
| DAYOFWEEK |
요일 (1=일, 7=토) |
DAYOFWEEK('2026-05-04') |
2 (월) |
| 코드 |
설명 |
예시 |
| %Y |
4자리 연도 |
2026 |
| %y |
2자리 연도 |
26 |
| %m |
월 (01~12) |
05 |
| %d |
일 (01~31) |
04 |
| %H |
시 (00~23) |
14 |
| %i |
분 (00~59) |
30 |
| %s |
초 (00~59) |
00 |
| %W |
요일 이름 |
Monday |
-- 실전 예시: 입사 후 근속 연수 계산
SELECT
name,
hire_date,
TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) AS 근속연수
FROM employees;
-- 이번 달 입사자 조회
SELECT * FROM employees
WHERE DATE_FORMAT(hire_date, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');
조건 함수
-- IF: 조건에 따라 값 반환
SELECT name, IF(salary >= 5000000, '고연봉', '일반') AS 구분
FROM employees;
-- IFNULL: NULL이면 대체값 반환
SELECT name, IFNULL(dept_id, '미배정') AS 부서 FROM employees;
-- NULLIF: 두 값이 같으면 NULL 반환
SELECT NULLIF(10, 10); -- NULL
SELECT NULLIF(10, 20); -- 10
-- COALESCE: 첫 번째 NOT NULL 값 반환
SELECT COALESCE(NULL, NULL, '기본값', 'abc'); -- '기본값'
변환 함수
-- 타입 변환
SELECT CAST('123' AS SIGNED); -- 정수로 변환
SELECT CAST('2026-05-04' AS DATE); -- 날짜로 변환
SELECT CAST(3.14 AS CHAR); -- 문자로 변환
SELECT CONVERT('123', SIGNED); -- CAST와 동일
SELECT CONVERT('abc' USING utf8mb4); -- 문자셋 변환
윈도우 함수 (MySQL 8.0+)
집계 함수와 달리 행을 그룹으로 축소하지 않고, 각 행에 대해 계산 결과를 반환합니다.
-- ROW_NUMBER: 순번 부여
SELECT
name, dept_id, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS 순위
FROM employees;
-- RANK: 동일 값은 같은 순위 (다음 순위 건너뜀)
SELECT
name, salary,
RANK() OVER (ORDER BY salary DESC) AS 순위
FROM employees;
-- DENSE_RANK: 동일 값은 같은 순위 (다음 순위 연속)
SELECT
name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS 순위
FROM employees;
-- 부서별 급여 순위
SELECT
name, dept_id, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS 부서내순위
FROM employees;
-- LAG / LEAD: 이전/다음 행 값 참조
SELECT
name, salary,
LAG(salary, 1) OVER (ORDER BY salary) AS 이전급여,
LEAD(salary, 1) OVER (ORDER BY salary) AS 다음급여
FROM employees;
-- SUM OVER: 누적 합계
SELECT
name, salary,
SUM(salary) OVER (ORDER BY hire_date) AS 누적급여
FROM employees;
관련된 글 (mysql > lecture-mysql)