데이터 조회
SELECT
SELECT * FROM Customers;
SELECT CustomerName FROM Customers;
WHERE
- 데이터 필터링 : 원하는 조건의 ROW만 걸러서 보기
SELECT * FROM Orders WHERE EmployeeID = 3;
SELECT * FROM OrderDetails WHERE Quantity < 5;
ORDER BY
- 데이터 정렬 : 특정 COLUMN을 기준으로 데이터를 정렬
ASC
: 오름차순(Ascending) - default
DESC
: 내림차순(Descending)
SELECT * FROM Customers ORDER BY ContactName;
SELECT * FROM OrderDetails
ORDER BY ProductID ASC, Quantity DESC;
LIMIT
- 원하는 개수만큼 데이터 조회
LIMIT {건너뛸 개수 (= 0)}, {가져올 개수}
SELECT * FROM Customers LIMIT 10;
SELECT * FROM Customers LIMIT 30, 10;
AS
SELECT
CustomerId AS ID,
CustomerName AS NAME,
Address AS ADDR
FROM Customers;
연산자
기본 연산자
연산자 | 의미 |
---|
+ - * / % | 더하기, 빼기, 곱하기, 나누기, 나머지 |
IS | 양쪽 모두 TRUE거나 FALSE |
IS NOT | 한쪽은 TRUE, 다른 쪽은 FALSE |
AND, && | 양쪽 모두 TRUE |
OR, || | 한 쪽이라도 TRUE |
= | 양 쪽이 같음 |
!=, <> | 양 쪽이 다름 |
<, >, <=, >= | 부등호 |
BETWEEN AND
SELECT * FROM OrderDetails
WHERE ProductID BETWEEN 1 AND 4;
SELECT * FROM Customers
WHERE CustomerName BETWEEN 'b' AND 'c';
IN, NOT IN
SELECT * FROM Customers
WHERE City IN ('Torino', 'Paris', 'Portland', 'Madrid')
LIKE '%', LIKE '_'
- 문자 패턴
%
: 0~N개 문자
_
: _ 개수만큼의 문자
SELECT
'HELLO' LIKE 'hel%',
'HELLO' LIKE 'H%',
'HELLO' LIKE 'H%O',
'HELLO' LIKE '%O',
'HELLO' LIKE '%HELLO%',
'HELLO' LIKE '%H',
'HELLO' LIKE 'L%'
SELECT
'HELLO' LIKE 'HEL__',
'HELLO' LIKE 'h___O',
'HELLO' LIKE '_____',
'HELLO' LIKE '_HELLO',
'HELLO' LIKE 'HEL_',
'HELLO' LIKE 'H_O'
함수
숫자 관련 함수
함수 | 설명 |
---|
ROUND | 반올림 |
CEIL | 올림 |
FLOOR | 내림 |
ABS | 절댓값 |
GREATEST | (각 ROW에 대해) 가장 큰 값 |
LEAST | (각 ROW에 대해) 가장 작은 값 |
MAX | (각 그룹에서) 가장 큰 값 |
MIN | (각 그룹에서) 가장 작은 값 |
COUNT | (각 그룹에서) NULL을 제외한 개수 |
SUM | (각 그룹에서) 합 |
AVG | (각 그룹에서) 평균 |
POW(A,B) | A의 B제곱 |
SQRT | 제곱근 |
TRUNCATE(N, n) | N을 소숫점 n자리까지 선택 |
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);
문자열 관련 함수
함수 | 설명 |
---|
UCASE, UPPER | 모두 대문자로 |
LCASE, LOWER | 모두 소문자로 |
CONCAT(...) | 문자열 이어붙이기 |
CONCAT_WS(S, ...) | 문자열 사이에 S를 넣어서 이어붙이기 |
SUBSTR, SUBSTRING(str, idx, ofs) | idx부터 ofs만큼 문자열을 자름 |
LEFT | 왼쪽부터 N글자 |
RIGHT | 오른쪽부터 N글자 |
LENGTH | 문자열의 문자 바이트 길이 |
CHAR_LENGTH, CHARACTER_LENGTH | 문자열의 문자 길이 |
TRIM | 양쪽 공백 제거 |
LTRIM | 왼쪽 공백 제거 |
RTRIM | 오른쪽 공백 제거 |
LPAD(S,N,P) | S가 N글자가 될 때까지 왼쪽에 P를 이어붙임 |
RPAD(S,N,P) | S가 N글자가 될 때까지 오른쪽에 P를 이어붙임 |
REPLACE(S,A,B) | S에 있는 A를 B로 치환 |
INSTR(S,s) | S중 s의 첫번째 위치 반환, 없으면 0 |
CONVERT | 자료형 변환 |
SELECT CONCAT_WS('-', 2021, 8, 15, 'AM');
SELECT
SUBSTR('ABCDEFG', 3),
SUBSTR('ABCDEFG', 3, 2),
SUBSTR('ABCDEFG', -4),
SUBSTR('ABCDEFG', -4, 2);
SELECT
LENGTH('안녕하세요'),
CHAR_LENGTH('안녕하세요'),
CHARACTER_LENGTH('안녕하세요');
SELECT * FROM Categories
WHERE CategoryName = TRIM(' Beverages ');
SELECT
LPAD('ABC', 5, '_'),
RPAD('ABC', 5, '_');
SELECT
INSTR('ABCDE', 'ABC'),
INSTR('ABCDE', 'BCDE'),
INSTR('ABCDE', 'C'),
INSTR('ABCDE', 'DE'),
INSTR('ABCDE', 'F');
시간, 날짜 관련 함수
함수 | 설명 |
---|
CURRENT_DATE, CURDATE | 현재 날짜 |
CURRENT_TIME, CURTIME | 현재 시간 |
CURRENT_TIMESTAMP, NOW | 현재 시간과 날짜 |
DATE | 문자열을 받아 날짜생성 |
TIME | 문자열을 받아 시간 생성 |
YEAR | 년도 |
MONTHNAME | 월(영문) |
MONTH | 월(숫자) |
WEEKDAY | 요일(숫자) |
DAYNAME | 요일명 |
DAYOFMONTH, DAY | 날짜 |
HOUR | 시 |
MINUTE | 분 |
SECOND | 초 |
ADDDATE, DATE_ADD | 시간, 날짜 더하기 |
SUBDATE, DATE_SUB | 시간, 날짜 빼기 |
DATEDIFF | 두 날짜 사이 일 수 |
TIMEDIFF | 두 시간 사이 시간차 |
LAST_DAY | 그 달의 마지막 날짜 |
SELECT
ADDDATE('2021-06-20', INTERVAL 1 YEAR),
ADDDATE('2021-06-20', INTERVAL -2 MONTH),
ADDDATE('2021-06-20', INTERVAL 3 WEEK),
ADDDATE('2021-06-20', INTERVAL -4 DAY),
ADDDATE('2021-06-20', INTERVAL -5 MINUTE),
ADDDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND);
SELECT
SUBDATE('2021-06-20', INTERVAL 1 YEAR),
SUBDATE('2021-06-20', INTERVAL -2 MONTH),
SUBDATE('2021-06-20', INTERVAL 3 WEEK),
SUBDATE('2021-06-20', INTERVAL -4 DAY),
SUBDATE('2021-06-20', INTERVAL -5 MINUTE),
SUBDATE('2021-06-20 13:01:12', INTERVAL 6 SECOND);
SELECT * FROM Orders
WHERE
ABS(DATEDIFF(OrderDate, '1996-10-10')) < 5;
- 시간, 날짜를 지정한 형식으로 변환
- STR_TO_DATE(S, F) : 문자열을 F형식으로 해서 시간, 날짜 생성
형식 | 설명 |
---|
%Y | 년도 4자리 |
%y | 년도 2자리 |
%M | 월(영문) |
%m | 월(숫자) |
%D | 일(영문) |
%d, %e | 일(숫자) |
%T | hh:mm:ss |
%r | hh:mm:ss AM/PM |
%H, %k | 시(~23) |
%h, %l | 시(~12) |
%i | 분 |
%S, %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초');
기타 함수
함수 | 설명 |
---|
IF(조건, T, F) | 조건이 참이면 T, 거짓이면 F |
CASE-WHEN 조건-THEN 실행문-ELSE 실행문-END | WHEN의 조건이 참이면 THEN, 맞는 조건이 없으면 ELSE |
IFNULL(A,B) | A가 NULL이면 B출력 |
SELECT
Price,
IF (Price > 30, 'Expensive', 'Cheap'),
CASE
WHEN Price < 20 THEN '저가'
WHEN Price BETWEEN 20 AND 30 THEN '일반'
ELSE '고가'
END
FROM Products;
데이터 그룹화
- 그룹함수 : 그룹단위로 실행되는 함수
- MAX, MIN, COUNT, SUM, AVG
GROUP BY
- 조건에 따라 중복없이 특정 column을 기준으로 데이터를 묶음
SELECT Country FROM Customers
GROUP BY Country;
SELECT
Country, City,
CONCAT_WS(', ', City, Country)
FROM Customers
GROUP BY Country, City;
SELECT
COUNT(*), OrderDate
FROM Orders
GROUP BY OrderDate;
SELECT
CategoryID,
MAX(Price) AS MaxPrice,
MIN(Price) AS MinPrice,
TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
GROUP BY CategoryID;
SELECT
CONCAT_WS(', ', City, Country) AS Location,
COUNT(CustomerID)
FROM Customers
GROUP BY Country, City;
WITH ROLLUP
- 전체 column의 총 합
- ORDER BY 와 함께 사용 불가
SELECT
Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;
HAVING
- 그룹 안에서 필터링
WHERE
은 그룹화 전 데이터, HAVING
은 그룹화 한 데이터에 대해 적용
SELECT
COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;
SELECT
CategoryID,
MAX(Price) AS MaxPrice,
MIN(Price) AS MinPrice,
TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
WHERE CategoryID > 2
GROUP BY CategoryID
HAVING
AveragePrice BETWEEN 20 AND 30
AND MedianPrice < 40;
DISTINCT
- 중복을 제거하여 조회(
SELECT
문에 사용)
- 그룹 함수 사용 불가(MAX, MIN, COUNT, SUM, AVG)
GROUP BY
는 자동으로 정렬이 되어 나오지만, DISTINCT
는 원본 데이터 순서 그대로 나옴
SELECT DISTINCT CategoryID
FROM Products;
SELECT COUNT DISTINCT CategoryID
FROM Products;
SELECT DISTINCT Country
FROM Customers
ORDER BY Country;
SELECT DISTINCT Country, City
FROM Customers
ORDER BY Country, City;
GROUP BY
와 DISTINCT
를 함께 사용
SELECT
Country,
COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;
참고자료