[머신 러닝] 2-9&10 Merge & Adv. techniques(2) - GROUP BY & HAVING & SUBQUERY

혯응·2024년 9월 9일

Grouping data (GROUP BY & HAVING)

1. COUNT

script = """
SELECT
    albumid,
    COUNT(trackid) AS Count   
                  -- 조회(SELECT)의 대상이 되는 항목에 대해 바로 집계함수를 적용할 수 있습니다.
FROM
    tracks
GROUP BY
    albumid
ORDER BY 
    COUNT(trackid) DESC;   -- 앨범마다 속한 총 트랙의 수를 기준으로 하여 내림차순 정렬 (많은 곡이 수록된 앨범일수록 위로)
""" 

df = pd.read_sql_query(script, conn)
df.head() 

동일한 앨범 ID를 갖고 있는 모든 곡(track)들의 수를 카운트(COUNT)


script = """
SELECT
    albumid,
    COUNT(trackid)
FROM
    tracks
GROUP BY
    albumid
HAVING             -- ~~~을 가지고 있는(having)
    albumid = 1;  
""" 

HAVING은 반드시 앞에 GROUP BY가 있어야 합니다 (WHERE 와의 차이점)

2. SUM

script = """
SELECT
    albumid,
    SUM(tracks.milliseconds) AS length,    -- (앨범에 속한 모든) 곡의 길이
    SUM(tracks.bytes) AS size              -- (앨범에 속한 모든) 곡의 용량
FROM
    tracks
GROUP BY
    albumid;
""" 

합계 계산



3. AVG , MIN , MAX

script = """
SELECT
    tracks.albumid,
    albums.title,
    MIN(tracks.milliseconds),           -- 앨범에 속한 곡들 중 가장 짧은(MIN) 곡의 길이
    MAX(tracks.milliseconds),           -- 앨범에 속한 곡들 중 가장 긴(MAX) 곡의 길이
    ROUND(AVG(tracks.milliseconds), 2)  -- 앨범에 속한 곡들의 길이를 평균(AVG)한 다음 소수점 둘째(2) 자리까지만 나타나도록 반올림(ROUND)
                                        -- ROUND(X, n)에서 [n번째 자리에서 반올림]이 아니라 [n번째 자리까지 표시]라는 점에 유의 
FROM
    tracks
INNER JOIN albums ON albums.albumid = tracks.albumid
GROUP BY
    tracks.albumid;
""" 






Subquery

script = """
-- Let There Be Rock 라는 제목을 가진 앨범의 수록곡을 모두 확인하고자 함

SELECT trackid,
       name,
       albumid
FROM tracks
WHERE albumid = (                    
   SELECT albumid
   FROM albums
   WHERE title = 'Let There Be Rock'
);
""" 
profile
감자 개발자

0개의 댓글