면접을 보면서 그동안 프론트엔드 언어에만 몰두한 나머지 배웠던 과목이었음에도 잘 생각나지 않았다.😫
그래서 아주 기본적인 부분부터 내용들을 다시 정리해 보고자 글을 작성하게 되었다.
참고 링크
유튜브 영상 - https://www.youtube.com/watch?v=dgpBXNa9vJc&t=834s
학습 사이트 - https://www.yalco.kr/lectures/sql/
MySQL
어려운 프로그래밍 개념들을 쉽게 설명해주는 유튜브 채널 '얄팍한 코딩사전'. 영상에서 다 알려주지 못한 정보들이나 자주 묻는 질문들의 답변들, 예제 코드들을 얄코에서 확인하세요!
www.yalco.kr
쿼리문 실습 사이트 - https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_select_all
MySQL Tryit Editor v1.0
WebSQL stores a Database locally, on the user's computer. Each user gets their own Database object. WebSQL is supported in Chrome, Safari, and Opera. If you use another browser you will still be able to use our Try SQL Editor, but a different version, usin
www.w3schools.com
SQL
Structured Query Language (구조화 질의 언어)

특정 테이블의 모든 컬럼 가져오기
-- SELECT 컬럼명 FROM 테이블명;
SELECT * FROM Customers;

특정 테이블의 특정 컬럼 가져오기
SELECT CustomerName FROM Customers;
SELECT CustomerName, Address FROM Customers;
-- 컬럼명, 컬럼명 ... 콤마(,)를 더해서 여러개를 한번에 가져올 수 있다.
테이블의 컬럼이 아닌 값도 가져오기
SELECT CustomersName, 1, 'Hello', NULL FROM Customers;

원하는 조건의 행(row)만 가져오기
SELECT * FROM Orders WHERE EmployeeID = 3;
-- Orders 테이블에서 EmployeeID가 3인 모든 컬럼 가져오기
SELECT * FROM OrderDetails WHERE Quantity < 5;
-- OrderDetails 테이블에서 Quantity가 5 미만인 모든 컬럼 가져오기
원하는 순서로 데이터 가져오기
ORDER BY 구문을 사용해서 특정 컬럼을 기준으로 데이터를 정렬할 수 있다.
구문 | 기준 | 기본 |
ASC | 오름차순 | ✔ |
DESC | 내림차순 |
SELECT * FROM Customers ORDER BY ContactName;
-- Customers 테이블의 ContactName 컬럼을 오름차순으로 정렬하여 모든 컬럼 가져오기
-- ASC 나 DESC가 생략되어 있을 경우 기본값인 ASC(오름차순)으로 설정된다.

SELECT * FROM OrderDetails ORDER BY ProductID ASC, Quantity DESC;
-- OrderDetails 테이블의 ProductID 컬럼은 오름차순, Quantity 컬럼은 내림차순으로 정렬하여 모든 컬럼 가져오기

원하는 만큼만 데이터 가져오기
SELECT * FROM Customers LIMIT 10;
-- Customers 테이블의 모든 컬럼을 10개만 가져오기
SELECT * FROM Customers LIMIT 30, 10;
-- LIMIT (건너뛸 개수), (가져올 개수);
-- Customers 테이블의 모든 컬럼을 앞에 30개를 건너 뛰고 10개의 모든 컬럼 가져오기

SELECT * FROM Customers ORDER BY CustomerID DESC LIMIT 30, 10;
-- Customers 테이블의 CustomerID 컬럼을 내림차순으로 정렬하여 앞에 30개를 건너 뛰고 10개의 모든 컬럼 가져오기

원하는 별명(alias)으로 데이터 가져오기
SELECT
CustomerId AS ID,
CustomerName AS NAME,
Address AS ADDR
FROM Customers;
-- Customers 테이블에서 CustomerID 컬럼은 'ID'로, CustomerName 컬럼은 'NAME'으로,
-- Address 컬럼은 'ADDR'로 가져오기
-- '아이디', '이름' 식으로 한글로도 가져올 수 있다.

