SQL - BUILD IN FUNCTIONS

김규린·2024년 8월 23일
0

Data Base

목록 보기
16/20

1. BUILD IN FUNCTIONS

  • 문자열, 숫자, 날짜, 시간에 관한 다양한 작업 수행에 많은 내장 함수 제공

1. 문자열 관련 함수

  • ASCII(아스키 코드), CHAR(숫자)

아스키 코드

-- 1. 문자열 관련 함수

-- ASCII(아스키코드), CHAR(숫자)
SELECT ASCII('A'), CHAR(97);

1-1. bit_length(문자열), char_length(문자열), length(문자열)

-- bit_length(문자열), char_length(문자열), length(문자열)
-- 영어, 숫자, 특수기호 제외 한 모든 문자가 문자당 3byte 할당
SELECT
      BIT_LENGTH('한글')
      , CHAR_LENGTH('한글')
      , LENGTH('한글');

-- BIT_LENGTH: 할당된 비트 크기 반환
-- CHAR_LENGTH: 문자열의 길이 반환
-- LENGTH: 할당된 BYTE 크기 반환

1-2. concat(문자열1, 문자열2, ...), concat ws(구분자, 문자열1, 문자열2)

-- 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: 구분자와 함께 문자열을 이어붙임

1-3. ELT(위치, 문자열1, 문자열2, ...), FIELD(찾을 문자열, 문자열1, 문자열2, ...),

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과 동일하고 순서는 반대

1-4. INSERT(기준 문자열, 위치, 해당 위치에서 지울 길이, 삽입할 문자열)

-- INSERT(기준 문자열, 위치, 해당 위치에서 지울 길이, 삽입할 문자열)
SELECT INSERT('나와라 피카츄!', 5, 3, '꼬부기');

-- INSERT: 기준 문자열의 위치부터 길이만큼을 지우고 삽입할 문자열을 끼워 넣는다.

1-5. LEFT(문자열, 길이), RIGHT(문자열, 길이)

-- LEFT(문자열, 길이), RIGHT(문자열, 길이)
SELECT LEFT('Hello World!', 5), RIGHT('Nice Shot!', 5);

-- LEFT: 왼쪽에서 문자열의 길이만큼을 반환
-- RIGHT: 오른쪽에서 문자열의 길이만큼을 반환

1-6. UPPER(문자열), LOWER(문자열)

-- UPPER(문자열), LOWER(문자열)
SELECT LOWER('Hello World!'), UPPER('Hello World!');

-- UPPER: 소문자를 대문자로 변경
-- LOWER: 대문자를 소문자로 변경

1-7. LPAD(문자열, 길이, 채울 문자열), RPAD(문자열, 길이, 채울 문자열)

-- LPAD(문자열, 길이, 채울 문자열), RPAD(문자열, 길이, 채울 문자열)
SELECT LPAD('왼쪽', 10, '#'), RPAD('오른쪽', 10, '#');

-- LPAD: 문자열을 길이만큼 왼쪽으로 늘린 후에 빈 곳을 문자열로 채운다.
-- RPAD: 문자열을 길이만큼 오른쪽으로 늘린 후에 빈 곳을 문자열로 채운다.

1-8. LTRIM(문자열), RTRIM(문자열) / 공백 제거 역할

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(뒤))이 있으면 해당 방향에 지정한 문자열을 제거할 수 있다.

1-9. format(숫자, 소수점 자릿수)

-- format(숫자, 소수점 자릿수)
SELECT FORMAT(123456789, 3);

-- FORMAT: 1000단위마다 콤마(,) 표시를 해 주며 소수점 아래 자릿수(반올림)까지 표현한다.

1-10. bin(숫자), oct(숫자), hex(숫자)

-- bin(숫자), oct(숫자), hex(숫자)
SELECT BIN(65), OCT(65), HEX(65);

-- bin: 2진수로 표현
-- oct: 8진수로 표현
-- hex: 16진수로 표현

1-11. repeat(문자열, 횟수)

SELECT repeat('재미져 ', 5);

-- REPEAT: 문자열을 횟수만큼 반복

1-12. replace(문자열, 찾을 문자열, 바꿀 문자열)

SELECT REPLACE('마리아DB', '마리아', 'Maria');

-- REPLACE: 문자열에서 문자열을 찾아 치환

1-13. reverse(문자열)

SELECT REVERSE('happiness');

-- REVERSE: 문자열의 순서를 거꾸로 뒤집음

1-14. space(문자열)

SELECT CONCAT('제 포켓몬은', SPACE(3), '이고, 속성은', SPACE(6), '입니다.');

-- SPACE: 길이 만큼의 공백을 반환

1-15. substring(문자열, 시작위치, 길이)

SELECT SUBSTRING('열심히 db공부를 해 봅시다!', 5, 4) 
	  , SUBSTRING('열심히 db공부를 해 봅시다!', 11); -- 11번째 문자부터 끝까지

-- SUBSTRING: 시작 위치부터 길이만큼의 문자를 반환(길이를 생략하면 시작 위치부터 끝까지 반환)

1-16. substring_index(문자열, 구분자, 횟수)

SELECT
		SUBSTRING_INDEX('010-2222-2222', '-', 2)
	 , SUBSTRING_INDEX('010-2222-2222', '-', -1);

