12 Fri

๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ๊ณ ๊ธ‰ SQL

์„œ๋ธŒ์ฟผ๋ฆฌ

  • ์ฟผ๋ฆฌ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ์ฟผ๋ฆฌ

  • SELECT, FROM, WHERE์ ˆ์— ๋‹ค ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    • SELECT๋Š” ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ

FROM์ ˆ ์„œ๋ธŒ์ฟผ๋ฆฌ

SELECT daily_stats.week, AVG(daily_stats.incidents_daily)
FROM (
    SELECT week, date, COUNT(incident_id) AS Incidents_daily
    FROM crimes
    GROUP BY week, data
    ) daily_stats
GROUP BY daily_stats.week
  • ๊ฐ ์ฃผ์™€ ๋‚ ์งœ ๋ณ„๋กœ ๋ฒ”์ฃ„ ๋ฐœ์ƒ์„ ์ •๋ฆฌํ•œ ํ…Œ์ด๋ธ”์ด ์กด์žฌํ•œ๋‹ค.

  • ์ฃผ์™€ ๋‚ ์งœ๋กœ ์ •๋ฆฌํ•œ ํ…Œ์ด๋ธ”์—์„œ ๋‹ค์‹œ ๋‚ ์งœ ๋ณ„๋กœ ๋ฒ”์ฃ„ ๋ฐœ์ƒ ๊ฑด์ˆ˜๋ฅผ ๋ณด๋Š” ์ฟผ๋ฆฌ์ด๋‹ค.

  • ์ด ๋•Œ ํ•˜๋ฃจ ํ‰๊ท  ๋ฒ”์ฃ„ ๋ฐœ์ƒ ๊ฑด์ˆ˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด AVG๋ฅผ ์ป์ง€๋งŒ, ํŠน์ • ๋‚ ์งœ์— ๋Œ€ํ•œ ๋ฒ”์ฃ„ ๋ฐœ์ƒ์ด ์—†์„ ๊ฒฝ์šฐ ์ด๋ฅผ 0์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ NULL ๋ฐ์ดํ„ฐ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‰๊ท ์„ ๊ตฌํ•  ๋•Œ ์ด๋ฅผ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

    • EX) 1+ 2+ 3+0/4 ์ด ์•„๋‹Œ 1+2+3/3 ์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์˜

WHERE์ ˆ ์„œ๋ธŒ์ฟผ๋ฆฌ

SELECT *
FROM Crimes
WHERE date = (SELECT MIN(date) FROM Crimes)

SELECT *
FROM Crimes
WHERE date IN (SELECT date FROM Crimes
    ORDER BY date DESC LIMIT 5)
  • 1~3 : date๊ฐ€ = ๋กœ ๋น„๊ต๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์„œ๋ธŒ ์ฟผ๋ฆฌ๋ฌธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

  • 5~8 : 5๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ค๋ฏ€๋กœ IN ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์Šต

  • MIN(date) : ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋‚ ์งœ, MAX(date) : ๊ฐ€์žฅ ์ตœ์‹  ๋‚ ์งœ

HackerRank TopEarners

select salary * months, count(*)
from employee
where salary * months =
    (select max(salary * months) from employee )
group by salary * months

๋˜๋Š” having ์ ˆ์„ ์ด์šฉํ•ด์„œ

select salary * months as earnings, count(*)
from employee
group by earnings
having earnings =
    (select max(salary * months) from employee)

HackerRank Challenges

select h.hacker_id, h.name, count(*) cnt
from hackers as h
    inner join challenges as c on h.hacker_id = c.hacker_id
group by h.hacker_id, h.name
having cnt = (select max(cnt)
            from (
                select hacker_id, count(*) cnt
                from challenges
                group by hacker_id ) sub)
    or cnt in (select cnt
            from (
                select hacker_id, count(*) cnt
                from challenges
                group by hacker_id ) sub
            group by cnt
            having count(*) = 1)
order by cnt desc, h.hacker_id

With

  • ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค. ์žฌ์‚ฌ์šฉ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ•์œผ๋กœ With ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

WITH Counter AS(
    SELECT h.hacker_id, h.name, count(*) cnt
    FROM hackers AS h
    INNER JOIN challenges AS c ON h.hacker_id = c.hacker_id
    GROUP BY h.hacker_id, h.name
)

SELECT Counter.hacker_id, Counter.name, Counter.cnt
FROM Counter
WHERE cnt = (SELECT MAX(cnt) From Counter)
OR cnt IN (SELECT cnt
            FROM Counter
            GROUP BY cnt
            HAVING COUNT(*) = 1)
ORDER BY Counter.cnt DESC, Counter.hacker_id

BETWEEN์„ ์กฐ์ธ์กฐ๊ฑด์œผ๋กœ ์“ฐ๊ธฐ

HackerRank The Report

select
    case when g.grade < 8 then null
    else s.name end as name,
    g.grade, s.marks
from students as s
    inner join grades as g on s.marks between g.min_mark and g.max_mark
order by g.grade desc, name, s.marks

2๊ฐœ ์ด์ƒ ์…€ํ”„์กฐ์ธํ•˜๊ธฐ

LeetCode 180

# Write your MySQL query statement below
select distinct l.num as ConsecutiveNums
from logs as l
    inner join logs as l_next on l.id + 1 = l_next.id
    inner join logs as l_nnext on l.id + 2 = l_nnext.id
where l.num = l_next.num and l.num = l_nnext.num

Last updated

Was this helpful?