모두 활용하여 데이터 가져오기
SELECT
CustomerName '이름',
Address ADDR,
City '도시'
FROM
Customers
WHERE
City = 'Berlin' or
City = 'Paris'
ORDER BY
CustomerID DESC
LIMIT
1, 2;
-- Customers 테이블에서 CustomerID 컬럼은 내림차순으로 정렬하고,
-- City가 'Berlin' 이거나 'Paris'인
-- CustomerName 컬럼은 '이름'으로, Address 컬럼은 'ADDR'로, City 컬럼은 '도시'로
-- 앞에 1개는 건너 뛰고 2개만 가져오기

사칙연산
연산자 | 의미 |
+ | 더하기 |
- | 빼기 |
* | 곱하기 |
/ | 나누기 |
%, MOD | 나머지 |
SELECT 1 + 2, 1 - 2 AS minus, 4 * 2 AS multiply, 10 / 2, 11 % 3, 11 MOD 3;

SELECT
'ABC' + 3,
'ABC' * 3,
'1' + '002' + 3;

SELECT
CustomerID, EmployeeID,
CustomerID + EmployeeID
FROM
Orders;
-- CustomerID와 EmployeeID 각 컬럼과 둘을 더한 값을 Orders 테이블에서 가져오기

SELECT
ProductName,
Price,
Price / 2 AS HalfPrice
FROM
Products;
-- ProductName, Price 컬럼과 Price 컬럼을 2로 나누고 'HalfPrice' 별명을 붙여서 Products 테이블에서 가져오기

참 / 거짓 연산자
SELECT TRUE, FALSE;

SELECT
!TRUE, -- TRUE의 반대, 즉 1의 반대인 0 출력.
NOT 1, -- 숫자 1의 반대인 0 출력.
!FALSE, -- FALSE(0)의 반대인 1 출력.
NOT FALSE; -- FALSE(0)의 반대인 1 출력.

SELECT
TRUE = 1,
TRUE = 0,
FALSE = 1,
FALSE = 0;

SELECT * FROM Products WHERE ProductName = 'Chais';
-- ProductName 컬럼에서 'Chais'인 행의 모든 컬럼을 Products 테이블에서 가져오기

SELECT * FROM Products WHERE ProductName != 'Chais' LIMIT 3;

SELECT
TRUE IS TRUE,
TRUE IS NOT FALSE,
(TRUE IS FALSE) IS TRUE;
-- TRUE는 TRUE다. TRUE(1)
-- TRUE는 FALSE가 아니다. TRUE(1)
-- 사칙연산처럼 괄호 먼저 계산. (FALSE)는 TRUE다. FALSE(0)

연산자 | 의미 |
AND, && | 양쪽이 모두 TRUE 일 때만 TRUE |
OR, || | 한쪽이 TRUE 면 TRUE |
SELECT
TRUE AND FALSE,
TRUE && TRUE,
TRUE OR FALSE,
FALSE || FALSE;

SELECT 2 * 3 = 6 OR 10 - 5 = 3;

SELECT * FROM Products
WHERE
SupplierID = 11 AND Price < 40;
-- SupplierID 가 11 이고 Price 가 40 미만인(둘 다 만족하는) 모든 컬럼을 Products 테이블에서 가져오기

비교 연산자
연산자 | 의미 |
= | 양쪽 값이 같음 |
!=, <> | 양쪽 값이 다름 |
>, < | (왼쪽, 오른쪽) 값이 더 큼 (초과) |
>=, <= | (왼쪽, 오른쪽) 값이 같거나 더 큼 (이상) |
SELECT
1 = 1,
!(1 <> 1),
NOT (1 < 2),
1 > 0 IS NOT FALSE;
-- TRUE (1), TRUE (1), FALSE (0), TRUE (1)

SELECT
'A' = 'A',
'A' != 'B',
'A' < 'B',
'A' > 'B';


