- MySQL 내부에 만들어둔 함수
- 문자열 함수: 형변환, 부분문자열, 문자개수/바이트수, 비교, 치환, 결측치, ...
- 날짜 함수: 현재 날짜와 시간, 표준 날짜와 시간, 두 날짜의 길이(시간, 분, ...), 연도, 월, 일, 시, 분, 초 정보
- 수학 함수: 반올림, 올림, 내림, 절대값, 사인, 코사인, ...
- 집계 함수: 합계, 평균, 표준편차, 최대, 최소, ...
- 분석 함수: LAG, LEAD(앞뒤 데이터 조회), 누적분포, 상대순위 계산, 첫줄/마지막행
CONCAT(문자열1, 문자열2, ...): 문자열들을 하나로 결합 (공백X)CONCAT_WS(구분자, 문자열1, 문자열2, ...): 구분자를 사이에 두고 결합SELECT concat('I', 'Love', 'MySQL') AS col1,
concat('I', ' Love', ' MySQL') AS col2,
concat_ws(' ', 'I', 'Love', 'MySQL') AS col3,
concat_ws(',', 'I', 'Love', 'MySQL') AS col4;
concat_ws 는 python 에서 print 사용시 separator 를 지정하는 것과 유사하다.- 출력
SELECT concat_ws(': ', clientName, clientPhone) AS '고객정보'
FROM bookClient;
- 출력
CAST(컬럼 AS 데이터유형) : 표준 SQL 방식의 형변환CONVERT(컬럼, 데이터유형) : MySQL의 확장방식의 형변환 + 문자셋 변환CAST/CONVERT에 사용가능한 데이터 유형SIGNED 는 부호가 있는 정수 타입으로, 양수와 음수 모두 허용된다.UNSIGNED 는 부호가 없는 정수 타입으로, 0이상의 양수만 허용된다. SELECT CAST('2' AS SIGNED),
CAST('-5' AS SIGNED),
CAST('-5' AS UNSIGNED);
UNSIGNED 는 음수 입력시 오류가 발생하여 결과가 overflow 된 정수가 출력되었다.- 출력
쿼리1
DECIMAL(5, 2) 는 전체 자릿수는 5이며 소수점 둘째 자리까지 표시한다. 따라서 정수 부분은 최대 3자리이고, -999.99 에서 999.99 까지 표시할 수 있다.SELECT cast('123' AS SIGNED) AS col1,
cast('3.14' AS DECIMAL(5, 2)) as col2,
cast(100 AS CHAR) AS col3,
cast('2025-02-04' AS DATE) AS col4,
cast(3.99 AS UNSIGNED) AS col5;
쿼리2
SELECT CONVERT('123', SIGNED) AS col1,
CONVERT(100, CHAR) AS col2,
CONVERT('안녕하세요' USING utf8mb4) AS col3,
CONVERT('hello' USING latin1) AS col4,
CONVERT(now(), SIGNED) AS col5;
- 출력
| 쿼리1 | 쿼리2 |
|---|---|
![]() | ![]() |
1) 문자열데이터를 숫자 변환 후 집계 함수 적용
SELECT sum(cast(price AS DECIMAL(10, 2))) FROM order;
2) 날짜문자열을 기준으로 정렬
SELECT * FROM logs WHERE cast(log_date AS DATE) DESC;
3) 수치 연산 보장
SELECT '5' / 2,
5 / 2,
cast(5 AS DECIMAL) / 2
4) 문자 인코딩 대응
SELECT CONVERT(col_name USING utf8mb4) FROM table_name;
NULL : 값이 존재하지 않음(UNKNOWN)NULL을 다른 값으로 치환NULL 판별NULL로 인해 계산이 안되는 것 방지NULL 값을 합할 경우 출력 값은 NULL 이 된다.NULL 값은 자동으로 제외하고 계산된다.SELECT 100 + NULL;
SELECT avg(col); # NULL 자동 제외
ISNULL(컬럼)NULL 값이 포함된 테이블이 있다.
ISNULL 은 NULL 이면 1, 아니면 0 을 출력한다.SELECT col1, ISNULL(col2), ISNULL(col3) FROM acorn_null;
- 출력
COALESCE(표현식1, 표현식2, ...):
IFNULL(표현식, 대체값)
NULL이 아닌 값으로 첫번째 만나는 값을 반환, 모두 NULL이면 '없음' 반환SELECT col1, COALESCE(col2, col3, col4, col5, '없음') FROM table_null;
- 출력
col2 값이 NULL 이 아니면 col2 값을 사용하고, NULL 이면 col5 값으로 대체한다.SELECT col1, IFNULL(col2, col5) FROM table_null;
- 출력
NULLIF(표현식1, 표현식2):표현식1 = 표현식2 이면 NULL 반환, 다르면 표현식1 반환0, 빈 문자열 '', 기본값 -1, 자리채움 목적 값 'N/A'
num1 이 10 이기에 NULL 값이 되어 100 / NULL 연산을 진행하여 최종 결과값은 NULL 이 된다.SELECT 100 / NULLIF(num1, 10) FROM table_null2;
- 출력
upper() 대문자 변환, lower() 소문자 변환이 적용된 것을 알 수 있다.
SELECT col1, col4, col5, upper(col5), lower(col4) FROM table_null;
- 출력

