DB(MySQL)
MySQL - 함수 모음/연산
우가본
2024. 8. 14. 12:17
############[ 연산자 & 내장함수 ]#############
1. 수학함수 & 산술 연산자
[기본 산술]
사칙연산 : + - * /
몫 : div
나머지 : %, MOD, MOD(값, divisor)
제곱 : POW(값, 지수), POWER(값, 지수)
제곱근 : SQRT(값)
반올림 : ROUND(값, [소수점자릿수])
올림 : CEIL(값, [소수점자릿수]), CEILING(값, [소수점자릿수])
버림 : FLOOR(값, [소수점자릿수]), TRUNCATE(값, 소수점자릿수)
절댓값 : ABS(값)
난수 생성 : RAND()
2. 논리함수 & 논리 연산자
모두 참이면 참 : AND &&
하나라도 참이면 참 : OR ||
서로 다르면 참 : XOR
대입 연산 : :=
삼항 연산 : IF(조건식, 참의 반환값, 거짓의 반환값)
값이 null일 때 반환값 : IFNULL(값, 반환값), COALESCE(값, 반환값)
3. 비교함수 & 비교 연산자
크다, 작다 : > < >= <=
같다, 다르다 : =, != <>
null값 여부 : IS NULL, IS NOT NULL
참 여부 : IS TRUE, IS NOT TRUE
거짓 여부 : IS FALSE, IS NOT FALSE
min ~ max : BETWEEN min AND max
!(min ~ max) : NOT BETWEEN min AND max
비교값들 중 존재 여부 : IN(비교값들 혹은 서브쿼리)
서브쿼리가 반환하는 레코드(행) 존재 여부 : EXISTS(서브쿼리)
비교값들 모두 만족하면 참 : ALL(비교값들 혹은 서브쿼리)
비교값들 중 하나라도 만족하면 참 : ANY(비교값들 혹은 서브쿼리)
-- IN()
-- EXISTS()
-- ANY()
최댓값 : GREATEST(값,...)
최솟값 : LEAST(값,...)
4. 문자열함수
문자 → 아스키 코드값 : ASCII('C')
아스키 코드값 → 문자 : CHAR(정수)
합치기 : CONCAT(str,...), CONCAT_WS('구분자', str,...)
대체 : REPLACE(str, 기존문자, 대체문자)
자르기 : SUBSTR(str, start, length)
문자열 길이 : 바이트수 LENGTH(str), 문자수 CHAR_LENGTH(str)
문자열 검색 : INSTR(str, 검색문자)
문자열 포함 확인 : LIKE '%', NOT LIKE '_'
wildcard (대체 문자) : 단일문자 대체 _, 복수문자 대체 %
→ wildcard 검색 시, 앞에 역슬래시\를 추가
5. 날짜함수
현재 날짜와 시간 : NOW(), CURRENT_TIMESTAMP(), sysdate()
일 차이 : DATEDIFF(date1, date2)
날짜 및 시간 차이 : TIMESTAMP(단위, date2, date1)
-- (date1 - date2) 계산
SELECT TIMESTAMPDIFF(HOUR, '2022-12-31', '2023-01-01'); -- 24
원하는 값만 추출 : YEAR(날짜), MONTH(날짜), DAYOFMONTH(날짜),DAYOFWEEK(날짜) HOUR(시간), MINUTE(시간), SECOND(시간)
SELECT DAYOFWEEK('2022-12-31'); -- 7 (토요일)
SELECT DAYOFWEEK('2023-01-01'); -- 1 (일요일)
형식 변경 : DATE_FORMAT(col, '%Y')
📋 포맷 코드
코드 역할 예시 코드 역할 예시
%Y 년 2023 %T 시간 00:00:00
%y 년 23 %H 시 00 ~ 23
%M 월 January %h, %I 시 01 ~12
%b 월 Jan %k 시 0 ~ 23
%m 월 01 %l 시 1 ~ 12
%c 월 1 %i 분 00
%d 일 01 %S, %s 초 00
%e 일 1 %p A/P AM
%W 요일 Sunday
%a 요일 Sun
6. 기타
집계함수 (그룹함수)
갯수, 합, 평균 : COUNT(col), SUM(col), AVG(col)
최대, 최소 : MAX(col), MIN(col)
분석함수 (순위함수)
순위 : RANK(), DENSE_RANK(), ROW_NUMBER()
범위 제한 : LIMIT 시작인덱스, 갯수, LIMIT 갯수 OFFSET 시작인덱스
EX)
봉급 RANK DENSE_RANK ROW_NUMBER
2500 1 1 1
2500 1 1 2
2000 3 2 3
윈도우함수
OVER() : 행과 행 간의 관계를 정의해주는 함수
→ 집계함수 혹은 분석함수와 함께 쓰임
집계함수 사용을 위한 그룹화 : PARTITION BY
분석함수 사용을 위한 정렬 : ORDER BY
-- 기존 데이터에 부서별 평균임금
SELECT *,AVG(sapay) OVER(PARTITION BY deptno) as dept_avg FROM sawon;
-- 기존 데이터에 봉급 순위 추가 (1~10위로 제한)
SELECT name, salary,
ROW_NUMBER()OVER(ORDER BY sapay DESC)
FROM sawon
LIMIT 0, 10;
-> MySQL은 형식에 크게 구애받지 않는다
-> 단, 테스트 용이 아닐 때에는 정확한 형식을 수행해줘야 한다.