소문자와 대문자는 크기 비교?가 안되는거 같다.
SELECT
ProductName,
Price,
Price > 20 AS EXPENSIVE
FROM
Products
LIMIT
5;
-- ProductName, Price 컬럼과 EXPENSIVE 라는 별명을 붙인 Price 가 20 이 넘는 컬럼을
-- Products 테이블에서 5개만 가져오기.

연산자 | 의미 |
BETWEEN {MIN} AND {MAX} | 두 값 사이에 있음 |
NOT BETWEEN {MIN} AND {MAX} | 두 값 사이에 있지 않음 |
SELECT
20 BETWEEN 1 AND 10,
20 BETWEEN 1 AND 20,
'Banana' BETWEEN 'Apple' AND 'car';

SELECT
ProductName,
Price
FROM
Products
WHERE
Price BETWEEN 15 AND 25
ORDER BY
Price ASC;
-- ProductName, Price 컬럼을 Products 테이블에서 Price 가 15 ~ 20 사이인 행만 오름차순으로 가져오기

연산자 | 의미 |
IN (...) | 괄호 안의 값들 가운데 있음 |
NOT IN (...) | 괄호 안의 값들 가운데 없음 |
SELECT
1 + 2 IN (1, 2, 3),
55 NOT IN (10, 30, 50),
'Hello' IN (100, TRUE, 'hello');
-- 3 은 1, 2, 3 중에 있으니 TRUE (1)
-- 55 는 10, 30, 50 중에 있지 않으니 TRUE (1)
-- Hello 문자열은 100, TRUE, hello 중에 있으니 TRUE (1)

SELECT
CustomerName,
Country
FROM
Customers
WHERE
Country IN ('Germany', 'Mexico', 'USA')
LIMIT
5;
-- CustomerName, Country 컬럼을 Customers 테이블에서
-- Country 가 Germany, Mexico, USA 인 것들만 5개 가져오기.
연산자 | 의미 |
LIKE '...%...' | 0 ~ N 개 문자를 가진 패턴 |
LIKE '..._...' | _ 개수 만큼의 문자를 가진 패턴 |
SELECT
'HELLO' LIKE 'hel%', -- hel 로 시작하고 뒤에는 아무 문자나 상관 없다. TRUE
'HELLO' LIKE 'H%', -- h 로 시작하고 뒤에는 아무 문자나 상관 없다. TRUE
'HELLO' LIKE 'H%O', -- h 로 시작하고 중간은 아무 문자나 오고 o 로 끝난다. TRUE
'HELLO' LIKE '%O', -- 아무 문자로 시작하고 o 로 끝난다. TRUE
'HELLO' LIKE '%HELLO%', -- % 는 0 ~ n 개 이기 때문에 TRUE
'HELLO' LIKE '%H', -- 아무 문자로 시작해서 h 로 끝난다. FALSE
'HELLO' LIKE 'L%'; -- L 로 시작하고 아무 문자나 상관 없다. FALSE

SELECT
CustomerName
FROM
Customers
WHERE
CustomerName LIKE 'b%p';
-- CustomerName 컬럼을 Customers 테이블에서
-- CustomerName 이 b 로 시작해서 아무 문자가 오고 p 로 끝나는 행 가져오기.

SELECT
'HELLO' LIKE 'HEL__', -- hel 로 시작하고 두 글자가 더 붙는 문자열. TRUE
'HELLO' LIKE 'h___O', -- h 로 시작하고 세 글자가 붙고 o 로 끝나는 문자열. TRUE
'HELLO' LIKE 'HE_LO', -- he 로 시작하고 한 글자가 붙고 lo 로 끝나는 문자열. TRUE
'HELLO' LIKE '_____', -- 아무 문자로 되어 있는 다섯 글자의 문자열. TRUE
'HELLO' LIKE '_HELLO', -- 아무 문자 한 글자로 시작하고 hello 가 붙는 문자열. FALSE
'HELLO' LIKE 'HEL_', -- hel 로 시작하고 한 글자가 더 붙는 문자열. FALSE
'HELLO' LIKE 'H_O'; -- h 로 시작하고 한 글자가 붙고 o 로 끝나는 문자열. FALSE