SELECT ' hello! MySQL ' AS col1,
trim(' hello! MySQL ') AS trim,
ltrim(' hello! MySQL ')AS ltrim,
rtrim(' hello! MySQL ')AS rtrim;
- 출력
trim 과 BOTH, LEADING, TRAILING + 삭제할 문자열 조합을 통해 문자열을 삭제할 수 있다. 아래 예시를 보면 # 만 삭제되고 공백은 남아있는 것을 확인할 수 있다.SELECT trim(BOTH '#' FROM '# hello! MySQL #') AS col1, # both: 양쪽
trim(LEADING '#' FROM '# hello! MySQL #') AS col2, # LEADING: 앞쪽
trim(TRAILING '#' FROM '# hello! MySQL #') AS col3; # TRAINLING: 뒤쪽
- 출력
LENGTH() : 문자열 바이트 수 반환CHAR_LENGTH() : 문자열 개수 반환SELECT length('hello! MySQL'), length('에스큐엘 짱!'),
char_length('hello! MySQL'), char_length('에스큐엘 짱!');
- 출력
0 반환SELECT 'hello! MySQL', position('!' IN 'hello! MySQL'),
position('#' IN 'hello! MySQL'),
position('my' IN 'hello! MySQL');
- 출력
LEFT(문자열, 길이) : 문자열 왼쪽부터 지정한 길이 만큼의 문자열 반환RIGHT(문자열, 길이) : 문자열 오른쪽부터 지정한 길이 만큼의 문자열 반환SELECT 'hello! MySQL',
LEFT('hello! MySQL', 6),
RIGHT('hello! MySQL', 3);
- 출력
SUBSTR(문자열, 시작위치, 길이)SUBSTRING(문자열, 시작위치, 길이)SELECT 'abc@email.com',
position('@' IN 'abc@email.com'),
substr('abc@email.com', 1, position('@' IN 'abc@email.com') - 1);
- 출력
Ex1) 생년월일에서 연도 분리 출력
USE bookdb;
-- 생년월일에서 연도분리
SELECT clientBirth,
substr(clientBirth, 1, position('-' IN clientBirth) - 1)
FROM bookdb.bookClient;
- 출력
Ex2) 이름에서 성, 이름 분리 출력
USE marketdb;
-- 고객성명을 성과 이름으로 분리
SELECT customer_name AS '성명',
substr(customer_name, 1, 1) AS '성',
substr(customer_name, 2, 2) AS '이름'
FROM marketdb.customer;
- 출력
Ex3) '김' 씨 성을 가진 이름 조회
-- '김'씨 성을 가진 고객이름 조회
SELECT customer_name
FROM marketdb.customer
WHERE substr(customer_name, 1, 1) = '김';
REPLACE(문자열, 특정문자열, 대체문자열)SELECT customer_name, REPLACE(customer_name, '김', 'Kim')
FROM marketdb.customer
WHERE customer_name LIKE '김%';
- 출력
REPEAT(문자열, 반복수)SELECT 'Ha', REPEAT('Ha', 10);
- 출력
SELECT customer_name,
concat(substr(customer_name, 1, 1),
space(5),
substr(customer_name, 2, 2))
FROM marketdb.customer;
- 출력
WITH ip_list(ip)
AS(
SELECT '192.168.0.1'
UNION ALL
SELECT '10.6.100.99'
UNION ALL
SELECT '8.8.8.8'
UNION ALL
SELECT '192.200.211.111'
)
SELECT ip, REVERSE(ip),
substr(ip, 1, char_length(ip) - position('.' IN REVERSE(ip)))
FROM ip_list;
- 출력
0 반환, 다르면 -1 반환SELECT strcmp('hello! MySQL', 'hello! MySQL'),
strcmp('hello! MySQL', 'hello# MySQL');
- 출력
