๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ํ๋ ์ธ์ด์ด๋ฉฐ, ๋ฐ์ดํฐ๋ฆฌ๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ๋ ๋ฑ์ ๋ฐ์ดํฐ์ ์ ์ฒด์ ๊ณจ๊ฒฉ์ ๊ฒฐ์ ํ๋ ์ญํ ์ ํ๋ ์ธ์ด์ด๋ค.
| ์ข ๋ฅ | ์ญํ |
|---|---|
| CREATE | ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ ์ด๋ธ๋ฑ์ ์์ฑํ๋ ์ญํ ์ ํฉ๋๋ค. |
| ALTER | ํ ์ด๋ธ์ ์์ ํ๋ ์ญํ ์ ํฉ๋๋ค. |
| DROP | ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ ์ด๋ธ์ ์ญ์ ํ๋ ์ญํ ์ ํฉ๋๋ค. |
| TRUNCATE | ํ ์ด๋ธ์ ์ด๊ธฐํ ์ํค๋ ์ญํ ์ ํฉ๋๋ค. |
์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ ฅ๋ ๋ ์ฝ๋๋ฅผ ์กฐํํ๊ฑฐ๋ ์์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ๋ฑ์ ์ญํ ์ ํ๋ ์ธ์ด๋ฅผ ๋งํ๋ค.
| ์ข ๋ฅ | ์ญํ |
|---|---|
| SELECT | ๋ฐ์ดํฐ ์กฐํ ๊ธฐ๋ฅ |
| INSERT | ๋ฐ์ดํฐ ์ถ๊ฐ ๊ธฐ๋ฅ |
| UPDATE | ๋ฐ์ดํฐ ์์ ๊ธฐ๋ฅ |
| DELETE | ๋ฐ์ดํฐ ์ญ์ ๊ธฐ๋ฅ |
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ฑฐ๋ ๊ฐ์ฒด์ ๊ถํ์ ์ฃผ๋๋ฑ์ ์ญํ ์ ํ๋ ์ธ์ด๋ฅผ ๋งํ๋ค.
| ์ข ๋ฅ | ์ญํ |
|---|---|
| GRANT | ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์์๊ฒ ํน์ ์์ ์ ๋ํ ์ํ๊ถํ ๋ถ์ฌ ํ๋ค. |
| REVOKE | ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์์๊ฒ ํน์ ์์ ์ ๋ํ ์ํ ๊ถํ์ ๋ฐํ, ํ์ ํ๋ค. |
| COMMIT | ํธ๋์ญ์ ์ ์์ DB์ ๋ฐ์ํ๋ ์ญํ ์ ํ๋ค. |
| ROLLBACK | ํธ๋์ญ์ ์ ์์ ์ ์ทจ์ ๋ฐ ์๋๋ ๋ณต๊ตฌํ๋ ์ญํ ์ ํ๋ค. |
| ์ปฌ๋ผ | ํ์ | ์์ฑ |
|---|---|---|
| id | int | NOT NULL AUTO_INCREMENT PRIMARY KEY |
| user_id | int | NOT NULL |
| created | timestamp | NOT NULL DEFAULT CURRENT_TIMESTAMP |
| channel_id | int | NOT NULL FOREIGN KEY |
| ์ปฌ๋ผ | ํ์ | ์์ฑ |
|---|---|---|
| id | int | NOT NULL AUTO_INCREMENT PRIMARY KEY |
| channel | varchar(32) | NOT NULL |
SHOW DATABASE; -- ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชฉ๋ก์ ๋ณด์ฌ์ค๋ค.
USE PROD; -- ํด๋น ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค.
SHOW TABLES; -- ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ ๋ชฉ๋ก์ ๋ณด์ฌ์ค๋ค.
ํ ์ด๋ธ์์ ๋ ์ฝ๋๋ค(ํน์ ๋ ์ฝ๋์)์ ์ฝ์ด์ค๋๋ฐ ์ฌ์ฉํ๋ค.
WHERE๋ฅผ ์ฌ์ฉํด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ ์ฝ๋
SELECT ํ๋์ด๋ฆ1, ํ๋์ด๋ฆ2, โฆ
FROM ํ
์ด๋ธ์ด๋ฆ
WHERE ์ ํ์กฐ๊ฑด
GROUP BY ํ๋์ด๋ฆ1, ํ๋์ด๋ฆ2, ...
ORDER BY ํ๋์ด๋ฆ [ASC|DESC] -- ํ๋ ์ด๋ฆ ๋์ ์ ์ซ์ ์ฌ์ฉ ๊ฐ๋ฅ
LIMIT N;
select * -- *๋ ๋ชจ๋ ํ๋๋ฅผ ์ง์นญํ๋ ํํ
from prod.session; -- ์์ USE prod;๋ฅผ ์ํํ๋ค๋ฉด FROM session๋ ์ฌ์ฉ ๊ฐ๋ฅ
SELECT id, user_id, channel_id -- 3๊ฐ์ ์ปฌ๋ผ๊ฐ๋ค์ ๊ฐ์ ธ์จ๋ค.
FROM prod.session;
SELECT *
FROM prod.session
LIMIT 10; -- Limit ๋ฅผ ์ฐ๊ฒ๋๋ฉด N๊ฐ ๋งํผ๋ง ์ถ๋ ฅํ๋ค.
SELECT DISTINCT channel_id -- ์ ์ผํ ์ฑ๋ ID๋ฅผ ์๊ณ ์ถ์ ๊ฒฝ์ฐ
FROM prod.session;
SELECT COUNT(1) -- ํ
์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋ ์ ์นด์ดํธ. COUNT(*). ํ๋์ ๋ ์ฝ๋
FROM prod.session;
SELECT * -- channel ํ
์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ค์ ํ์
FROM prod.channel;
-- ์ฑ๋์ด 1, 5์ธ ์ฑ๋๋ง์ ๋ฌถ์ด์ ์ถ๋ ฅ
select channel_id, COUNT(1)
from prod.session
where channel_id = 5 or channel_id = 1
group by channel_id;
-- ์ฑ๋ ID๋ณ๋ก ๊ฐฏ์์ type์ ์ ์ํ๊ณ ๋ฌถ์๋ค์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅ
select channel_id, COUNT(1),
CASE
when channel_id in (1,5,6) then 'Social-Media'
when channel_id in (2,4) then 'Search-Engine'
else 'Something-Engine'
END channel_type
from prod.session
group by channel_id
order by count(1); -- 1์ ์ฌ๊ธฐ์ channel_id๋ฅผ ์๋ฏธํ๋ค. + ์ค๋ฆ์ฐจ์
๊ฐ์ด ์กด์ฌํ์ง ์์์ ๋ํ๋ด๋ ์์. 0 ํน์ ""๊ณผ๋ ๋ค๋ฆ
- ํ๋ ์ง์ ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ NULL๋ก ์ง์ ๊ฐ๋ฅ
- ํ ์ด๋ธ ์ ์์ ๋ํดํธ ๊ฐ์ผ๋ก๋ ์ง์ ๊ฐ๋ฅ
- ์ด๋ค ํ๋์ ๊ฐ์ด NULL์ธ์ง ์๋์ง ๋น๊ต๋ ํน์ํ ๋ฌธ๋ฒ์ ํ์๋ก ํจ
- field1 is NULL ํน์ field1 is not NULL
- NULL์ด ์ฌ์น์ฐ์ฐ์ ์ฌ์ฉ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋?
- SELECT 0 + NULL, 0 - NULL, 0 * NULL, 0/NULL
ํท๊ฐ๋ฆฌ๋ count ํจ์ ์์
๊ทธ๋ฃน(aggregate) ํจ์์ ํด๋นํ๋ค.
- ์์ ํ ์ด๋ธ
| value |
|---|
| NULL |
| 1 |
| 1 |
| 0 |
| 0 |
| 4 |
| 3 |
SELECT COUNT(1) FROM prod.count_test;
-- ์ ๋ต : 7๊ฐ (null ๊ฐ์ ํฌํจํ๋ค.)
SELECT COUNT(0) FROM prod.count_test;
-- ์ ๋ต : 7๊ฐ (null ๊ฐ์ ํฌํจํ๋ค.)
SELECT COUNT(NULL) FROM prod.count_test;
-- ์ ๋ต : 0๊ฐ (null์ด๋ฉด count๋ฅผ ํ์ง ์๋๋ค.)
SELECT COUNT(value) FROM prod.count_test;
-- ์ ๋ต : 6๊ฐ (ํ๋๊ฐ์ ๋ฃ์ผ๋ฉด null๊ฐ์ ์ ์ธํ๊ณ count ํ๋ค.)
SELECT COUNT(DISTINCT value) FROM prod.count_test;
-- ์ ๋ต : 4๊ฐ (์ค๋ณต ๊ฐ ์ ์ธ + null๊ฐ ์ ์ธ)
-- where ์กฐ๊ฑด
select count(1)
from prod.channel
where channel like 'G%'; -- G๋ก ์์ํ๋ channel๋ง
select channel
from prod.channel
where channel not like '%o%'; -- o๋ผ๋ ๋ฌธ์๊ฐ ํฌํจํ์ง ์๋ channel
-- String ํจ์๋ฅผ ์จ๋ณด์
select
length(channel), -- ๊ธธ์ด
upper(channel), -- ๋๋ฌธ์ ๋ณํ
lower(channel), -- ์๋ฌธ์ ๋ณํ
left(channel,4), -- ์ผ์ชฝ๋ถํฐ 4๊ฐ๋ง ์ถ๋ ฅ
rpad(channel,15,'-') --15์๋ฆฌ ์ค ๋น์นธ์ ์ค๋ฅธ์ชฝ์ - ๋ก ์ฑ์
from prod.channel
order by length(channel); -- ๊ธธ์ด๋ก ์ค๋ฆ์ฐจ์
-- Date ํจ์ ์จ๋ณด๊ธฐ
select
created, convert_tz(created, 'GMT','Asia/Seoul') seoul_time,
year(created) y, quarter(created) q, month(created) m, monthname(created) mnn,
date(created) d, hour(created) h, minute(created), second(created) s
from prod.session
limit 10;
select created,
datediff(now(), created) gap_in_days,
date_add(created, interval 10 day) ten_days_after_created
from prod.session
limit 10;
select str_to_date('11,8,2021', '%d,%m,%y');
-- ๋ฌธ์์ด ํ ๋ณํ
SELECT cast('100.0' as float), convert('100.0', float);
-- 100, 100 ์ ์ถ๋ ฅํ๋ค.
GROUP BY ์ ์ ์ ํ๋ ๋ ์ฝ๋์ ์งํฉ์ ํ๋์ ๊ฐ์ด๋ ํํ์์ ์ํด ๊ทธ๋ฃนํํ ๊ฒฐ๊ณผ ์งํฉ์ ๋ฐํํฉ๋๋ค.
์ฆ, GROUP BY ์ ์ ํ๋์ ๊ทธ๋ฃน์ ํ๋์ ๋ ์ฝ๋๋ก ๋ฐํํ๋ฏ๋ก, ๊ฒฐ๊ณผ ์งํฉ์ ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
-- ์๋ณ ์ธ์
์๋ฅผ ๊ณ์ฐ
select
left(created,7) mon,
count(1) as session_count
from prod.session
group by 1 -- mon์ผ๋ก group
order by 1; -- mon์ผ๋ก ASC
-- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋ ์ฑ๋์ ๋ฌด์์ธ๊ฐ?
select
channel_id,
count(1) as session_count,
count(distinct user_id) as user_count
from prod.session
group by 1
order by 2 desc;
-- ๊ฐ์ฅ ๋ง์ ์ธ์
์ ๋ง๋ค์ด๋ธ ์ฌ์ฉ์ ID๋ ๋ฌด์์ธ๊ฐ?
select
user_id,
count(1) as user_count
from prod.session
group by 1
order by 2 desc
limit 1;
-- ์๋ณ ์ ๋ํฌํ ์ฌ์ฉ์ ์
select
left(created, 7) as mon,
count(distinct user_id) as user_count
from prod.session
group by 1
order by 1;
-- session ์์ด๋๋ณ, ์ฌ์ฉ์๋ณ ํต๊ณ
select s.id, s.user_id, s.created, s.channel_id, c.channel
from prod.session s
join prod.channel c on c.id = s.channel_id;
GROUP BY 1, 2
ORDER BY 1 DESC, 2;
-- ์๋ณ, ์ฑ๋๋ณ ์ ๋ํฌํ ์ฌ์ฉ์ ์
select
left(s.created, 7) as mon,
c.channel,
count(distinct s.user_id) as mau
from prod.session s
join prod.channel c on c.id = s.channel_id
group by 1,2
order by 1 desc, 2;