SELECT
Notes
FROM
Employees
WHERE
Notes LIKE '%permanent%';
-- Notes 컬럼을 Employees 테이블에서 Notes 에 permanent 가 포함된 행 가져오기.
-- permanent 단어로 시작, 끝, 아무 문자들 사이, 공백 사이 모두 가능.

SELECT
OrderID,
OrderDate
FROM
Orders
WHERE
OrderID LIKE '102__'
LIMIT
3;
-- OrderID, OrderDate 컬럼을 Orders 테이블에서
-- OrderID 가 102 로 시작하고 아무 두 글자가 더 붙는 행 3개 가져오기.

숫자 관련 함수
함수 | 의미 |
ROUND | 반올림 |
CEIL | 올림 |
FLOOR | 내림 |
SELECT
ROUND(0.5),
CEIL(0.2),
FLOOR(0.9);

SELECT
ProductName,
Price,
ROUND(Price) AS '반올림',
CEIL(Price) AS '올림',
FLOOR(Price) AS '내림'
FROM
Products;
-- ProductName, Price 컬럼과 Price 를 반올림한 '반올림'이란 별명의 컬럼,
-- Price 를 올림한 '올림'이란 별명의 컬럼,
-- Price 를 내림한 '내림'이란 별명의 컬럼을 Products 테이블에서 가져오기.


함수 | 의미 |
ABS | 절대값 |
SELECT
ABS(0.1),
ABS(-25),
ABS(0),
ABS(2 - 10);

SELECT
*
FROM
OrderDetails
WHERE
ABS(Quantity - 10) < 5;
-- Quantity 에서 10을 뺀 수의 절대값이 5보다 작은 OrderDetails 테이블의 모든 컬럼 가져오기.

함수 | 의미 |
GREATEST | (괄호 안에서) 가장 큰 값 |
LEAST | (괄호 안에서) 가장 작은 값 |
SELECT
GREATEST(1, 2, 3, 4, 5),
LEAST(0, 20, 1, -30);

SELECT
OrderDetailID, ProductID, Quantity,
GREATEST(OrderDetailID, ProductID, Quantity) AS GREATEST,
LEAST(OrderDetailID, ProductID, Quantity) AS LEAST
FROM
OrderDetails;
-- OrderDetailID, ProductID, Quantity 컬럼과
-- 세 컬럼 중에서 가장 큰 숫자인 컬럼, 세 컬럼 중에서 가장 작은 숫자인 컬럼을
-- 각각 GREATEST, LEAST 란 별명으로 OrderDetails 테이블에서 가져오기.

함수 | 의미 |
MAX | 가장 큰 값 |
MIN | 가장 작은 값 |
COUNT | 개수 (NULL 값 제외) |
SUM | 총합 |
AVG | 평균값 |
위의 GREATEST 와 MAX 함수, LEAST 와 MIN 함수는 다르니 유의해야 한다.
SELECT
MAX(Quantity),
MIN(Quantity),
COUNT(Quantity),
SUM(Quantity),
AVG(Quantity)
FROM
OrderDetails;
-- Quantity 컬럼의 최댓값, 최솟값, 개수, 합계, 평균값을 OrderDetails 테이블에서 가져오기.

함수 | 의미 |
POW(A, B) or POWER(A, B) | A 를 B 만큼 제곱 |
SQRT | 제곱근 |
SELECT
POW(2, 3),
POWER(2, 3),
SQRT(16);

SELECT
Price,
POW(Price, 1/2)
FROM
Products
WHERE
SQRT(Price) < 4;

함수 | 의미 |
TRUNCATE(A, B) | A 를 소숫점 B 자리까지 선택 |
SELECT
TRUNCATE(1234.5678, 1),
TRUNCATE(1234.5678, 2),
TRUNCATE(1234.5678, 3),
TRUNCATE(1234.5678, -1),
TRUNCATE(1234.5678, -2),
TRUNCATE(1234.5678, -3);

