
๋ณธ ํฌ์คํ ์ ํ๋ก๊ทธ๋๋จธ์ค ๋ฏธ๋ ๋ฐ๋ธ ์ฝ์ค๋ฅผ ๊ณต๋ถํ๋ฉฐ
ํ์ต์ ๊ธฐ๋กํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์์ฑ๋ ๊ธ์ ๋๋ค.
SQL์ ์ผ์ข
์ ๋ถ๋ฅ์ฒด๊ณ์ฒ๋ผ 2๊ณ์ธต์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
์์ ๊ณ์ธต์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์คํค๋ง)๊ฐ ์๊ณ ํ์ ๊ณ์ธต์๋ ํ
์ด๋ธ์ด ์๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ์ ์ฑ๊ฒฉ์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ค์ ๊ด๋ฆฌํ ์ ์๋ค.
SHOW DATABASES;
USE ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ;
SHOW DATABASES; ๋ ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ช
๋ น์ด๋ค.
USE ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ; ์ ์์ผ๋ก ํ
์ด๋ธ ์์ฑ์ ๋ช
์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ๊ฒ ๋ค๋ ์๋ฏธ๋ค.
SHOW TABLES;
USE๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ช
์ํด์ค ๋ค SHOW TABLES; ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช
์ํด์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ ํ
์ด๋ธ๋ค์ ๋ณผ ์ ์๋ค.
SELECT๋ ๊ฒ์์ ์ํ ๋ฐ์ดํฐ ์กฐ์์ด(DML)์ด๋ค.
DML์ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์, ์ฝ์
, ์์ , ์ญ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ
DML์๋ SELECT, INSERT, DELETE, UPDATE๋ฌธ ๋ฑ์ด ์๋ค.
๊ทธ ์ค SELECT๋ฌธ์ ํน๋ณํ ์ง์์ด๋ผ๊ณ ํ๊ธฐ๋ ํ๋ค.
SELECT ํ๋์ด๋ฆ1, ํ๋์ด๋ฆ2, โฆ
FROM ํ
์ด๋ธ์ด๋ฆ
WHERE ์ ํ์กฐ๊ฑด
GROUP BY ํ๋์ด๋ฆ1, ํ๋์ด๋ฆ2, โฆ
ORDER BY ํ๋์ด๋ฆ [ASC|DESC] -- ํ๋ ์ด๋ฆ ๋์ ์ ์ซ์ ์ฌ์ฉ ๊ฐ๋ฅ
LIMIT N;
LIMIT ๋ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ๋๋ ๋ ์ฝ๋์ ์๋ฅผ ๊ฒฐ์ ํด์ค๋ค.LIMIT 10;์ด๋ผ๋ ์ง์๋ฅผ ์
๋ ฅํ๋ค๋ฉด ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ๋๋ ๋ ์ฝ๋๋ 10๊ฐ๊ฐ ๋๋ค.SELECT DISTINCT ํ๋์ด๋ฆ
FROM ํ
์ด๋ธ๋ช
DISTINCT ๋ ์ค๋ณต์ด ์๋ ๊ฐ์ ๋ณด์ฌ์ค๋ค.SELECT COUNT(*)
FROM ํ
์ด๋ธ๋ช
COUNT() ๋ด๋ถ์ ๊ฐ์ด NULL๋ง ์๋๋ผ๋ฉด ์ด๋ค ๊ฐ์ ๋ฃ๋ COUNT()๋ ๋์ผํ๊ฒ ๋์ํ๋ค.์์
"COUNT() ๋ด๋ถ์ ๊ฐ์ด NULL๋ง ์๋๋ผ๋ฉด ์ด๋ค ๊ฐ์ ๋ฃ๋ COUNT()๋ ๋์ผํ๊ฒ ๋์ํ๋ค."
์ด๊ฒ ๋์ฒด ๋ฌด์จ ๋ง์ผ๊น? ์์ ๋ฅผ ํตํด ํ์ตํด๋ณด์๋ค.

