문자열 함수
CONCAT(), CONCAT_WS() : 두 개 이상의 문자열을 결합합니다.
SELECT CONCAT('Hello', ' ', 'World'); -- 'Hello World'
# CONCAT_WS는 특정 구분자를 이용해 문자를 결합할 수 있음
SELECT CONCAT_WS('/', '2022', '10','22'); -- '2022/10/22'
SUBSTRING() : 문자열의 일부분을 추출합니다.
SELECT SUBSTRING('Hello World', 7); -- 'World'
SUBSTRING_INDEX(): 찾는 문자열이 n회 등장하면 그 이후 문자열을 버립니다. n이 마이너스면 오른쪽에서 시작합니다.
SELECT SUBSTRING_INDEX('test3.account.gmail.com', '.', 2) -- 'test3.account'
SELECT SUBSTRING_INDEX('test3.account.gmail.com', '.', -2) -- 'gmail.com'
LENGTH() : 문자열의 길이를 반환합니다.
SELECT LENGTH('Hello World'); -- 11
LOWER(), UPPDER() : 문자열을 모두 소문자, 대문자로 변환합니다.
SELECT LOWER('Hello World'); -- 'hello world'
SELECT UPPER('Hello World'); -- 'HELLO WORLD'
TRIM([LEADING, BOTH, TRAILING][rem_str] FROM str) : 문자열의 앞/뒤/양쪽에서 지정된 문자열을 제거합니다.
SELECT TRIM(" abc "); -- 'abc'
SELECT TRIM(BOTH "a" FROM "aaaabcbbbaaa"); -- 'bcbbb'
SELECT TRIM(TRAILING "a" FROM "aaaabcbbbaaa"); -- 'aaaabcbb'
SELECT TRIM(LEADING "a" FROM "aaaabcbbbaaa"); -- 'bcbbbaaa'
REPLACE(str, old_str, new_str) : 문자열에서 old_str을 new_str로 대체합니다.
SELECT REPLACE("It's Banana", "Banana", "Apple"); -- It's Apple
INSTR(str, substr) : 문자열에서 substr이 처음 나타나는 위치를 반환합니다.
SELECT INSTR('foobarbar', 'bar'); -- 4
# SQL에서 시작점은 1이기 때문에 0이면 존재하지않는다는 의미이다.
SELECT INSTR('xbar', 'foobar'); -- 0
LPAD, RPAD(str, len, pad_str) : 문자열을 왼쪽, 오른쪽으로 패딩합니다.
SELECT LPAD("aaa", 5, "0"); -- 00aaa
SELECT RPAD("aaa", 5, "0"); -- aa000
LEFT, RIGHT(str, len) : 문자열에서 왼쪽 또는 오른쪽에서 길이만큼 추출합니다.
SELECT LEFT("abcde", 3); -- "abc"
SELECT RIGHT("abcde", 3); -- "cde"
MID(str, pos, len) : 문자열에서 특정 시작점에서의 길이만큼을 추출합니다.
SELECT MID("abcdefghi", 5, 2); -- "ef"
BIN, OCT, HEX : 각각 2진수, 8진수, 16진수 값을 반환합니다.
SELECT BIN(31); -- 11111
SELECT OCT(31); -- 37
SELECT HEX(31); -- 1F
REVERSE(str) : 주어진 문자열을 거꾸로 반환합니다.
SELECT REVERSE("123456789"); -- 987654321
SPACE(len) : 길이만큼의 공백을 반환합니다.
SELECT CONCAT("Hello", SPACE(5), "World"); -- "Hello World"
REPEAT(str, len) : 문자열을 주어진 횟수만큼 반복합니다.
SELECT REPEAT("abc", 3); -- "abcabcabc"
LOCATE(substr, str, [pos]) : 첫번째로 발견한 문자열의 위치를 반환합니다. (POSITION과 동일한 함수이며, INSTR와는 파라미터 순서만 다릅니다.)
SELECT LOCATE("abc", "abcdefabc"); -- 1
SELECT POISITION("abc" IN "abcdefabc"); -- 1
SELECT INSTR("abcdefabc", "abc");
# 시작지점을 정하는 것은 Locate에서만 가능합니다.
SELECT LOCATE("abc", "abcdefabc", 3); -- 7
FORMAT(x, d) : 세자리 수 마다 콤마를 넣고 주어진 길이만큼 소수점을 소수점을 남깁니다.
SELECT FORMAT(12332.1,4); -- '12,332.1000'
SELECT FORMAT(12332.2,0); -- '12,332'
날짜 및 시간 관련 함수
CURDATE(), CURTIME(), NOW(), SYSDATE() : 현재 날짜 또는 시간을 반환합니다.
# 현재 날짜를 '년-월-일'로 반환
SELECT CURDATE(); -- '2023-02-27'
# 현재 시간을 HH:MM:SS로 반환
SELECT CURTIME(); -- '04:45:10'
# 현재 날짜 및 시간을 반환
SELECT NOW(); -- '2023-02-27 04:45:00'
SELECT SYSDATE(); -- '2023-02-27 04:45:00'
YEAR(), MONTH(), DAYOFMONTH(), HOUR(), MINUTE(), SECOND(): 특정 날짜나 시간 단위를 반환합니다.
# 날짜에 대한 "연도"를 반환
SELECT YEAR('2023-02-27'); -- 2023
# 날짜에 대한 "월"을 반환
SELECT MONTH('2023-02-27'); -- 2
# 날짜에 대한 "일"을 반환
SELECT DAYOFMONTH('2023-02-28'); -- 28
# 시간을 반환
SELECT HOUR('2023-02-27 15:32:00'); -- 15
# 분을 반환
SELECT MINUTE('2023-02-27 15:32:00'); -- 32
# 초를 반환
SELECT SECOND('2023-02-27 15:32:00'); -- 0
ADDDATE(date, diff), SUBDATE(date,diff) : 날짜를 기준으로 차이를 더하거나 뺍니다. (DATE_ADD와 DATE_SUB와 동일)
SELECT ADDDATE('2022-12-31', INTERVAL 15 DAY); -- '2022-01-15'
SELECT ADDDATE('2022-12-31', INTERVAL 1 MONTH); -- '2022-01-31'
SELECT SUBDATE('2022-12-31', INTERVAL 15 DAY); -- '2022-12-16'
SELECT SUBDATE('2022-12-31', INTERVAL 1 MONTH); -- '2022-11-30'
DATEDIFF(date1, date2), TIMEDIFF(time1, time2) : 날짜 차이 혹은 시간 차이를 반환합니다.
SELECT DATEDIFF('2022-12-31', '2022-10-29'); -- 63
SELECT TIMEDIFF('14:50:00', '08:40:50'); -- 06:09:10
DATEOFWEEK(day) : 해당 날짜의 요일을 숫자로 반환합니다.(일:1, 월:2..)
SELECT DAYOFWEEK(NOW()); -- 2
MONTHNAME(month) : 해당 월의 영어 이름을 반환합니다.
SELECT MONTHNAME(NOW()); -- February
DAYOFYEAR(day) : 1월 1일 기준으로 몇 일이 지났는 지를 반환합니다.
SELECT DAYOFYEAR(NOW()); -- 58
LASTDAY(date) : 주어진 월의 마지막 날을 반환합니다.
SELECT LAST_DAY('2012-02-01'); -- '2012-02-29
TIME_TO_SEC(time) : 시간을 초 단위로 반환니다.
SELECT TIME_TO_SEC('12:00:00'); -- 43200
**DATE_FORMAT(date, condition) : 조건에 맞는 형식으로 변환된 date를 반환합니다.
SELECT DATE_FORMAT(now(), '%Y-%M-%D'); -- '2023-February-27th'
숫자 관련 함수
SUM(column) : 숫자 열의 합계를 계산합니다.
SELECT SUM(sales) FROM orders; -> 10000
AVG(column) : 숫자 열의 평균을 계산합니다.
SELECT AVG(sales) FROM orders; -> 500
MAX(column) : 숫자 열의 최댓값을 찾습니다.
SELECT MAX(sales) FROM orders; -> 1000
MIN(column) : 숫자 열의 최솟값을 찾습니다.
SELECT MIN(sales) FROM orders; -> 100
COUNT(column) : 열의 레코드 수를 반환합니다.
SELECT COUNT(*) FROM orders; -> 10
ABS(number) : 숫자의 절대값을 출력합니다.
SELECT ABS(100-150); -- 50
MOD(분자, 분모) : 분자를 분모로 나눈 나머지를 구합니다. (%와 동일)
SELECT MOD(100, 3); -- 1
CEILING(number) : 소수점을 올림한 값을 반환합니다.
SELECT CEILING(3301.3123); -- 3302
FLOOR(number) : 소수점을 내림한 값을 반환합니다.
SELECT FLOOR(1523.5779); -- 1523
TRUNCATE(number, pos): 숫자를 소수점 이하 자리수에서 버린 값을 반환합니다.
SELECT TRUNCATE(1523.5779, 2); -- 1523.57
SELECT TRUNCATE(1523.5779, -2); -- 1500
ROUND(number, pos)숫자를 소수점 이하 자리수에서 반올림한 값을 반환합니다.
SELECT ROUND(1523.5779, 3); -- 1523.578
SQRT(number): 숫자를 제곱근 값을 반환합니다.
SELECT SQRT(100); -- 10
POW(number, n): 숫자를 n 제곱한 값을 반환합니다.
SELECT POW(5, 3); -- 125
RAND() : 0 ~ 1 사이의 랜덤값을 반환합니다.
SELECT FLOOR(RAND() * 100)+ 1; -- 1 ~ 100 사이 랜덤한 값 반환
조건함수
IF(expr, true_value, false_value) : 조건에 따라 다른 값을 반환합니다.
SELECT IF(sales > 500, 'High', 'Low') FROM orders; -- 'Low'
IFNULL(column, value) : 컬럼이 NULL이라면 대체할 값을 출력합니다.
SELECT IFNULL(data, '자료없음') FROM library; -- '자료없음'
CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE else_result END : 다중 조건에 따라 다른 값을 반환합니다.
SELECT CASE
WHEN sales > 500
THEN 'High'
WHEN sales > 100
THEN 'Medium'
ELSE 'Low' END
FROM orders; -- 'Medium'
COALESCE(value1, value2, ...) : NULL이 아닌 첫 번째 인수를 반환합니다.
SELECT COALESCE(NULL, NULL, 'apple', 'banana'); -- 'apple'
정규식
.
: 문자 하나, ex) ...
- 문자열의 길이가 세 글자 이상인 것
|
: 또는 (OR) |로 구분된 문자에 해당하는 문자열을 찾음 ex) a|b
라면 a 또는 b에 해당하는 문자열을 찾음
[]
: []
안에 나열된 패턴에 해당하는 문자열을 찾음
^
: 시작하는 문자열을 찾음
$
: 끝나는 문자열을 찾음
*
: 0회 이상 나타나는 문자+
: 1회 이상 나타나는 문자{m, n}
: m회 이상 n회 이하 나타나는 문자?
: 0 또는 1회 나타나는 문자[A-z]
또는 [:alpha:]
또는 \a
: 알파벳 대문자 또는 소문자인 문자열을 찾음[0-9]
또는 [:digit:]
또는 \d
:숫자인 문자열을 찾음[^문자]
: 괄호 안의 문자를 포함하지 않은 문자열을 찾음# (1) apple 또는 banana로 시작하는 문자열을 찾고 싶을 때
SELECT *
FROM tb
WHERE data REGEXP ('^apple | ^banana')
(2) 길이 7글자인 문자열 중 2번째 자리부터 abc를 포함하는 문자열을 찾고 싶을 때
SELECT *
FROM tb
WHERE data REGEXP ('^.abc...$')
(3) 텍스트와 숫자가 섞여있는 문자열에서 숫자로만 이루어진 문자열을 찾고 싶을 때
SELECT *
FROM tb
WHERE data REGEXP (^[:digit:]+$)
참고