내배캠 23회차

포도당·2025년 5월 22일
0

문제 (30개)

  1. 모든 아티스트의 이름을 조회하세요.
    출력예시
    ----
    
    Name
    
    ----
    
    BTS

답 : select name
from SQL_Artists sa

  1. K-Pop 장르의 Genre_ID를 조회하세요.
    출력예시
    --------------------------
    
    Genre_ID | SQL_Genres.Name
    
    ---------------------------
    
    1 | BTS

답 :
select genre_ID
from SQL_Genres sg

  1. 앨범 발매 연도가 2020년 이후인 앨범의 제목과 연도를 조회하세요.
    출력예시
    ------------
    
    Title | Year
    
    ------------
    
    Dynamite | 2023

    select *
    from SQL_Albums
    where Year >'2020';
  2. 트랙 길이가 240초 이상인 트랙의 제목과 길이를 조회하세요.
    출력예시
    --------------
    
    Title | Length
    
    --------------
    
    Dynamite | 250

    select*
    from SQL_Tracks
    where Length>=240;
  3. 중복을 제거한 장르명을 모두 조회하세요.
    출력예시
    ----
    
    Name
    
    ----
    
    BTS

    select DISTINCT Name, genre_ID
    from SQL_Genres sg;
  4. 각 장르별로 몇 개의 트랙이 있는지 조회하세요.
    출력예시
    -------------------------------------
    
    Genre_ID | SQL_Genres.Name | COUNT(*)
    
    -------------------------------------
    
    1 | BTS | 값

select st.Genre_ID,
sg.Name as 'SQL_Genres.Name',
count()
from SQL_Tracks st
INNER JOIN SQL_Genres sg on st.Genre_ID = sg.Genre_ID
group by st.Genre_ID;
근데 저 카운트아스타가 이해가안됨 왜 아스타를 쓰는지
1. 아스타를 쓰는 이유는 장르별 row값을 새는거 널이 있는지는 중요치않음
2. 여기서 null값은 장르가 미지정된 곡
3. 그럼 장르아이디 값이 널인지 부터 찾아보자
4. SELECT COUNT(
) AS null_genre_count
FROM SQL_Tracks
WHERE Genre_ID IS NULL;
결과 0 그럼 널 값은 없으므로
카운트로 새도괜찮음.

  1. 각 아티스트가 보유한 앨범 개수를 조회하세요.
    출력예시
    ---------------------------------------
    
    Artist_ID | SQL_Artists.Name | COUNT(*)
    
    ---------------------------------------
    
    1 | BTS | 값

select sat.Artist_ID, sat.Name as 'SQL_artists.Name' , count(*)
from SQL_Albums sab
INNER JOIN SQL_Artists sat on sab.Artist_ID = sat.artist_ID
group by sat.Artist_id, sat.Name;

  1. 2020년 이전에 발매된 앨범의 수를 조회하세요.
    출력예시
    --------
    
    COUNT(*)
    
    --------
    
    값

select count(Year)
from SQL_Albums
where Year<2020
group by Year
;

  1. 트랙 제목에 '1'이 포함된 트랙을 모두 조회하세요.
    출력예시
    -----
    
    Title
    
    -----
    
    Dynamite

select Title
from SQL_Tracks st
where Title Like'%1%';
10. 리뷰 평점이 5점인 앨범 리뷰를 모두 조회하세요.
출력예시

-------------------------------------------------------------------------------

Reviewer_ID | SQL_Reviewers.Reviewer_ID | Album_ID | SQL_Albums.Title | Ranking

-------------------------------------------------------------------------------

101 | 101 | 202 | Dynamite | 5

select Reviewer_ID, Ranking,Album_ID
from SQL_Album_Reviews
where Ranking = 5;
11. 각 리뷰어가 작성한 리뷰 수를 조회하세요.
출력예시

--------------------------------------------------

Reviewer_ID | SQL_Reviewers.Reviewer_ID | COUNT(*)

--------------------------------------------------

101 | 101 | 값

select Reviewer_ID,count(*)
from SQL_Album_Reviews
group by Reviewer_ID
;

  1. 각 앨범의 평균 평점을 조회하세요.
    출력예시
    ------------------------------------------
    
    Album_ID | SQL_Albums.Title | AVG(Ranking)
    
    ------------------------------------------
    
    202 | Dynamite | 5

