DB ์Šคํ„ฐ๋””(4์ฃผ์ฐจ)

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