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;
22번) 가장 많은 앨범을 가진 아티스트를 조회하세요.
출력예시
| SQL_Artists.Artist_ID | SQL_Artists.Name | COUNT(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
);
30문제 과제를 수행하면서... 그래도 힌트 없이 마지막까지 풀어냈다ㅎ... 아직 정답인지 아닌지 모르지만... 아직도 SQL을 완전히 이해하려면 한~참 멀었지만~ 그래도 조금은 나아졌다는 것에 뿌듯함을 느낀 하루!
파이썬 완강~