select Album_ID,
avg(Ranking)
from SQL_Album_Reviews
group by Album_ID
ORDER by album_ID
;
13. 각 트랙의 제목과 해당 장르명을 함께 조회하세요.
출력예시

----------------------------------

SQL_Tracks.Title | SQL_Genres.Name

----------------------------------

Dynamite | BTS

select st.Title as 'SQL_Tracks.Title',
sg.Name as 'SQL_GENRES.Name'
from SQL_Tracks st
INNER JOIN SQL_Genres sg on st.Genre_ID = sg.Genre_ID
;

  1. 각 앨범에 몇 개의 트랙이 있는지 조회하세요.
    출력예시
    --------------------------------------------------------------------
    
    SQL_Albums.Album_ID | SQL_Albums.Title | COUNT(SQL_Tracks.Track_Num)
    
    --------------------------------------------------------------------
    
    202 | Dynamite | 3

select
sa.Album_ID as 'SQL_albums.sa.Album_ID',
st.Title,
count(*)
from SQL_Albums sa
INNER JOIN SQL_Tracks st on sa.Album_ID = st.Album_ID
group by sa.album_ID;
15. 트랙 수가 5개 이상인 앨범을 조회하세요.
출력예시

--------------------------------------

SQL_Albums.Album_ID | SQL_Albums.Title

--------------------------------------

202 | Dynamite

select
sa.Album_ID as 'SQL_albums.Album_ID',
st.Title as 'SQL_Albums.Title',
count() as 'COUNT(SQL_Tracks.Track_Num)'
from SQL_Albums sa
INNER JOIN SQL_Tracks st on sa.Album_ID = st.Album_ID
group by sa.album_ID
having COUNT(
) >= 5
;

  1. NULL이 아닌 리뷰 코멘트만 조회하세요.
    출력예시
    -------------------------
    
    SQL_Album_Reviews.Comment
    
    -------------------------
    
    Amazing album!

select comment as 'SQL_Album_Reviews.Comment'
from SQL_Album_Reviews
where comment is not null;

  1. 앨범 리뷰에서 평점이 NULL이면 0으로 대체하여 조회하세요.
    출력예시
    --------------------------------------------------------------------------------
    
    SQL_Album_Reviews.Reviewer_ID | SQL_Reviewers.Reviewer_ID | SQL_Album_Reviews.Album_ID | SQL_Albums.Title | COALESCE(SQL_Album_Reviews.Ranking, 0)
    
    --------------------------------------------------------------------------------
    
    101 | 101 | 202 | Dynamite | 5

select sa.Reviewer_ID as 'SQL_Album_Reviews.Reviewer_ID',
sa.Album_ID as 'SQL_Album_Reviews.Album_ID',
sa.Comment,
st.title as 'QL_Albums.Title',
case
when sa.Ranking is null then '0'
else sa.ranking
end as RAnking
from SQL_Album_Reviews sa
INNER JOIN SQL_Tracks st on sa.album_ID = st.Album_ID

  1. 앨범 리뷰의 작성일이 올해인 경우만 조회하세요.
    출력예시
    --------------------------------------------------------------------------------
    
    SQL_Album_Reviews.Reviewer_ID | SQL_Reviewers.Reviewer_ID | SQL_Album_Reviews.Review_Date
    
    --------------------------------------------------------------------------------
    
    101 | 101 | 2024-05-21

select *
from SQL_Album_Reviews
where Year(Review_Date) = YEAR(CURDATE());

  1. 리뷰 작성일이 없는 데이터(리뷰 날짜가 NULL)를 조회하세요.
    출력예시
    --------------------------------------------------------------------------------
    
    SQL_Album_Reviews.Reviewer_ID | SQL_Reviewers.Reviewer_ID | SQL_Album_Reviews.Album_ID | SQL_Albums.Title
    
    --------------------------------------------------------------------------------
    
    101 | 101 | 202 | Dynamite
    select *
    from SQL_Album_Reviews
    where Year(Review_Date) IS NOT NULL;
  2. 리뷰가 없는 앨범을 조회하세요.
    출력예시
    --------------------------------------
    SQL_Albums.Album_ID | SQL_Albums.Title
    
    --------------------------------------
    
    202 | Dynamite