SELECT
*
FROM
Products
WHERE
TRUNCATE(Price, 0) = 12;
-- Price 컬럼의 소숫점을 0의 자리로 끊은 값이 12인 Products 테이블의 모든 컬럼 가져오기.

문자열 관련 함수
함수 | 의미 |
UCASE or UPPER | 모두 대문자로 |
LCASE or LOWER | 모두 소문자로 |
SELECT
UPPER('abcDEF'),
LOWER('abcDEF');

함수 | 의미 |
CONCAT(...) | 괄호 안의 내용을 이어붙임 |
CONCAT_WS(S, ...) | 괄호 안의 내용을 S 로 이어붙임 |
SELECT
CONCAT('Hello', ' ', 'World', ' ', 2022),
CONCAT_WS(' ', 'Hello', 'World', 2022);

SELECT
CONCAT('O-ID ', OrderID)
FROM
Orders;
-- OrderID 컬럼 앞에 'O-ID ' 문자열을 붙여서 Orders 테이블에서 가져오기.

SELECT
LastName,
FirstName,
CONCAT_WS(' ', FirstName, LastName) AS FullName
FROM
Employees;
-- LastName, FirstName 컬럼과
-- FirstName, LastName 컬럼을 공백으로 이어 붙인
-- FullName 이란 별명의 컬럼을 Employees 테이블에서 가져오기.

함수 | 의미 |
SUBSTR or SUBSTRING | 주어진 값에 따라 문자열을 자름 |
LEFT | 왼쪽부터 N 글자 |
RIGHT | 오른쪽부터 N 글자 |
SELECT
SUBSTR('abcdefg', 2), -- 두 번째(b) 부터 가져오기.
SUBSTR('abcdefg', 3, 2), -- 세 번째(c) 부터 두 글자 가져오기.
SUBSTR('abcdefg', -2), -- 뒤에서 두 번째(f) 부터 가져오기.
SUBSTR('abcdefg', -1, 3); -- 뒤에서 첫 번째(g) 부터 세 글자 가져오기.

SELECT
LEFT('abcdefg', 3), -- 왼쪽부터 세 글자 가져오기.
RIGHT('abcdefg', 3); -- 오른쪽부터 세 글자 가져오기.

SELECT
OrderDate,
LEFT(OrderDate, 4) AS Year,
SUBSTR(OrderDate, 6, 2) AS Month,
RIGHT(OrderDate, 2) AS Date
FROM
Orders
WHERE
SUBSTR(OrderDate, 6, 2) = 10;
-- OrderDate 컬럼과
-- OrderDate 컬럼을 왼쪽부터 네 글자를 가져와서 Year 별명을 붙이고
-- OrderDate 컬럼을 여섯 번째 글자부터 두 글자를 가져와서 Month 별명을 붙이고
-- OrderDate 컬럼을 오른쪽부터 두 글자 가져와서 Date 별명을 붙인 컬럼들을
-- 10월인 행들만 Orders 테이블에서 가져오기.

함수 | 의미 |
LENGTH | 문자열의 바이트 길이 |
CHAR_LENGTH or CHARACTER_LENGTH | 문자열의 문자 길이 |
SELECT
LENGTH('abcde'),
LENGTH('안녕하세요'),
CHAR_LENGTH('abcde'),
CHAR_LENGTH('안녕하세요'),
CHARACTER_LENGTH('abcde');

함수 | 의미 |
TRIM | 양쪽 공백 제거 |
LTRIM | 왼쪽 공백 제거 |
RTRIM | 오른쪽 공백 제거 |
SELECT
CONCAT('|', ' HELLO ', '|'),
CONCAT('|', LTRIM(' HELLO '), '|'), -- HELLO 의 왼쪽 공백 제거.
CONCAT('|', RTRIM(' HELLO '), '|'), -- HELLO 의 오른쪽 공백 제거.
CONCAT('|', TRIM(' HELLO '), '|'); -- HELLO 의 양쪽 공백 제거
-- 기본 문자열 => | HELLO |