-- SUBSTRING_INDEX: 구분자가 왼쪽부터 횟수 번쨰 나오면 그 이후의 오른쪽은 버린다. 횟수가 음수일 경우 오른쪽부터 세고 왼쪽을 버린다.

2. 숫자 관련 함수

2-1. abs(숫자)

SELECT ABS(-123);

-- ABS: 절대값 반환
-- 양수도 양수로, 음수도 양수로

2-2. ceiling(숫자), floor(숫자), round(숫자)

SELECT CEILING(1234.56), FLOOR(1234.56), ROUND(1234.56);

-- CEILING: 올림값 반환
-- FLOOR: 버림값 반환
-- ROUND: 반올림값 반환

2-3. conv(숫자, 원래 진수, 변환할 진수)

SELECT CONV('F', 16, 10), CONV('A', 16, 2);

-- CONV: 원래 진수에서 변환하고자 하는 진수로 변환

2-4. mod(숫자1, 숫자2)

SELECT MOD(10, 3), 10 % 3;

-- MOD: 숫자 1을 숫자 2로 나눈 나머지 추출

2-5. pow(숫자1, 숫자2), sqrt(숫자)

SELECT POW(3,2), SQRT(81);

-- POW: 거듭제곱값 추출
-- SQRT: 제곱근을 추출

2-6. floor(rand() * 생성할 난수 갯수 + 난수의 초기값)

SELECT FLOOR(RAND() * 4 + 5), FLOOR(RAND() * 4) + 5;

-- RAND: 0이상 1 미만의 실수를 구한다.

2-7. sign(숫자)

SELECT SIGN(10.1), SIGN(0), SIGN(-1.1);

-- SIGN: 양수면 1, 0이면 0, 음수면 -1을 반환

2-8. truncate(숫자, 정수)

-- truncate(숫자, 정수)
SELECT TRUNCATE(1234.1234, 2), TRUNCATE(1234.1234, -1);

-- TRUNCATE: 소수점을 기준으로 정수 위치까지 구하고 나머지는 버림

3. 날짜 및 시간 관련 함수

3-1. adddate(날짜, 차이), subdate(날짜, 차이)

-- 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: 날짜를 기준으로 날짜를 뺌

3-2. addtime(날짜/시간, 시간), subtime(날짜/시간, 시간)

SELECT ADDTIME('2023-12-28 10:27:00' , '1:0:10'), SUBTIME('2023-12-28 10:27:00' , '1:0:10');

-- ADDTIME: 날짜 또는 시간을 기준으로 시간을 더함
-- SUBTIME: 날짜 또는 시간을 기준으로 시간을 뺌

3-3. curdate(), curtime(), now(), sysdate()

SELECT CURDATE(), CURTIME(), NOW(), SYSDATE();

SELECT CURTIME(), CURRENT_TIME(), CURRENT_TIME;

SELECT @@GLOBAL.time_zone; -- 현재 타임존 기준으로 확인하는 조회문

-- CURDATE: 현재 연-월-일 추출
-- CURTIME: 현재 시:분:초 추출
-- NOW() 또는 SYSDATE(): 현재 연-월-일 시:분:초 추출

3-4. year(날짜), month(날짜), day(날짜)

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(시간)
-- 날짜 또는 시간에서 연, 월, 일, 시, 분, 초, 밀리초를 추출

3-5. date(날짜/시간), time(날짜/시간)

SELECT DATE(NOW()), TIME(NOW());

-- DATE: 연-월-일만 추출
-- TIME: 시:분:초만 추출

3-6. datediff(날짜1, 날짜2), timediff(날짜1 또는 시간1, 날짜2 또는 시간2)

SELECT DATEDIFF('2023-12-28', '2024-06-14'), TIMEDIFF('17:50:00',CURTIME());

-- DATEDIFF: 날짜1 - 날짜2의 일수를 반환
-- TIMEDIFF: 시간1 - 시간2의 결과를 구함

3-7. dayofweek(날짜), monthname(날짜), dayofweek(날짜)

SELECT DAYOFWEEK(CURDATE()), MONTHNAME(CURDATE()), DAYOFYEAR(CURDATE());

-- DAYOFWEEK: 요일 반환(1이 일요일)
-- MONTHNAME: 해당 달의 이름 반환
-- DAYOFYEAR: 해당 년도에서 몇 일이 흘렀는지 반환

3-8. last_day(날짜)

SELECT LAST_DAY('20230201');

-- LAST_DAY: 해당 날짜의 달에서 마지막 날의 날짜를 구한다.

3-9. makedate(연도, 지난 날), maketime(시, 분, 초)

-- makedate(연도, 지난 날)
SELECT MAKEDATE(2023, 35);

-- maketime(시, 분, 초);
SELECT MAKETIME(17, 50, 01);

-- MAKEDATE: 해당 연도의 정수만큼 지난 날짜를 구한다.
-- MAKETIME: 시, 분, 초를 이용해서 '시:분:초'의 TIME 형식을 만든다.

3-10. quarter(날짜)

SELECT QUARTER('2023-12-28');

-- QUARTER: 해당 날짜의 분기를 구함

3-11. time_to_sec(시간)

SELECT TIME_TO_SEC(CURTIME()), TIME_TO_SEC('0:0:0');

-- TIME_TO_SEC: 시간을 초 단위로 구함
profile
나는 할 수 있다...!

0개의 댓글