사칙연산 : +
-
*
/
몫 : div
나머지 : %
, MOD
, MOD(값, divisor)
제곱 : POW(값, 지수)
, POWER(값, 지수)
제곱근 : SQRT(값)
반올림 : ROUND(값, [소수점자릿수])
올림 : CEIL(값, [소수점자릿수])
, CEILING(값, [소수점자릿수])
버림 : FLOOR(값, [소수점자릿수])
, TRUNCATE(값, 소수점자릿수)
절댓값 : ABS(값)
난수 생성 : RAND()
SELECT FLOOR(RAND() * 10); -- 0 ~ 9
모두 참이면 참 : AND
&&
하나라도 참이면 참 : OR
||
서로 다르면 참 : XOR
대입 연산 : :=
삼항 연산 : IF(조건식, 참의 반환값, 거짓의 반환값)
값이 null일 때 반환값 : IFNULL(값, 반환값)
, COALESCE(값, 반환값)
크다, 작다 : >
<
>=
<=
같다, 다르다 : =
, !=
<>
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()
SELECT *
FROM employee
WHERE age IN(20, 30, 40);
-- EXISTS()
SELECT *
FROM customers
WHERE EXISTS(SELECT * FROM orders
WHERE orders_id = customers_id);
-- ANY()
SELECT *
FROM employees
WHERE age = ANY(SELECT age FROM employees
WHERE location = '서울');
최댓값 : GREATEST(값,...)
최솟값 : LEAST(값,...)
ASCII('C')
CHAR(정수)
합치기 : CONCAT(str,...)
, CONCAT_WS('구분자', str,...)
대체 : REPLACE(str, 기존문자, 대체문자)
자르기 : SUBSTR(str, start, length)
SELECT SUBSTRING('12345', 3, 2); -- '34'
문자열 길이 : 바이트수 LENGTH(str)
, 문자수 CHAR_LENGTH(str)
문자열 검색 : INSTR(str, 검색문자)
문자열 포함 확인 : LIKE '%'
, NOT LIKE '_'
_
, 복수문자 대체 %
\
를 추가
현재 날짜와 시간 : NOW()
, CURRENT_TIMESTAMP()
일 차이 : 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 | 년 | 2022 | %T | 시간 | 00:00:00 | |
%y | 년 | 22 | %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 |
갯수, 합, 평균 : 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 name, salary, department,
AVG(salary)OVER(PARTITION BY department)
FROM employees;
-- 기존 데이터에 봉급 순위 추가 (1~10위로 제한)
SELECT name, salary,
ROW_NUMBER()OVER(ORDER BY salary DESC)
FROM employees
LIMIT 0, 10;