퍼포먼스 마케터 부트캠프 2주 4일차 (참여 6일차)

MIN BAEK·2025년 5월 22일
0

1. 오늘 학습 키워드

with

2. 학습한 내용&학습하며 겪었던 문제점&오늘의 인사이트

✅WITH절 기본 구조

WITH 가상테이블이름 AS (
원하는 서브쿼리
)
SELECT * FROM 가상테이블이름;

📌 비유해서 말하면

WITH는 마치 한 번 계산한 값을 변수처럼 저장하는 것

예를 들어, 요리할 때 야채 손질(WITH) 먼저 해두고
그걸 메인 요리(SELECT)에 넣어 쓰는!

with절 예시
with albumcounts as (select bum.artist_id,
art.name,
count(album_id) as album_cnt
from SQL_Albums bum join SQL_Artists art on bum.artist_id=art.artist_id
group by 1),
maxalbumcount as(select album_cnt, max(album_cnt) from albumcounts)
select artist_id, name, a.album_cnt
from albumcounts a
join maxalbumcount m on a.album_cnt=m.album_cnt;

왜 with을 알아봤냐면...

22번) 가장 많은 앨범을 가진 아티스트를 조회하세요.
출력예시

SQL_Artists.Artist_IDSQL_Artists.NameCOUNT(SQL_Albums.Album_ID)

처음에 푼 방식
SELECT bum.artist_id,
art.name,
count(album_id) album_cnt
from SQL_Albums bum join SQL_Artists art on bum.artist_id=art.artist_id
group by bum.artist_id
order by album_cnt desc
limit 1;

이렇게 풀었더니, 가장 많은 앨범을 가진 아티스트가 겹칠 경우, 다 보여주고 싶은데 값이 1개 밖에 안나옴...

두번째 접근방식(서브쿼리+조인 방식)
SELECT ar.Artist_ID,
ar.Name,
COUNT(al.Album_ID) AS album_cnt
FROM SQL_Albums al
JOIN SQL_Artists ar ON al.Artist_ID = ar.Artist_ID
GROUP BY ar.Artist_ID, ar.Name
HAVING COUNT(al.Album_ID) = (
SELECT MAX(album_count)
FROM (
SELECT COUNT(*) AS album_count
FROM SQL_Albums
GROUP BY Artist_ID
) sub
);

여기서 의문... 더 쉽게 풀수는 없을까? 이런 상황일 때 알맞은 함수는?🧐

📍길래 튜터님의 답변

1) with 방식

  • 가독성이 좋고 여러 번 재사용할 때 유리합니다.
  • 복잡한 집계나 로직을 분리해서 보기 쉽게 만들 수 있습니다.
  • 특히 서브쿼리를 반복해서 참조할 경우 성능이나 유지보수 측면에서 장점이 큽니다.
  • 모든 DBMS에서 잘 작동합니다.
  • 거의 유일한 단점은 자주 사용하는 기본 쿼리가 아니라서 기억하기 어렵고 사용법을 매번 다시 찾아봐야 할 수 있다는 단점이 있습니다.

2) 서브쿼리+조인 방식

  • 이 방식은 HAVING + 서브쿼리를 활용해서, 최대값과 같은 값을 가진 아티스트만 필터링합니다.
  • WITH 없이도 유연하게 작성 가능하며, 다중 MAX 매칭에 적합합니다.

30문제 과제를 수행하면서... 그래도 힌트 없이 마지막까지 풀어냈다ㅎ... 아직 정답인지 아닌지 모르지만... 아직도 SQL을 완전히 이해하려면 한~참 멀었지만~ 그래도 조금은 나아졌다는 것에 뿌듯함을 느낀 하루!

3. 내일 학습 할 일 정리

파이썬 완강~

profile
안녕하세요 백민입니다:)

0개의 댓글