๋ณธ ํฌ์คํ ์ ํ๋ก๊ทธ๋๋จธ์ค ๋ฏธ๋ ๋ฐ๋ธ ์ฝ์ค๋ฅผ ๊ณต๋ถํ๋ฉฐ
ํ์ต์ ๊ธฐ๋กํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์์ฑ๋ ๊ธ์ ๋๋ค.
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๋ฅผ ํ์ง์์์ ๋)