SELECT
*
FROM
Categories
WHERE
CategoryName = TRIM(' Beverages ');
-- CategoryName 이 Beverages 인 행을 공백을 제거하고 모든 컬럼을 Catergories 테이블에서 가져오기.

함수 | 의미 |
LPAD(S, N, P) | S 가 N 글자가 될 때까지 P 를 왼쪽에 이어붙임 |
RPAD(S, N, P) | S 가 N 글자가 될 때까지 P를 오른쪽에 이어붙임 |
SELECT
LPAD('ABC', 5, '-'),
RPAD('ABC', 5, '-');

SELECT
ProductID,
LPAD(ProductID, 4, 0),
Price,
RPAD(Price, 6, 0)
FROM
Products;
-- ProductID, Price 컬럼과
-- ProductID 가 네 글자가 될때까지 왼쪽에 0 을 붙이고,
-- Price 가 여섯 글자가 될때까지 오른쪽에 0 을 붙인 컬럼을
-- Products 테이블에서 가져오기.

함수 | 의미 |
REPLACE(S, A, B) | S 중 A 를 B 로 변경 |
SELECT
REPLACE('맥도날드에서 햄버거를 먹었다.', '맥도날드', '버거킹');

SELECT
Description,
REPLACE(Description, ',', ' and')
FROM
Categories
LIMIT
3;
-- Description 컬럼과 Description 의 콤마(,)를 ' and'로 변경하여
-- Categories 테이블에서 3개 가져오기.

함수 | 의미 |
INSTR(A, B) | A 중 B 의 첫 위치 반환, 없을 시 0 |
SELECT
INSTR('ABCDE', 'abc'),
INSTR('ABCDE', 'CD'),
INSTR('ABCDE', 'c'),
INSTR('ABCDE', 'F');

SELECT
*
FROM
Customers
WHERE
INSTR(CustomerName, ' ') BETWEEN 1 AND 6;
-- CustomerName 의 첫 공백이 1 에서 6 사이인 행의
-- 모든 컬럼을 Customers 테이블에서 가져오기.

함수 | 의미 |
CONVERT(A, T) | A 를 T 자료형으로 변환 |
SELECT
'01' = '1',
CONVERT('01', DECIMAL) = CONVERT('1', DECIMAL);

시간/날짜 관련 함수
함수 | 의미 |
CURRENT_DATE or CURDATE | 현재 날짜 반환 |
CURRENT_TIME or CURTIME | 현재 시간 반환 |
CURRENT_TIMESTAMP or NOW | 현재 시간과 날짜 반환 |
SELECT
CURDATE(),
CURTIME(),
NOW();

함수 | 의미 |
DATE | 문자열에 따라 날짜 생성 |
TIME | 문자열에 따라 시간 생성 |
SELECT
'2021-6-1' = '2021-06-01',
DATE('2021-6-1') = DATE('2021-06-01'),
'1:2:3' = '01:02:03',
TIME('1:2:3') = TIME('01:02:03');

SELECT
'2021-6-1 1:2:3' = '2021-06-01 01:02:03',
DATE('2021-6-1 1:2:3') = DATE('2021-06-01 01:02:03'),
TIME('2021-6-1 1:2:3') = TIME('2021-06-01 01:02:03'),
DATE('2021-6-1 1:2:3') = TIME('2021-06-01 01:02:03'),
DATE('2021-6-1') = DATE('2021-06-01 01:02:03'),
TIME('2021-6-1 1:2:3') = TIME('01:02:03');

SELECT
OrderID,
OrderDate
FROM
Orders
WHERE
OrderDate BETWEEN DATE('1997-10-1') AND DATE('1997-12-31');
-- OrderID, OrderDate 컬럼과
-- OrderDate 의 1997년 10월 1일과 1997년 12월 31일을 날짜로 변환하고
-- 그 기간 사이의 행을 Orders 테이블에서 가져오기.