select sa.Album_ID as 'SQL_Albums.Album_ID',
sa.Title as 'SQL_Albums.Title'
from SQL_Albums sa
LEFT JOIN SQL_Album_Reviews sr on sa.Album_ID = sr.Album_ID
where sr.Album_ID IS NULL;

  1. 리뷰가 가장 많은 앨범을 조회하세요.
    출력예시
    --------------------------------------------------------
    
    SQL_Album_Reviews.Album_ID | SQL_Albums.Title | COUNT(*)
    
    --------------------------------------------------------
    
    202 | Dynamite | 값

select ar.album_ID as'SQL_Album_Reviews.Album_ID',
sa.Title as 'SQL_Albums.Title',
COUNT()
from SQL_Album_Reviews ar
Inner JOIN SQL_Albums sa on ar.Album_ID = sa.Album_ID
group by ar.Album_ID
order by count(
) DESC
limit 1
;

  1. 가장 많은 앨범을 가진 아티스트를 조회하세요.
    출력예시
    --------------------------------------------------------------------------------
    
    SQL_Artists.Artist_ID | SQL_Artists.Name | COUNT(SQL_Albums.Album_ID) | SQL_Albums.Title
    
    --------------------------------------------------------------------------------
    
    1 | BTS | 202 | Dynamite

select sa.artist_ID as 'SQL_Artists.Artist_ID',
name as 'SQL_Artists.Name',
count() as 'COUNT(SQL_Albums.Album_ID)'
from SQL_Albums sa
INNER JOIN SQL_Artists ad on ad.artist_ID = sa.artist_ID
group by ad.artist_ID
order by count(
) DESC
limit 1;

  1. 트랙 평균 길이가 가장 긴 장르를 조회하세요.
    출력예시
    --------------------------------------------------------------
    
    SQL_Genres.Genre_ID | SQL_Genres.Name | AVG(SQL_Tracks.Length)
    
    --------------------------------------------------------------
    
    1 | BTS | 250

select st.genre_id as 'SQL_Genres.Genre_ID',
Name as 'SQL_Genres.Name',
avg(length) as 'AVG(SQL_Tracks.Length)'
from SQL_Tracks st
inner join SQL_Genres sg on st.Genre_ID = sg.Genre_ID
group by st.genre_id
order by avg(length)DESC
limit 1
;

  1. 앨범 평균 평점이 4.5 이상인 앨범을 조회하세요.
    출력예시
    -----------------------------------------------------------------------
    
    SQL_Albums.Album_ID | SQL_Albums.Title | AVG(SQL_Album_Reviews.Ranking)
    
    -----------------------------------------------------------------------
    
    202 | Dynamite | 5

select ar.Album_ID as 'SQL_Albums.Album_ID',
sa.Title as 'SQL_Albums.Title',
AVG(Ranking) as 'SQL_Album_Reviews.Ranking'
from SQL_Album_Reviews ar
inner join SQL_Albums sa on ar.album_ID = sa.album_ID
group by ar.Album_ID,sa.title
having AVG(Ranking) >= 4.5
;

  1. 각 아티스트의 앨범 평균 발매연도를 조회하세요.
    출력예시
    ---------------------------------------------------------------
    
    SQL_Artists.Artist_ID | SQL_Artists.Name | AVG(SQL_Albums.Year)
    
    ---------------------------------------------------------------
    
    1 | BTS | 2023

select sa.Artist_ID as 'SQL_ARTISTS.ARTIST_ID',
sat.Name as 'SQL_Artists.Name',
AVG(sa.Year) as 'SQL_Albums.Year'
from SQL_Albums sa
INNER JOIN SQL_Artists sat on sa.Artist_ID=sat.Artist_ID
group by sa.Artist_ID

  1. 각 장르별 트랙 총 길이를 조회하세요.
    출력예시
    --------------------------------------------------------------
    
    SQL_Tracks.Genre_ID | SQL_Genres.Name | SUM(SQL_Tracks.Length)
    
    --------------------------------------------------------------
    
    1 | BTS | 250
    select st.Genre_ID as 'SQL_Tracks.Genre_ID',
    sg.Name as 'SQL_GENRES.Naame',
    SUM(st.LENGTH) as 'SQL_Tracks.Length'
    from SQL_Tracks st
    inner join SQL_Genres sg on st.Genre_ID = sg.Genre_ID
    group by st.genre_ID
    ;
  2. 각 앨범의 평균 트랙 길이를 조회하세요.
    출력예시
    ---------------------------------------------------------------
    
    SQL_Albums.Album_ID | SQL_Albums.Title | AVG(SQL_Tracks.Length)
    
    ---------------------------------------------------------------
    
    202 | Dynamite | 250