prod.count_test ํ
์ด๋ธ์ value ํ๋๊ฐ ์๋ค๊ณ ํ์.
ํ
์ด๋ธ์ ๋ํ ๋ค์ ๋ค์ฏ ๊ฐ์ง์ ์ง์๊ฐ ์๋ค.
SELECT COUNT(1)
FROM prod.count_test;
SELECT COUNT(0)
FROM prod.count_test;
SELECT COUNT(NULL)
FROM prod.count_test;
SELECT COUNT(value)
FROM prod.count_test;
SELECT COUNT(DISTINCT value)
FROM prod.count_test;
SELECT COUNT(1)
FROM prod.count_test;
SELECT COUNT(0)
FROM prod.count_test;
COUNT()๋ ๊ธฐ๋ณธ์ ์ผ๋ก SELECT๋ ๋ ์ฝ๋์ ์๋ฅผ ์ผ๋ค.
COUNT()๊ฐ ์๋ฅผ ์ธ๋ ๋ฐฉ์์ COUNT()์ ์ธ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
COUNT()์ ์ธ์๊ฐ NULL์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด 1์ฉ ์นด์ดํธํ๋ค.
NULL์ธ ๊ฒฝ์ฐ์๋? ์์ ์นด์ดํธํ์ง ์๋๋ค.
๋ ์ง์์์๋ COUNT ์ธ์๊ฐ NULL๊ฐ์ด ์๋๊ธฐ ๋๋ฌธ์
value ํ๋์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ฉ ์นด์ดํธํ๋ค.
๋ฐ๋ผ์, ๊ฒฐ๊ณผ๋ 7์ด๋ค.
SELECT COUNT(NULL)
FROM prod.count_test;
์ด ์ง์์์๋ COUNT ์ธ์๊ฐ NULL๊ฐ์ด๋ค.
์ด ๊ฒฝ์ฐ์๋ COUNT ํจ์์ ํญ์ NULL์ด ๋ค์ด์ ์นด์ดํธ๋ฅผ ํ์ง ์๋๋ค.
๋ฐ๋ผ์, ๊ฒฐ๊ณผ๋ 0์ด๋ค.
SELECT COUNT(value)
FROM prod.count_test;
์ด ์ง์์์๋ ์ปฌ๋ผ ๊ฐ์ COUNT์ ์ธ์๋ก ์คฌ๋ค.
์ด ๊ฒฝ์ฐ ์ปฌ๋ผ์ ๋ ์ฝ๋์์ NULL์ด ์๋ ๊ฒฝ์ฐ๋ง ์นด์ดํธํ๋ค.
๋ฐ๋ผ์, ๊ฒฐ๊ณผ๋ 6์ด๋ค.
SELECT COUNT(DISTINCT value)
FROM prod.count_test;
์ด ์ง์์์๋ DISTSINCT๋ฅผ ๋จผ์ ํ๊ณ ๊ทธ ๋ค์ COUNT๋ฅผ ํ๋ค.
DISTSINCT ๋ฅผ ์ํํ์ ๋ ๊ฒฐ๊ณผ๋ NULL, 1, 0, 4, 3 ์ด ๋๋ค.
๊ทธ ๋ค์ COUNT๋ฅผ ์ํํ๋ฉด NULL๊ฐ์ด ๋น ์ง 1, 0, 4, 3 ๋ ์ฝ๋๋ง ์นด์ดํธํ๋ค.
๋ฐ๋ผ์, ๊ฒฐ๊ณผ๋ 4์ด๋ค.
CASE
WHEN ์กฐ๊ฑด1 THEN ๊ฐ1
WHEN ์กฐ๊ฑด2 THEN ๊ฐ2
ELSE ๊ฐ3
END ํ๋์ด๋ฆ
CASE WHEN์ ํ๋๋ค์ ๊ฐ์ง๊ณ ์ ๋นํ ๊ธฐ์ค์ผ๋ก ์ ํ๋๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
WHEN์ ์ ์ด๋ ํ ๊ฐ ์ด์ ์์ด์ผ ํ๋ค.
CASE๋ก ์ด๊ณ END๋ก ๋ซ๋๋ค.
์์
SELECT channel_id, CASE
WHEN channel_id in (1, 5, 6) THEN 'Social-Media'
WHEN channel_id in (2, 4) THEN 'Search-Engine'
ELSE 'Something-Else'
END channel_type
FROM prod.session;
์ ์์ ๋
prod ๋ฐ์ดํฐ๋ฒ ์ด์ค์ session์ด๋ผ๋ ํ
์ด๋ธ์ channel_id๋ผ๋ ํ๋์์
channel_id๊ฐ 1, 5, 6์ด๋ฉด 'Social-Media'๋ผ๋ ๊ฐ์ ์ฌ์ฉํ๊ณ
channel_id๊ฐ 2, 4์ด๋ฉด 'Search-Engine'๋ผ๋ ๊ฐ์ ์ฌ์ฉํ๊ณ
์๋๋ฉด 'Something-Else'๋ผ๋ ๊ฐ์ ์ฌ์ฉํ๋ผ๋ ์ง์๊ฐ ๋๋ค.
์ ์ง์์ ๊ฒฐ๊ณผ๋ก ๋ ๊ฐ์ ํ๋๊ฐ ๋ํ๋๋ค.
int ํ์
์ channel_id์ Varcharํ์
์ channel_type์ด๋ค.
๊ฒฐ๊ณผ