함수 | 의미 |
YEAR | 주어진 DATETIME 값의 년도 반환 |
MONTHNAME | 주어진 DATETIME 값의 월(영문) 반환 |
MONTH | 주어진 DATETIME 값의 월 반환 |
WEEKDAY | 주어진 DATETIME 값의 요일갑 반환(월요일 : 0) |
DAYNAME | 주어진 DATETIME 값의 요일명 반환 |
DAYOFMONTH or DAY | 주어진 DATETIME 값의 날짜(일) 반환 |
SELECT
YEAR(OrderDate),
MONTHNAME(OrderDate) AS MONTHNAME,
MONTH(OrderDate) AS MONTH,
WEEKDAY(OrderDate) AS WEEKDAY,
DAYNAME(OrderDate) AS DAYNAME,
DAY(OrderDate) AS DAY
FROM
Orders;

SELECT
OrderDate,
CONCAT(
CONCAT_WS(
'/',
YEAR(OrderDate), MONTH(OrderDate), DAY(OrderDate)
),
' ',
UPPER(LEFT(DAYNAME(OrderDate), 3))
)
FROM Orders;

SELECT
*
FROM
Orders
WHERE
WEEKDAY(OrderDate) = 0;
-- OrderDate 의 WEEKDAY(요일값)가 0(월요일)인 행만
-- Orders 테이블에서 모든 컬럼 가져오기.

함수 | 의미 |
HOUR | 주어진 DATETIME 의 시 반환 |
MINUTE | 주어진 DATETIME 의 분 반환 |
SECOND | 주어진 DATETIME 의 초 반환 |
SELECT
NOW(),
HOUR(NOW()),
MINUTE(NOW()),
SECOND(NOW());
-- 현재 날짜/시간의 시, 분, 초 각각 가져오기.

함수 | 의미 |
ADDDATE or DATE_ADD | 시간/날짜 더하기 |
SUBDATE or DATE_SUB | 시간/날짜 빼기 |
SELECT
ADDDATE('2021-06-20', INTERVAL 1 YEAR), -- 주어진 날짜에 1년 더하기
ADDDATE('2021-06-20', INTERVAL -2 MONTH), -- 두 달 빼기
ADDDATE('2021-06-20', INTERVAL 3 WEEK), -- 3주 더하기
ADDDATE('2021-06-20', INTERVAL -4 DAY), -- 4일 빼기
ADDDATE('2021-06-20', INTERVAL -5 MINUTE), -- 5분 빼기
ADDDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND); -- 6초 더하기

함수 | 의미 |
DATEDIFF | 두 시간/날짜 간 일수차 |
TIMEDIFF | 두 시간/날짜 간 시간차 |
SELECT
OrderDate,
NOW(),
DATEDIFF(OrderDate, NOW())
FROM
Orders;
-- OrderDate 컬럼과 현재 날짜/시간,
-- OrderDate 의 날짜와 현재 날짜의 일수차를 Orders 테이블에서 가져오기.

SELECT
TIMEDIFF('2022-7-18 09:40:20', '2022-7-19 09:40:20');

SELECT * FROM Orders
WHERE
ABS(DATEDIFF(OrderDate, '1996-07-28')) < 5;

함수 | 의미 |
LAST_DAY | 해당 달의 마지막 날짜 |
SELECT
OrderDate,
LAST_DAY(OrderDate),
DAY(LAST_DAY(OrderDate)),
DATEDIFF(LAST_DAY(OrderDate), OrderDate)
FROM Orders;
-- OrderDate 컬럼과 OrderDate 의 달의 마지막 날짜,
-- OrderDate 의 달의 마지막 날짜에서 일만 가져오고,
-- OrderDate 의 달의 마지막 날짜와 OrderDate 의 일수차를 Orders 테이블에서 가져오기.

