Section 1. Select 기초 - 원하는 정보 가져오기

강좌 링크
https://www.yalco.kr/@sql/1-1/

실습 링크 (W3School)
https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_select_all

1. SELECT 와 기본 구문

다 가져오기 SELECT * FROM Customers;
원하는 조건만 WHERE
정렬 ORDER BY xx ASC, 내림차순은 DESC
원하는 갯수 LIMIT
별명/alias AS

모두 활용 예제

1
2
3
4
5
6
7
8
9
10
SELECT
CustomerID AS '아이디',
CustomerName AS '고객명',
City AS '도시',
Country AS '국가'
FROM Customers
WHERE
City = 'London' OR Country = 'Mexico'
ORDER BY CustomerName 'ASC'
LIMIT 0, 5;
  1. 주석 달때는 ‘– ‘ 하면 된다
  2. LIMIT은 화면 페이지 구현 하는데 사용

LIMIT {가져올 갯수} 또는 LIMIT {건너뛸 갯수}, {가져올 갯수} 를 사용하여, 원하는 위치에서 원하는 만큼만 데이터를 가져올 수 있습니다.

2. 연산자

연산자 의미
+, -, *, / 더하기, 빼기, 곱하기, 나누기
%, MOD 나머지
IS 양쪽이 모두 TRUE 또는 FALSE
IS NOT 한쪽은 TRUE, 한쪽은 FALSE
AND, && 양쪽이 모두 TRUE일 때만 TRUE
OR, `
= 양쪽 값이 같음
!=, <> 양쪽 값이 다름
>, < (왼쪽, 오른쪽) 값이 더 큼
>=, <= (왼쪽, 오른쪽) 값이 같거나 더 큼
BETWEEN {MIN} AND {MAX} 두 값 사이에 있음
NOT BETWEEN {MIN} AND {MAX} 두 값 사이가 아닌 곳에 있음
IN (…) 괄호 안의 값들 가운데 있음
NOT IN (…) 괄호 안의 값들 가운데 없음
LIKE ‘… % …’ 0~N개 문자를 가진 패턴
LIKE ‘… _ …’ 갯수만큼의 문자를 가진 패턴

3. 숫자와 문자열 함수들

1.숫자 관련
ROUND, CEIL, FLOOR, ABS, GREATEST, LEAST
MAX, MIN, COUNT, SUM, AVG
제곱: POW(A,B), POWER(A,B)
제곱근: SQRT(A)
소숫점 짜르기: TRUNCATE(N,n)

https://dev.mysql.com/doc/refman/8.0/en/numeric-functions.html

2.문자열 관련

UCASE, UPPER, LCASE, LOWER

CONCAT(..), CONCAT_WS(S, ..)

SUBSTR, SUBSTRING, LEFT, RIGHT

LENGTH, CHAR_LENGTH, CHARACTER_LENGTH

TRIM, LTRIM, RTRIM

LPAD(S,N,P), RPAD(S,N,P) padding

REPLACE(S,A,B)

INSTR(S,s) // 위치 반환, 없을시 0

1
2
3
SELECT * FROM Customers
WHERE INSTR(CustomerName, ' ') BETWEEN 1 AND 6;
-- < 6으로 하면?

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

3.자료형 변환

|함수 |설명
|CAST(A, T) |A를 T 자료형으로 변환

1
2
3
4
5
6
SELECT
'01' = '1',
-- 문자열 비교로 0 False

CONVERT('01', DECIMAL) = CONVERT('1', DECIMAL);
-- 숫자로 변환후 비교로 1 True

4.A 시간/날짜 관련

현재 : CURDATE, CURTIME, NOW
문자열 인자로 : DATE, TIME

1
2
3
4
5
6
7
8
9
10
11
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 * FROM Orders
WHERE
OrderDate BETWEEN DATE('1997-1-1') AND DATE('1997-1-31');

(날짜) 필요한 부분만 추출: YEAR, MONTHNAME, MONTH, WEEKDAY, DAYNAME, DAYOFMONTH, DAY
주어진 DATETIME값의 요일값 반환(월요일: 0): WEEKDAY

(시간) 필요한 부분만 추출: HOUR, MINUTE, SECOND

(시간/날짜) 더하기, 빼기 : ADDDATE, DATE_ADD, SUBDATE, DATE_SUB

1
2
3
4
5
6
7
8
SELECT
OrderDate,
ADDDATE(OrderDate, INTERVAL 1 YEAR),
ADDDATE(OrderDate, INTERVAL -2 MONTH),
ADDDATE(OrderDate, INTERVAL 3 WEEK),
ADDDATE(OrderDate, INTERVAL -4 DAY),
ADDDATE(OrderDate, INTERVAL -5 MINUTE)
FROM Orders;

차이 구하기 : TIMEDIFF, DATEDIFF

해당 달의 마지막 날 가져오기 : LAST_DAY

1
2
3
4
5
6
SELECT
OrderDate,
LAST_DAY(OrderDate),
DAY(LAST_DAY(OrderDate)),
DATEDIFF(LAST_DAY(OrderDate), OrderDate)
FROM Orders;

시간/날짜 -> String으로 포멧 함수: DATE_FORMAT

1
2
3
4
5
6
7
8
9
10
11
12
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분 %초'),
'AM', '오전'
),
'PM', '오후'
)

String -> 시간/날짜 포멧 함수: STR_TO_DATE

1
2
3
4
5
6
7
8
9
10
11
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;

4.B 기타 함수

IF(조건, T, F) 와 CASE 문

1
2
3
4
5
6
7
8
9
10
11
SELECT IF (1 > 2, '1는 2보다 크다.', '1은 2보다 작다.');

SELECT
Price,
IF (Price > 30, 'Expensive', 'Cheap'),
CASE
WHEN Price < 20 THEN '저가'
WHEN Price BETWEEN 20 AND 30 THEN '일반'
ELSE '고가'
END
FROM Products;

IFNULL(A,B) : A가 NULL 일 시 B 출력

1
2
3
SELECT
IFNULL('A', 'B'),
IFNULL(NULL, 'B');

5. 조건에 따라 그룹으로 묶기

GROUP BY : 특정 컬럼 별루 묶음

통상 MAX, MIN, COUNT, SUM, AVG 와 같이 쓰임
WITH ROLLUP 을 넣어주면 결과 마지막줄에 합계 추가

1
2
3
4
5
6
7
8
9
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;
WITH ROLLUP

HAVING : 그룹된 결과를 필터링 하고 싶을때 사용
WHERE-> GROUP BY -> HAVING : 조합으로 많이 쓰임

1
2
3
4
5
6
7
8
9
10
11
12
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 : GROUP BY 와 달리 집계 함수 사용 X, 정렬 하지 않아 더 빠름, SELECT 부분에 들어감

1
2
3
4
5
6
7
8
SELECT DISTINCT CategoryID
from Products;

SELECT
Country,
COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;