select st.Album_ID as 'SQL_Albums.Album_ID',
st.Title as 'SQL_Albums.Title',
avg(length) as 'AVG(SQL_Tracks.Length)'
from SQL_Tracks st
group by st.Album_ID;

  1. 리뷰 작성자가 등록한 앨범별 평점 합계를 조회하세요.
    출력예시
    --------------------------------------------------------------------------------
    
    SQL_Album_Reviews.Reviewer_ID | SQL_Reviewers.Reviewer_ID | SQL_Albums.Album_ID | SQL_Albums.Title | SUM(SQL_Album_Reviews.Ranking)
    
    --------------------------------------------------------------------------------
    
    101 | 101 | 202 | Dynamite | 5
    select ar.Reviewer_ID as 'SQL_Album_Reviews.Reviewer_ID' ,
    ar.Album_ID as 'SQL_Albums.Album_ID',
    sa.Title as 'SQL_Albums.Title',
    SUM(ar.Ranking)
    from SQL_Album_Reviews ar
    inner join SQL_Albums sa on ar.Album_ID = sa.Album_ID
    group by ar.Reviewer_ID, ar.album_ID,sa.title
    order by ar.album_ID ASC;
  2. 2020년~2025년 사이 작성된 리뷰 코멘트 수가 2개 이상인 앨범을 조회하세요.
    출력예시
    ---------------------------------------------
    
    SQL_Album_Reviews.Album_ID | SQL_Albums.Title
    
    ---------------------------------------------
    
    202 | Dynamite
    #29. 2020년~2025년 사이 작성된 리뷰 코멘트 수가 2개 이상인 앨범을 조회하세요.
    SELECT ar.Album_ID AS 'SQL_Albums.Album_ID',
    sa.Title AS 'SQL_Albums.Title',
    COUNT(ar.Comment) AS 'SQL_Album_Reviews.Comment_Count'
    FROM SQL_Album_Reviews ar
    INNER JOIN SQL_Albums sa ON ar.Album_ID = sa.Album_ID
    WHERE YEAR(ar.Review_Date) BETWEEN 2020 AND 2025
    GROUP BY ar.Album_ID, sa.Title
    HAVING COUNT(ar.Comment) >= 2;

SELECT a.Album_ID, a.Title
FROM (
SELECT a.Album_ID, a.Title,
count(r.comment) as cnt_c
FROM SQL_Album_Reviews r inner join SQL_Albums a on r.Album_ID = a.Album_ID
WHERE r.Review_Date between '2020-01-01' and '2025-12-31'
GROUP BY 1, 2
HAVING cnt_c >= 2
) a
30. 각 아티스트의 앨범 수와 총 트랙 수를 함께 조회하세요.
출력예시

--------------------------------------------------------------------------------

SQL_Artists.Artist_ID | SQL_Artists.Name | COUNT(DISTINCT SQL_Albums.Album_ID) | SQL_Albums.Title | COUNT(SQL_Tracks.Track_Num)

--------------------------------------------------------------------------------

1 | BTS | 202 | Dynamite | 3

select sar.artist_ID as 'sql_artists.Artist_ID',
sar.Name as 'SQL_Artists.Name',
count(DISTINCT st.Album_ID) as 'SQL_Albums.Album_ID',
st.TITLE as 'SQL_Albums.Title',
COUNT(Track_Num) as 'COUNT(SQL_Tracks.Track_Num)'
from SQL_Artists sar
join SQL_Albums sa on sar.Artist_ID = sa.Artist_ID
join SQL_Tracks st on st.Album_ID = sa.Album_ID
group by sar.artist_ID, sar.Name, st.title

집계함수 컬럼에 조건을 주고 싶으면 having!!!!

ex) having AVG(Ranking) >= 4.5

profile
어디까지 성장할 것 인가..!

0개의 댓글