WHERE๋ ์กฐ๊ฑด๋ฌธ์ด๋ค.
WHERE์์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์คํผ๋ ์ดํฐ๋ค์ด ์๋ค.
๋ค์ ์คํผ๋ ์ดํฐ๋ค์ CASE WHEN ์ฌ์ด์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
WHERE channel_id IN (1, 2)
-- ์ ์ฝ๋๋ ๋ค์๊ณผ ๋์ผํ๋ค.
WHERE channel_id = 1 OR channel_id = 2
channel_id๊ฐ 1์ด๋ 2์ธ ๋ ์ฝ๋๋ฅผ ์ถ๋ ฅํ๋ค.WHERE channel_id NOT IN (1, 2)
channel_id๊ฐ 1์ด๋ 2์ด ์๋ ๋ ์ฝ๋๋ฅผ ์ถ๋ ฅํ๋ค.WHERE channel LIKE 'A%' --'A*' channel์ด๋ฆ์ด A๋ก ์์ํ๋ ๋ชจ๋ ๋ ์ฝ๋
WHERE channel LIKE '%์%' --'*์*' channel์ด๋ฆ์ ์๊ฐ ๋ค์ด์๋ ๋ชจ๋ ๋ ์ฝ๋
WHERE channel NOT LIKE '%C%' --'*C*' channel์ด๋ฆ์ C๊ฐ ๋ค์ด์์ง ์์ ๋ชจ๋ ๋ ์ฝ๋
LIKE๋ ๋ฌธ์์ด ๋งค์นญ์ ํ ๋ ์ฌ์ฉ๋๋ ์ฐ์ฐ์ด๋ค.
๋์๋ฌธ์ ๊ตฌ๋ถ์ ํ์ง ์๋๋ค.
SELECT DISTINCT ํ๋์ด๋ฆ
FROM ํ
์ด๋ธ๋ช
BETWEEN ์ ๋ ์ง ๋ฒ์์ ์ฌ์ฉํ ์ ์๋ค.LEFT(str, N)
REPLACE(str, exp1, exp2)
UPPER(str)
LOWER(str)
LENGTH(str)
LPAD
RPAD
SUBSTRING --ํ๋๋ฅผ ๋ถ์ฌ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ ๋ค.
CONCAT
์์
SELECT
LENGTH(channel),
UPPER(channel),
LOWER(channel),
LEFT(channel, 4), -- ์์์๋ถํฐ 4๊ธ์๋ง ์ถ๋ ฅ
RPAD(channel, 15, '-') -- ์ค๋ฅธ์ชฝ์ ์ต๋ 15๊ธ์๊น์ง '-'๋ฅผ ํจ๋ฉํ๋ค
FROM channel;
์ถ๋ ฅ๊ฒฐ๊ณผ

