1~10번 문제
-- 1.모든 아티스트 이름 조회
SELECT
DISTINCT name
FROM SQL_Artists
;
-- 2.K-pop 장르의 Genre_ID를 조회 > 다시 간단히 생각해보기
SELECT
Genre_ID
, Name
FROM SQL_Genres
WHERE Name = 'K-pop'
;
-- 3.앨범 발매 연도가 2020년 이후인 앨범의 제목과 연도를 조회
SELECT
Title
,Year
FROM SQL_Albums
WHERE Year >= 2020
;
-- 4.트랙 길이가 240초 이상인 트랙의 제목과 길이를 조회
SELECT
Title
,Length
FROM SQL_Tracks
WHERE Length >= 240
;
-- 5.중복을 제거한 장르명을 모두 조회
SELECT
DISTINCT Name
FROM SQL_Genres
;
-- 6.각 장르별로 몇 개의 트랙이 있는지 조회
SELECT
sg.Genre_ID
,sg.name
,COUNT(*)
FROM SQL_Genres sg
INNER JOIN SQL_Tracks st
ON sg.Genre_ID = st.Genre_ID
GROUP BY sg.Genre_ID
ORDER BY sg.Genre_ID
;
-- 7.각 아티스트가 보유한 앨범 개수를 조회
SELECT
sa.Artist_ID
,sa.Name
,COUNT(*)
FROM SQL_Artists sa
INNER JOIN SQL_Albums sa2
ON sa.Artist_ID = sa2.Artist_ID
GROUP BY sa.Artist_ID
;
-- 8.2020년 이전에 발매된 앨범의 수를 조회
SELECT
COUNT(*)
FROM SQL_Albums
WHERE year <= 2020
;
-- 9.트랙 제목에 '1'이 포함된 트랙을 모두 조회
SELECT
Title
FROM SQL_Tracks
WHERE Title LIKE '%1%'
;
-- 10.리뷰 평점이 5점인 앨범 리뷰를 모두 조회
SELECT
sr.Reviewer_ID
,sar.Reviewer_ID
,sa.Album_ID
,sa.Title
,Ranking
FROM SQL_Albums sa
INNER JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
INNER JOIN SQL_Reviewers sr
ON sr.Reviewer_ID = sar.Reviewer_ID
WHERE Ranking = 5
GROUP BY sr.Reviewer_ID
;
SQL
복사
11~20번 문제
-- 11.각 리뷰어가 작성한 리뷰 수를 조회
SELECT
sr.Reviewer_ID
,sar.Reviewer_ID
,COUNT(*)
FROM SQL_Reviewers sr
INNER JOIN SQL_Album_Reviews sar
ON sr.Reviewer_ID = sar.Reviewer_ID
GROUP BY sar.Reviewer_ID
;
-- 12.각 앨범의 평균 평점을 조회하세요.
SELECT
sar.Album_id
,sa.Title
,ROUND(AVG(Ranking),1)
FROM SQL_Albums sa
INNER JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
GROUP BY sar.Album_ID, sa.Title
;
-- 13.각 트랙의 제목과 해당 장르명을 함께 조회
SELECT
st.title
,sg.Name
FROM SQL_Genres sg
INNER JOIN SQL_Tracks st
ON sg.Genre_ID = st.Genre_ID
;
-- 14.각 앨범에 몇 개의 트랙이 있는지 조회
SELECT
sa.Album_ID
,sa.Title
,COUNT(st.Track_Num)
FROM SQL_Albums sa
INNER JOIN SQL_Tracks st
ON sa.Album_ID = st.Album_ID
GROUP BY sa.Album_ID, sa.Title
;
-- 15.트랙 수가 5개 이상인 앨범을 조회
SELECT
sa.Album_ID
,sa.Title
,COUNT(st.Track_Num) AS cnttn
FROM SQL_Albums sa
INNER JOIN SQL_Tracks st
ON sa.Album_ID = st.Album_ID
GROUP BY sa.Album_ID, sa.Title
HAVING COUNT(st.Track_Num) >= 5
;
-- 16. NULL이 아닌 리뷰 코멘트만 조회
SELECT Comment
FROM SQL_Album_Reviews
WHERE Comment IS NOT NULL
;
-- 17. 앨범 리뷰에서 평점이 NULL이면 0으로 대체하여 조회
SELECT
sar.Reviewer_ID
,sr.Reviewer_ID
,sar.Album_ID
,sa.Title
,COALESCE(sar.Ranking,0) AS csar_r
FROM SQL_Reviewers sr
LEFT JOIN SQL_Album_Reviews sar
ON sr.Reviewer_ID = sar.Reviewer_ID
LEFT JOIN SQL_Albums sa
ON sa.Album_ID = sar.Album_ID
GROUP BY Album_ID
;
-- 17. 팀원들이랑 같이 수정한 쿼리
SELECT
sar.Reviewer_ID
,sr.Reviewer_ID
,sar.Album_ID
,sa.Title
,COALESCE(sar.Ranking,0) AS csar_r
FROM SQL_Albums sa
LEFT JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
LEFT JOIN SQL_Reviewers sr
ON sar.Reviewer_ID = sr.Reviewer_ID
;
-- 18.앨범 리뷰의 작성일이 올해인 경우만 조회 > 다시풀기
SELECT
sr.Reviewer_ID
,sar.Reviewer_ID
,sar.Review_Date
FROM SQL_Reviewers sr
INNER JOIN SQL_Album_Reviews sar
ON sr.Reviewer_ID = sar.Reviewer_ID
WHERE sar.Review_Date LIKE '2025%'
;
-- 19.리뷰 작성일이 없는 데이터(리뷰 날짜가 NULL)를 조회
SELECT
sar.Reviewer_ID
,sr.Reviewer_ID
,sar.Album_ID
,sa.Title
FROM SQL_Albums sa
LEFT JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
LEFT JOIN SQL_Reviewers sr
ON sar.Reviewer_ID = sr.Reviewer_ID
WHERE Review_Date IS null
;
-- 20.리뷰가 없는 앨범을 조회
SELECT
sa.Album_ID
,sa.Title
FROM SQL_Albums sa
LEFT JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
WHERE sar.Comment IS null
;
SQL
복사
21~30번 문제
-- 21.리뷰가 가장 많은 앨범을 조회
SELECT
sar.Album_ID
,sa.Title
,COUNT(*) AS cnt_review
FROM SQL_Albums sa
INNER JOIN SQL_Album_Reviews sar
ON sa.Album_ID =sar.Album_ID
GROUP BY sar.Album_ID, sa.Title
ORDER BY cnt_review DESC
LIMIT 1
;
-- 22.가장 많은 앨범을 가진 아티스트를 조회
SELECT
sa.Artist_ID
,sa.Name
,COUNT(sa2.Album_ID) AS cnt_album
FROM SQL_Artists sa
INNER JOIN SQL_Albums sa2
ON sa.Artist_ID = sa2.Artist_ID
GROUP BY sa.Artist_ID, sa.Name
ORDER BY cnt_album DESC
LIMIT 1
;
-- max값을 구하는 테이블을 하나 만들어서 변동값이 생겨도 대처할 수 있게 만든다.
-- 23. 트랙 평균 길이가 가장 긴 장르
SELECT
sg.Genre_ID
,sg.Name
,ROUND(AVG(st.Length),1) AS avg_len
FROM SQL_Genres sg
INNER JOIN SQL_Tracks st
ON sg.Genre_ID = st.Genre_ID
GROUP BY sg.Genre_ID, sg.Name
ORDER BY avg_len DESC
LIMIT 1
;
-- 24. 앨범 평균 평점이 4.5 이상인 앨범을 조회
SELECT
sa.Album_ID
,sa.Title
,AVG(sar.Ranking) AS avg_r
FROM SQL_Albums sa
INNER JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
GROUP BY sa.Album_ID, sa.Title
HAVING avg_r >= 4.5
;
-- 25. 각 아티스트의 앨범 평균 발매연도 조회
SELECT
sa.Artist_ID
,sa.Name
,ROUND(AVG(sa2.Year),0) AS avg_y
FROM SQL_Artists sa
INNER JOIN SQL_Albums sa2
ON sa.Artist_ID =sa2.Artist_ID
GROUP BY sa.Artist_ID, sa.Name
;
-- 26. 각 장르별 트랙 총 길이를 조회
SELECT
sg.Genre_ID
,sg.Name
,SUM(st.Length) AS sum_len
FROM SQL_Genres sg
INNER JOIN SQL_Tracks st
ON sg.Genre_ID = st.Album_ID
GROUP BY sg.Genre_ID, sg.Name
;
-- 27. 각 앨범의 평균 트랙 길이를 조회
SELECT
sg.Genre_ID
,sg.Name
,ROUND(AVG(st.Length),1) AS avg_len
FROM SQL_Genres sg
INNER JOIN SQL_Tracks st
ON sg.Genre_ID = st.Album_ID
GROUP BY sg.Genre_ID, sg.Name
;
-- 28. 리뷰 작성자가 등록한 앨범별 평점 합계를 조회
SELECT
sar.Reviewer_Id
,sa.Album_ID
,sa.Title
,SUM(sar.Ranking) AS sum_r
FROM SQL_Albums sa
LEFT JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
INNER JOIN SQL_Reviewers sr
ON sr.Reviewer_ID = sar.Reviewer_ID
GROUP BY sa.Album_ID
;
-- 29.2020년~2025년 사이 작성된 리뷰 코멘트 수가 2개 이상인 앨범을 조회
SELECT
sa.Album_ID
,sa.title
FROM SQL_Albums sa
INNER JOIN SQL_Album_Reviews sar
ON sa.Album_ID = sar.Album_ID
WHERE sar.Review_Date BETWEEN '2020-01-01' AND '2025-12-31'
GROUP BY sa.Album_ID, sa.Title
HAVING COUNT(sar.Comment) >= 2
;
-- 30. 각 아티스트의 앨범 수와 총 트랙 수를 함께 조회
SELECT
sa.Artist_ID
,sa.name
,COUNT(DISTINCT sa2.Album_ID) AS cnt_ai
,sa2.Title
,COUNT(st.Track_Num) AS cnt_tn
FROM SQL_Artists sa
INNER JOIN SQL_Albums sa2
ON sa.Artist_ID = sa2.Artist_ID
INNER JOIN SQL_Tracks st
ON sa2.Album_ID = st.Album_ID
GROUP BY sa.Artist_ID,sa.Name
;
SQL
복사