2022. 12. 24. 21:11ใDatabase/DB ์คํฐ๋
1. ํ์ต ์ ๋ฆฌ
MySql ์กฐ๊ฑด๋ฌธ (IF, CASE)
์ด๋ฒ ์ฃผ์ฐจ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์ฌ์ฉ๋ ํจ์๋ค ์ค '์ด๋ ๊ฒ ํ๋ฉด ๋๊ฒ ์ง..?' ๋ผ๊ณ ์๊ฐํ๊ณ ์จ๋ดค๋๋ฐ ์ค์ ๋ก ์๋์ ์ํด์ ์ ๊ธฐํ๋ ํจ์๊ฐ ๋ฐ๋ก IF() ํจ์์ด๋ค. ๋ฐ๋ผ์ ์ด์ ๋ํด ํ์คํ๊ฒ ์๊ธฐ ์ํด ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ คํ๋ค.
IF()
IF ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋๋ค.
SELECT
IF(์กฐ๊ฑด, ์ฐธ์ผ ๋, ๊ฑฐ์ง์ผ ๋)
FROM TABLE
๋ณด๋ฉด ์๊ฒ ์ง๋ง ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค์์ ์ฌ์ฉ๋๋ ์ผํญ์ฐ์ฐ์์ ๋น์ทํ๋ค. ๋ํ IF ํจ์๋ฅผ ์ค์ฒฉํ์ฌ ์ฌ๋ฌ ๋ถ๊ธฐ์ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ๋ค. ๋ค๋ง ๊ทธ์ ๊ฐ์ด ์ฌ์ฉํ ์ ๊ฐ๋ ์ฑ์ด ์ฌ๊ฐํ๊ฒ ์์ข์์ง๋ค. ๋ฐ๋ผ์ ์ฌ๋ฌ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ ์๋์ CASE ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
CASE
CASE ๋ฌธ์ ์๋์ ๊ฐ์ด ์ฌ์ฉ๋๋ค.
SELECT
CASE
WHEN ์กฐ๊ฑด1 THEN ์กฐ๊ฑด1์ด ์ฐธ์ผ ๋
WHEN ์กฐ๊ฑด2 THEN ์กฐ๊ฑด2์ด ์ฐธ์ผ ๋
ELSE ์์ ์กฐ๊ฑด์ด ๋ชจ๋ ์๋ฐฐ๋ ๋
END
FROM TABLE
CASE ๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒ์ด WHEN, ELSE, END์ธ๋ฐ, WHEN๊ณผ ELSE๋ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํจ์ด๊ณ , END๋ CASE ๋ฌธ์ด ๋๋ฌ์์ ์๋ฆฌ๋ ์ญํ ์ด๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ ์ด๋ ต์ง ์๊ฒ ํํํ ์ ์๋ค.
2. ๋ฌธ์ ํ์ด
์ด๋ฒ ์ฃผ์ฐจ์๋ ํ๋ก๊ทธ๋๋จธ์ค์ SQL ๊ณ ๋์ kit ์ค ์๋์ ์ฑํฐ๋ค์ ๋ชจ๋ ํ์๋ค.
- ISNULL
- JOIN
- String, Date
์ด 23๋ฌธ์ ์ด๊ณ ๋ฌธ์ ์ ๋์ด๋๋ ํธ์ฐจ๊ฐ ํฐ ํธ์ด๋ผ์ ๋ชจ๋ ๋ฌธ์ ์ ํ์ด๋ฅผ ์ฌ๋ฆด ์๋ ์๊ณ ๊ฐ์ธ์ ์ผ๋ก ์ด๋ ค์ ๋ ๋ฌธ์ ๋ฅผ ์์ฃผ๋ก ์์ฑํ๋ค.
์ํ์ ๊ตฌ๋งคํ ํ์ ๋น์จ ๊ตฌํ๊ธฐ
๋ฌธ์
๋ถ์
์ด ๋ฌธ์ ๋ ํ๋ก๊ทธ๋๋จธ์ค์ ํ์น ์์ 5๋จ๊ณ ๋ฌธ์ ์ด๋ค. ONLINE_SALE ํ ์ด๋ธ๊ณผ USER_INFO ํ ์ด๋ธ์์ ์ ๋ณด๋ฅผ ์ถ์ถํด์ผ๋๊ธฐ ๋๋ฌธ์ ์ผ๋จ JOIN์ ํด์ผ๋๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ , ์ถ๋ ฅ์ ๋ , ์ ๋ณ๋ก ํด์ผ๋๊ธฐ ๋๋ฌธ์ GROUP BY๋ ํด์ฃผ์๋ค. ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๊ฐ์ฅ ๋ฌธ์ ๊ฐ ๋์๋ ๋ถ๋ถ์ ๋น์จ ๊ณ์ฐ์ ์ํด ํ์ํ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ ์ฒด ํ์ ์์๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌํด์ผํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ, ๊ทธ๋ฆฌ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์๋๊ฑฐ ๊ฐ์ง๋ง ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค. ๋ง์ง๋ง์ผ๋ก ๊ด๋ฌธ์ ๋ฐ์ฌ๋ฆผ์ฒ๋ฆฌ์ธ๋ฐ, ์ด๋ ๋ค๋ฅธ ์ธ์ด์ ์กด์ฌํ๋ round() ํจ์๊ฐ ์์ ๊ฒ ๊ฐ์ ์ฌ์ฉํด๋ณด์๋๋ ์์๋๋ก ์๋ํด์ฃผ์ด์ ์ด๋ฅผ ์ฌ์ฉํ๋ค.
ํ์ด
SELECT
year(sales_date) AS year,
month(sales_date) AS month,
count(distinct sale.user_id) AS puchased_users,
round(
count(distinct sale.user_id)/(
SELECT count(user_id) FROM user_info WHERE year(joined)=2021
),
1
) AS puchased_ratio
FROM user_info AS info
JOIN online_sale AS sale
ON info.user_id = sale.user_id
WHERE year(info.joined)=2021
GROUP BY year, month
ORDER BY year ASC, month ASC
๊ทธ๋ฃน๋ณ ์กฐ๊ฑด์ ๋ง๋ ์๋น ๋ชฉ๋ก ์ถ๋ ฅํ๊ธฐ
๋ฌธ์
๋ถ์
๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์์ฑํ ํ์์ ์ ๋ณด๋ฅผ ๋จผ์ ๋ฝ์๋ด๊ณ ์ด๋ฅผ ๋ฐํ์ผ๋ก ํด๋น ํ์์ด ์์ฑํ ๋ฆฌ๋ทฐ๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์๋ค. ๋จผ์ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์์ฑํ ํ์์ LIMIT ์กฐ๊ฑด์ด ์ถ๊ฐ๋ ์๋ธ ์ฟผ๋ฆฌ๋ก ์ป์ ์ ์๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ , ํด๋น ํ์์ด ์์ฑํ ๋ฆฌ๋ทฐ๋ ์์ ์๋ธ์ฟผ๋ฆฌ์ ๋ฆฌ๋ทฐ ํ ์ด๋ธ๊ณผ์ ์กฐ์ธ์ ํตํด ํ์ ์ง์ ์ ์๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
ํ์ด
SELECT
tmp.member_name,
r.review_text,
date_format(r.review_date,'%Y-%m-%d') AS review_date
FROM rest_review AS r
JOIN (
SELECT m.member_id, m.member_name, count(r.review_id) AS cnt
FROM rest_review AS r
JOIN member_profile AS m
ON r.member_id = m.member_id
GROUP BY m.member_id
ORDER BY cnt DESC LIMIT 1
) AS tmp
ON r.member_id = tmp.member_id
ORDER BY review_date ASC, review_text ASC
์ทจ์๋์ง ์์ ์ง๋ฃ ์์ฝ ์กฐํํ๊ธฐ
๋ฌธ์
๋ถ์
์๋ฌด๋๋ ํ ์ด๋ธ์ด 3๊ฐ๊ณ ๋ชจ๋ ํ ์ด๋ธ์ ํ์ฉํด์ผํ๋ ๋ฌธ์ ์๊ธฐ ๋๋ฌธ์ JOIN์ 2๋ฒํ๋ค. ๊ทธ ์ดํ์๋ ๋ฑํ ์ด๋ ค์ธ ๊ฒ์ด ์์ด์ ์ 4๋จ๊ณ ๋ฌธ์ ์ธ์ง ๊ฐธ์ํ๋ค. ํ๊ฐ์ง ์ข ์ ๋งคํ๋ ์ ์ date() ํจ์๋ฅผ ์ด์ฉํ์ฌ ๋น๊ต ์ ๋ฌธ์์ด '2022-04-13'์ผ๋ก ๋น๊ต๋ฅผ ํด๋ ๋น๊ต๊ฐ ๋๋์ง ์ ๋งคํ๋๋ฐ ๋คํํ ์๋์๋ค...!
ํ์ด
SELECT ap.apnt_no, pt.pt_name, pt.pt_no, ap.mcdp_cd, dr.dr_name, ap.apnt_ymd
FROM appointment as ap
JOIN patient as pt
ON ap.pt_no = pt.pt_no
JOIN doctor as dr
ON ap.mddr_id = dr.dr_id
WHERE
date(ap.apnt_ymd) = '2022-04-13' AND
ap.mcdp_cd = 'CS' AND
ap.apnt_cncl_yn = 'N'
ORDER BY ap.apnt_ymd ASC
'Database > DB ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DB ์คํ๊ณํ ํ์ธ๋ฒ(in PostgreSQL) (1) | 2023.11.11 |
---|---|
RDB vs NoSQL (0) | 2023.02.18 |
ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค (0) | 2023.02.17 |
SQL Injection ๊ณต๊ฒฉ๊ณผ ๋์ (0) | 2023.02.11 |
์๋ฃ๊ตฌ์กฐ in DB ์ธ๋ฑ์ค (0) | 2023.02.11 |