ORDER BY๋ SELECT ๋ก ๊ฐ์ ธ์จ ๊ฐ์ ์์๋ฅผ ์ค๋ค.
ORDER BY ์ ๋ํดํธ ์์๋ ์ค๋ฆ์ฐจ์(ASC)์ด๋ค.
์ค๋ฆ์ฐจ์์ ๊ฐ์ฅ ์์ ๊ฐ์ด ๋จผ์ ๋์จ๋ค.
๋ง์ฝ TIMESTAMP ํ์
์ ํ๋๋ฅผ ์ค๋๋ ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ๋ค๋ฉด
์ค๋ฆ์ฐจ์(ASC)์ ์ฌ์ฉํด์ผ ํ๋ค.
๋ฐ๋๋ก ์ต์ ์์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ๋ค๋ฉด ๋ด๋ฆผ์ฐจ์(DESC)๋ฅผ ์ฌ์ฉํ๋ค.
ORDER BY 1 DESC, 2, 3;
SELECT๋ฌธ์์ ์ฌ์ฉ๋ ์ฒซ ๋ฒ์งธ ํ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ณ , ์์ 1
SELECT id, channel_id
FROM session
ORDER BY 1 DESC;
๊ฒฐ๊ณผ

์์ 2
SELECT id, channel_id
FROM session
ORDER BY 2 DESC;
๊ฒฐ๊ณผ

์์ 3
SELECT id, channel_id
FROM session
ORDER BY 2 DESC, 1;
๊ฒฐ๊ณผ

์์ 4
SELECT id, channel_id
FROM session
ORDER BY 2 DESC, 1 DESC;
๊ฒฐ๊ณผ

NULL
NULL๊ฐ์ ์ ๋ ฌ์ RDBMS๋ง๋ค ๋ค๋ฅด๋ค.
MySQL์ ๊ฒฝ์ฐ์๋
์ค๋ฆ์ฐจ์์ผ ๋ NULL๊ฐ์ด ์ฒ์์ ์์นํ๊ณ
๋ด๋ฆผ์ฐจ์์ผ ๋ NULL๊ฐ์ด ๋ง์ง๋ง์ ์์นํ๋ค.
GROUP BY๋ SELECT๋ ๋ ์ฝ๋๋ฅผ ํน์ ํ๋์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๊ณ ,
์ฌ๋ฌ ์ง๊ณํจ์ ์ฐ์ฐ์ ํ ์ ์๊ฒ ํด์ค๋ค.
ORDER BY์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ ์ด๋ฆ์ ์ฌ์ฉํ๊ฑฐ๋,
ํ๋ ์ผ๋ จ๋ฒํธ๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.
์ค์ต์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ๋ค
2๋ง๊ฐ์ ๋ ์ฝ๋๊ฐ ๋ค์ด์๋ sessionํ ์ด๋ธ๊ณผ channelํ ์ด๋ธ์ด๋ค.


SELECT
LEFT(created, 7) AS mon,
COUNT(1) AS session_count
FROM session
GROUP BY 1 -- GROUP BY mon, GROUP BY LEFT (created, 7)
ORDER BY 1;
LEFT()ํจ์๋ก createdํ๋์์ ์ฒ์ 7๊ธ์๋ง ๋ฝ์ mon์ด๋ผ๋ ์๋ก์ด ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ค.GROUP BY๋ก ์ธํด mon ํ๋์ ๊ฐ์ด ๊ฐ์ ๋ ์ฝ๋๋ค์ด ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ธ๋ค.ORDER BY๋ก SELECT ์ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.๊ฒฐ๊ณผ

์ฐ์ '๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋์๋ค'์ ๊ธฐ์ค์ ์ ํด์ผํ๋ค.
๋ ๊ฐ์ง ๊ธฐ์ค์ด ์์ ์ ์๋ค.
SELECT
channel_id,
COUNT(1) AS session_count,
COUNT(DISTINCT user_id) AS user_count
FROM session
GROUP BY 1 -- GROUP BY channel_id
ORDER BY 2 DESC; -- ORDER BY session_count DESC
SELECT๋ฌธ์์ COUNT()๋ฅผ ๋ ๋ฒ ํ๋ค.๊ฒฐ๊ณผ

