본문 바로가기

MySQL

[MySQL] 기본 쿼리문

면접을 보면서 그동안 프론트엔드 언어에만 몰두한 나머지 배웠던 과목이었음에도 잘 생각나지 않았다.😫

 

그래서 아주 기본적인 부분부터 내용들을 다시 정리해 보고자 글을 작성하게 되었다.

 

참고 링크

유튜브 영상 - 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;

 

Customers 테이블

 

특정 테이블의 특정 컬럼 가져오기

SELECT CustomerName FROM Customers;
SELECT CustomerName, Address FROM Customers;

-- 컬럼명, 컬럼명 ... 콤마(,)를 더해서 여러개를 한번에 가져올 수 있다.

 

테이블의 컬럼이 아닌 값도 가져오기

SELECT CustomersName, 1, 'Hello', NULL FROM Customers;

 

쿼리문 결과값 - 존재하지 않는 1, Hello, NULL 컬럼이 나온다.

 

원하는 조건의 행(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(오름차순)으로 설정된다.

ContactName 컬럼이 알파벳 오름차순으로 정렬되어 있다.

 

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

오름차순으로 정렬된 ProductID 컬럼과, 내림차순으로 정렬된 Quantity 컬럼

 

원하는 만큼만 데이터 가져오기

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

기본적으로 CustomerID 컬럼이 오름차순으로 정렬되어 있어 1 ~ 30은 제외하고 31부터 10개를 가져왔다.

 

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

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;

문자열을 숫자와 함께 계산하면 숫자 0으로 환산하며, 숫자로 이루어진 문자열은 숫자로 인식한다.

 

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;

TRUE는 1, FALSE는 0으로 출력한다.

 

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;

TRUE = 1 TRUE(1), TRUE = 0 FALSE(0), FALSE = 1 FALSE(0), FALSE = 0 TRUE(1)

 

SELECT * FROM Products WHERE ProductName = 'Chais';

-- ProductName 컬럼에서 'Chais'인 행의 모든 컬럼을 Products 테이블에서 가져오기

 

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

!= 을 이용해서 'Chais'가 아닌 행만 가져올 수도 있다.

 

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;

둘다 TRUE ❌ 0, 둘다 TRUE ⭕ 1, 하나라도 TRUE 1, 둘다 FALSE 0

 

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

TRUE OR FALSE. 둘중 하나라도 TRUE 이기 때문에 TRUE (1)

 

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';

알파벳 순서대로 A 는 가장 작고, Z 가 가장 크다. 소문자도 마찬가지다.

소문자와 대문자는 크기 비교?가 안되는거 같다. 

 

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';

숫자는 물론 문자도 가능 하다. 첫 글자만 기준으로 하는듯 하고, 대&middot;소문자 구분은 하지 않는다.

 

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 테이블의 모든 컬럼 가져오기.

Quantity 가 6 ~ 14 사이인 행들만 출력된다. (&plusmn;5 이하)

 

함수 의미
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);

음수일 경우 소숫점 앞으로 0을 붙인다.

 

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');

w3schools 사이트에선 한글의 LENGTH 값이 제대로 나오지 않으니 주의할 것! (이 이미지는 정확한 결과 값이다.)

 

함수 의미
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 테이블에서 가져오기.

RPAD(Price) 를 보면 소수점(.)도 자릿수에 해당한다. 소수점을 포함하여 여섯 자리.

 

함수 의미
REPLACE(S, A, B) S 중 A 를 B 로 변경

 

SELECT
  REPLACE('맥도날드에서 햄버거를 먹었다.', '맥도날드', '버거킹');

 

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

기존에 and 가 있어 중복된다. 이 경우 and 를 먼저 콤마(,)로 변경한 후 콤마를 and 로 변경하여 해결할 수 있다.

 

함수 의미
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 테이블에서 가져오기.

그냥 6 보다 작다(<6)로 할 경우엔 아예 공백이 없는 긴 문자열도 가져온다.

 

함수 의미
CONVERT(A, T) A 를 T 자료형으로 변환

 

SELECT
  '01' = '1',
  CONVERT('01', DECIMAL) = CONVERT('1', DECIMAL);

문자 타입 01 과 1 은 다르니 FALSE 이지만, 둘다 DECIMAL 타입으로 변경하면 숫자 1 이 되기때문에 TRUE 가 나온다.

 

 

 

시간/날짜 관련 함수

함수 의미
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 테이블에서 가져오기.

9511일 차이 (작성 순서에 따라 OrderDate - NOW() 이다.)

 

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;

앞·뒤로 4일 간격인 컬럼만 가져온다. ABS를 붙이면 음수가 아닌 절대값으로 출력된다.

 

함수 의미
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 추가작성.