-- 1. 문자열 관련 함수
-- ASCII(아스키코드), CHAR(숫자)
SELECT ASCII('A'), CHAR(97);
-- bit_length(문자열), char_length(문자열), length(문자열)
-- 영어, 숫자, 특수기호 제외 한 모든 문자가 문자당 3byte 할당
SELECT
BIT_LENGTH('한글')
, CHAR_LENGTH('한글')
, LENGTH('한글');
-- BIT_LENGTH: 할당된 비트 크기 반환
-- CHAR_LENGTH: 문자열의 길이 반환
-- LENGTH: 할당된 BYTE 크기 반환
-- concat(문자열1, 문자열2, ...), concat ws(구분자, 문자열1, 문자열2)
SELECT CONCAT('nice', ' to', ' meet', ' you!'); -- nice to meet you!
SELECT CONCAT_ws(' ', 'nice', 'to', 'meet', 'you!');
SELECT concat(menu_price, '원') FROM tbl_menu;
-- CONCAT: 문자열을 이어붙임
-- CONCAT_WS: 구분자와 함께 문자열을 이어붙임
FIND_IN_SET(찾을 문자열, 문자열 리스트), INSTR(기준 문자열, 부분 문자열),
LOCATE(부분 문자열, 기준 문자열)
-- ELT(위치, 문자열1, 문자열2, ...), FIELD(찾을 문자열, 문자열1, 문자열2, ...),
-- FIND_IN_SET(찾을 문자열, 문자열 리스트), INSTR(기준 문자열, 부분 문자열),
-- LOCATE(부분 문자열, 기준 문자열)
SELECT
ELT(2, '축구', '야구', '농구')
, FIELD('축구', '야구', '농구', '축구')
, FIND_IN_SET('축구', '야구,농구,축구')
, INSTR('축구농구야구', '농구')
, LOCATE('야구', '축구농구야구'); -- INSTR과 LOCATE는 서로 인자가 반대
-- ELT: 해당 위치의 문자열 반환
-- FIELD: 찾을 문자열 위치 반환
-- FIND_IN_SET: 찾을 문자열의 위치 반환
-- INSTR: 기준 문자열에서 부분 문자열의 시작 위치 반환
-- LOCATE: INSTR과 동일하고 순서는 반대
-- INSERT(기준 문자열, 위치, 해당 위치에서 지울 길이, 삽입할 문자열)
SELECT INSERT('나와라 피카츄!', 5, 3, '꼬부기');
-- INSERT: 기준 문자열의 위치부터 길이만큼을 지우고 삽입할 문자열을 끼워 넣는다.
-- LEFT(문자열, 길이), RIGHT(문자열, 길이)
SELECT LEFT('Hello World!', 5), RIGHT('Nice Shot!', 5);
-- LEFT: 왼쪽에서 문자열의 길이만큼을 반환
-- RIGHT: 오른쪽에서 문자열의 길이만큼을 반환
-- UPPER(문자열), LOWER(문자열)
SELECT LOWER('Hello World!'), UPPER('Hello World!');
-- UPPER: 소문자를 대문자로 변경
-- LOWER: 대문자를 소문자로 변경
-- LPAD(문자열, 길이, 채울 문자열), RPAD(문자열, 길이, 채울 문자열)
SELECT LPAD('왼쪽', 10, '#'), RPAD('오른쪽', 10, '#');
-- LPAD: 문자열을 길이만큼 왼쪽으로 늘린 후에 빈 곳을 문자열로 채운다.
-- RPAD: 문자열을 길이만큼 오른쪽으로 늘린 후에 빈 곳을 문자열로 채운다.
TRIM(문자열), TRIM(방향 자를_문자열 FROM 문자열)
-- LTRIM(문자열), RTRIM(문자열) / 공백 제거 역할
-- TRIM(문자열), TRIM(방향 자를_문자열 FROM 문자열)
SELECT LTRIM(' 왼쪽'), RTRIM('오른쪽 ');
SELECT
TRIM(' MARIADB ')
, TRIM(BOTH '@' FROM '@@@@MARIADB@@@@')
, TRIM(LEADING '@' FROM '@@@@MARIADB@@@@') -- LTRIM
, TRIM(TRAILING '@' FROM '@@@@MARIADB@@@@'); -- RTRIM
SELECT CONCAT(menu_name, '의 가격은 ', menu_price, '입니다.') FROM tbl_menu;
-- LTRIM: 왼쪽 공백 제거
-- RTRIM: 오른쪽 공백 제거
-- TRIM: TRIM은 기본적으로 앞뒤 공백을 제거하지만 방향(LEADING(앞), BOTH(양쪽), TRAILING(뒤))이 있으면 해당 방향에 지정한 문자열을 제거할 수 있다.
-- format(숫자, 소수점 자릿수)
SELECT FORMAT(123456789, 3);
-- FORMAT: 1000단위마다 콤마(,) 표시를 해 주며 소수점 아래 자릿수(반올림)까지 표현한다.
-- bin(숫자), oct(숫자), hex(숫자)
SELECT BIN(65), OCT(65), HEX(65);
-- bin: 2진수로 표현
-- oct: 8진수로 표현
-- hex: 16진수로 표현
SELECT repeat('재미져 ', 5);
-- REPEAT: 문자열을 횟수만큼 반복
SELECT REPLACE('마리아DB', '마리아', 'Maria');
-- REPLACE: 문자열에서 문자열을 찾아 치환
SELECT REVERSE('happiness');
-- REVERSE: 문자열의 순서를 거꾸로 뒤집음
SELECT CONCAT('제 포켓몬은', SPACE(3), '이고, 속성은', SPACE(6), '입니다.');
-- SPACE: 길이 만큼의 공백을 반환
SELECT SUBSTRING('열심히 db공부를 해 봅시다!', 5, 4)
, SUBSTRING('열심히 db공부를 해 봅시다!', 11); -- 11번째 문자부터 끝까지
-- SUBSTRING: 시작 위치부터 길이만큼의 문자를 반환(길이를 생략하면 시작 위치부터 끝까지 반환)
SELECT
SUBSTRING_INDEX('010-2222-2222', '-', 2)
, SUBSTRING_INDEX('010-2222-2222', '-', -1);
-- SUBSTRING_INDEX: 구분자가 왼쪽부터 횟수 번쨰 나오면 그 이후의 오른쪽은 버린다. 횟수가 음수일 경우 오른쪽부터 세고 왼쪽을 버린다.
SELECT ABS(-123);
-- ABS: 절대값 반환
-- 양수도 양수로, 음수도 양수로
SELECT CEILING(1234.56), FLOOR(1234.56), ROUND(1234.56);
-- CEILING: 올림값 반환
-- FLOOR: 버림값 반환
-- ROUND: 반올림값 반환
SELECT CONV('F', 16, 10), CONV('A', 16, 2);
-- CONV: 원래 진수에서 변환하고자 하는 진수로 변환
SELECT MOD(10, 3), 10 % 3;
-- MOD: 숫자 1을 숫자 2로 나눈 나머지 추출
SELECT POW(3,2), SQRT(81);
-- POW: 거듭제곱값 추출
-- SQRT: 제곱근을 추출
SELECT FLOOR(RAND() * 4 + 5), FLOOR(RAND() * 4) + 5;
-- RAND: 0이상 1 미만의 실수를 구한다.
SELECT SIGN(10.1), SIGN(0), SIGN(-1.1);
-- SIGN: 양수면 1, 0이면 0, 음수면 -1을 반환
-- truncate(숫자, 정수)
SELECT TRUNCATE(1234.1234, 2), TRUNCATE(1234.1234, -1);
-- TRUNCATE: 소수점을 기준으로 정수 위치까지 구하고 나머지는 버림
-- adddate(날짜, 차이), subdate(날짜, 차이)
SELECT ADDDATE('2020-02-01', INTERVAL 28 DAY), SUBDATE('2020-02-01', 1);
SELECT SUBDATE('2020-02-01', INTERVAL 1 DAY), SUBDATE('2020-02-01', 1);
-- interval과 day 빼도 작동 가능
SELECT SUBDATE('2020-02-01', INTERVAL 1 MONTH);
SELECT ADDDATE('2020-02-01', INTERVAL 28 MONTH);
-- ADDDATE: 날짜를 기준으로 차이를 더함
-- SUBDATE: 날짜를 기준으로 날짜를 뺌
SELECT ADDTIME('2023-12-28 10:27:00' , '1:0:10'), SUBTIME('2023-12-28 10:27:00' , '1:0:10');
-- ADDTIME: 날짜 또는 시간을 기준으로 시간을 더함
-- SUBTIME: 날짜 또는 시간을 기준으로 시간을 뺌
SELECT CURDATE(), CURTIME(), NOW(), SYSDATE();
SELECT CURTIME(), CURRENT_TIME(), CURRENT_TIME;
SELECT @@GLOBAL.time_zone; -- 현재 타임존 기준으로 확인하는 조회문
-- CURDATE: 현재 연-월-일 추출
-- CURTIME: 현재 시:분:초 추출
-- NOW() 또는 SYSDATE(): 현재 연-월-일 시:분:초 추출
SELECT YEAR(CURDATE()), MONTH(CURDATE()), DAY(CURDATE()), DAY(CAST('2023-12-28' AS DATE));
SELECT HOUR(CURTIME()), MINUTE(CURTIME()), SECOND(CURTIME());
-- HOUR(시간), MINUTE(시간), SECOND(시간), MICROSECOND(시간)
-- 날짜 또는 시간에서 연, 월, 일, 시, 분, 초, 밀리초를 추출
SELECT DATE(NOW()), TIME(NOW());
-- DATE: 연-월-일만 추출
-- TIME: 시:분:초만 추출
SELECT DATEDIFF('2023-12-28', '2024-06-14'), TIMEDIFF('17:50:00',CURTIME());
-- DATEDIFF: 날짜1 - 날짜2의 일수를 반환
-- TIMEDIFF: 시간1 - 시간2의 결과를 구함
SELECT DAYOFWEEK(CURDATE()), MONTHNAME(CURDATE()), DAYOFYEAR(CURDATE());
-- DAYOFWEEK: 요일 반환(1이 일요일)
-- MONTHNAME: 해당 달의 이름 반환
-- DAYOFYEAR: 해당 년도에서 몇 일이 흘렀는지 반환
SELECT LAST_DAY('20230201');
-- LAST_DAY: 해당 날짜의 달에서 마지막 날의 날짜를 구한다.
-- makedate(연도, 지난 날)
SELECT MAKEDATE(2023, 35);
-- maketime(시, 분, 초);
SELECT MAKETIME(17, 50, 01);
-- MAKEDATE: 해당 연도의 정수만큼 지난 날짜를 구한다.
-- MAKETIME: 시, 분, 초를 이용해서 '시:분:초'의 TIME 형식을 만든다.
SELECT QUARTER('2023-12-28');
-- QUARTER: 해당 날짜의 분기를 구함
SELECT TIME_TO_SEC(CURTIME()), TIME_TO_SEC('0:0:0');
-- TIME_TO_SEC: 시간을 초 단위로 구함