함수 | 의미 |
DATE_FORMAT | 시간/날짜를 지정한 형식으로 변환 |
형식 | 의미 |
%Y | 년도 4자리 |
%y | 년도 2자리 |
%M | 월 영문 |
%m | 월 숫자 |
%D | 일 영문(1st, 2nd, 3rd, ...) |
%d or %e | 일 숫자 (01 ~ 31) |
%T | hh:mm:ss |
%r | hh:mm:ss AM/PM |
%H or %k | 시 (~23) |
%h or %l | 시 (~12) |
%i | 분 |
%S or %s | 초 |
%p | AM/PM |
SELECT
DATE_FORMAT(NOW(), '%M %D, %Y %T'),
DATE_FORMAT(NOW(), '%y-%m-%d %h:%i:%s %p'),
DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %s초');
-- 현재 날짜/시간을 지정한 형식으로 가져오기.

SELECT REPLACE(
REPLACE(
DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %p %h시 %i분 %S초'),
'AM', '오전'
),
'PM', '오후'
)
-- AM 이면 오전으로 변경, PM 이면 오후로 변경해서 가져오기.

함수 | 의미 |
STR_TO_DATE(S, F) | S 를 F 형식으로 해석하여 시간/날짜 생성 |
SELECT
DATEDIFF(
STR_TO_DATE('2021-06-04 07:48:52', '%Y-%m-%d %T'),
STR_TO_DATE('2021-06-01 12:30:05', '%Y-%m-%d %T')
),
TIMEDIFF(
STR_TO_DATE('2021-06-04 07:48:52', '%Y-%m-%d %T'),
STR_TO_DATE('2021-06-01 12:30:05', '%Y-%m-%d %T')
);
-- 각각 지정한 형식으로 가져온 날짜/시간의 일수차와 시간차 가져오기.

SELECT
OrderDate,
DATEDIFF(
STR_TO_DATE('1997-01-01 13:24:35', '%Y-%m-%d %T'),
OrderDate
),
TIMEDIFF(
STR_TO_DATE('1997-01-01 13:24:35', '%Y-%m-%d %T'),
STR_TO_DATE(CONCAT(OrderDate, ' ', '00:00:00'), '%Y-%m-%d %T')
)
FROM Orders;
-- OrderDate 컬럼과, 문자열을 지정한 형식으로 가져온 날짜/시간과 OrderDate 의 일수차,
-- 문자열을 지정한 형식으로 가져온 날짜/시간과
-- OrderDate 에 공백과 00:00:00 시간을 붙이고 지정한 형식으로 가져온 후 시간차를
-- Orders 테이블에서 가져오기.

함수 | 의미 |
IF(조건, T, F) | 조건이 참이라면 T, 거짓이면 F 반환 |
SELECT
IF(1 > 2, '1은 2보다 크다.', '1은 2보다 작다.');

SELECT
CASE
WHEN -1 > 0 THEN '-1은 양수다.'
WHEN -1 = 0 THEN '-1은 0이다.'
ELSE '-1은 음수다.'
END;
-- -1이 0보다 작을때
-- -1이 0과 같을때
-- 그 밖에 (-1이 0보다 클때)

SELECT
Price,
IF (Price > 30, 'Expensive', 'Cheap'),
CASE
WHEN Price < 20 THEN '저가'
WHEN Price BETWEEN 20 AND 30 THEN '일반'
ELSE '고가'
END
FROM Products;
-- Price 컬럼과, Price 가 30보다 크면 Expensive. 작으면 Cheap 출력.
-- Price 가 20보다 작으면 저가, Price 가 20 ~ 30 사이면 일반,
-- 그 밖에 (30보다 크면) 고가로 출력하고 Products 테이블에서 가져오기.

함수 | 의미 |
IFNULL(A, B) | A 가 NULL 일 시 B 출력 |
SELECT
IFNULL('NULL 아님', 'B'),
IFNULL(NULL, 'B');

7.19 추가작성.