๋ง์ผ DISTICT๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.

SELECT
user_id,
COUNT(1) AS session_count
FROM session
GROUP BY 1 -- GROUP BY user_id
ORDER BY 2 DESC -- ORDER BY count DESC
LIMIT 1;
๊ฒฐ๊ณผ

MAU(Monthly Active User)๋ ํธ๋ํฝ ์งํ์์ ๋งค์ฐ ์ค์ํ๋ค.
MAU์๋ ์๊ฐ์ ๋ณด, ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํ์ํ๋ค.
์๋ณ ์ธ์
์ ์ค์ต๊ณผ ๋น์ทํ์ง๋ง
์ด๋ฒ์๋ channel_id ๊ฐ ์๋ channel์ ์ด๋ฆ์ผ๋ก ๊ณ์ฐํด๋ณด๋ ์ค์ต์ ํ๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ ํ
์ด๋ธ์ JOIN ํด์ผํ๋ค.
SELECT
s.id, s.user_id, s.created, s.channel_id, c.channel
FROM session s
JOIN channel c ON c.id = s.channel_id;
์ ์ง์๋ INNER JOIN์ ์์๋ค.
์ ์ชฝ ํ
์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋๋ค์ด ์๋ ๊ฒฝ์ฐ์๋ง SELECT๊ฐ ๋๋ค(๊ต์งํฉ).
JOIN์ด๋ ์๋ก ๋ค๋ฅธ ํ
์ด๋ธ์ ์กด์ฌํ๋ ๋ ์ฝ๋๋ค์ ํน์ ์กฐ๊ฑด์ ๋ฐํ์ผ๋ก ๋ณํฉํ์ฌ
๋ ์์ ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ ์๋๋ก ํ๋ ์ฐ์ฐ์ด๋ค.
ON ๋ค์๋ ๋ณํฉ ์กฐ๊ฑด์ ์ค์ ํด์ค๋ค.
์ด์ ์๋ณ ์ฑ๋๋ณ ์ ๋ํฌํ ์ฌ์ฉ์ ์๋ฅผ ์์๋ณด์.
์์
SELECT
LEFT(s.created, 7) AS mon,
c.channel,
COUNT(DISTINCT user_id) AS MAU
FROM session s JOIN channel c ON s.channel_id = c.id
GROUP BY 1, 2
ORDER BY 1 DESC, 2;
์๋ณ, ์ฑ๋๋ณ์ด๊ธฐ ๋๋ฌธ์ GROUP BY๋ฅผ ๋ ๊ฐ์ ํ๋์ ์ ์ฉํ๋ค.
LEFT(s.created, 7)์ c.channel์ด ๊ฐ์ ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ๋ฅผ ํ๋๋ก ๋ฌถ๊ณ
๊ทธ ์์์ ์ค๋ณต๋์ง ์๋ user_id๋ง ์นด์ดํธํด์ MAU๋ผ๋ ํ๋๋ก ๋ง๋ ๋ค.
์ต์ข
๊ฒฐ๊ณผ๋ฅผ mon๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ํ๊ณ ,
์ค๋ณต๋๋ ๊ฒฝ์ฐ c.channel์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
์ฆ, ์ต์ ์๋ถํฐ ์ ๋ ฌ๋๋ฉด์ ์ฑ๋์ด๋ฆ์ ABC์์ผ๋ก ์ ๋ ฌํ๊ฒ ๋๋ค.
(+)์ฃผ์ํ ์
COUNT์ ๋์์ ์ ์ดํดํ์. ๋ง์ผ DISTINCT๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ทธ๋ฅ user_id๋ง ์นด์ดํธํ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ์ฌ์ฉ์ ์๊ฐ ์๋๋ผ session์ ์๋ฅผ ์นด์ดํธํ ๊ฒ์ด ๋๋ค.
๊ฒฐ๊ณผ

๊ฒฐ๊ณผ2 (DINSTINCT๋ฅผ ํ์ง์์์ ๋)
