4. 과제1
4. 과제(23. 10. 20)
https://github.com/gikpreet/class-relational_database/blob/main/Module%2006%20SQL/01_introduction.adoc
DatamotionMovieDatabase에서, 아래 질의들을 SQL Query 식으로 작성후 Query를 제출해주세요
1. 영화 ‘퍼스트 맨’의 제작 연도, 영문 제목, 러닝 타임, 플롯을 출력하세요.
1
2
3
select ReleaseYear, Title, RunningTime, plot
from movie
where KoreanTitle = "퍼스트 맨";
2. 2003년에 개봉한 영화의 한글 제목과 영문 제목을 출력하세요
1
2
3
select Title, KoreanTitle
from movie
where ReleaseYear = 2003;
3. 영화 ‘글래디에이터’의 작곡가를 고르세요
1
2
3
4
5
6
7
8
9
10
SELECT Name
from person
where personID in (select personID
from appear
where MovieID in ( select MovieID
from movie
where koreanTitle = '글래디에이터') and roleID in (select roleID
from role
where RolekorName = '작곡'
));
4. 영화 ‘매트릭스’ 의 감독이 몇명인지 출력하세요
1
2
3
4
5
6
7
8
9
10
SELECT count(Name)
from person
where personID in (select personID
from appear
where MovieID in ( select MovieID
from movie
where koreanTitle = '매트릭스') and roleID in (select roleID
from role
where RolekorName = '감독'
));
5. 감독이 2명 이상인 영화를 출력하세요
1
2
3
4
5
6
7
8
9
select title
from movie
where MovieID in (select movieid
from appear
where RoleID in (select roleID
from Role
where RoleKorName = '감독')
group by(MovieID)
having count(movieid) >= 2);
6. ‘한스 짐머’가 참여한 영화 중 아카데미를 수상한 영화를 출력하세요
1
2
3
4
5
6
7
8
9
select koreantitle
from movie
where movieid in (select movieid
from appear
where personid = (SELECT personid FROM DatamotionMovieDatabase.person where koreanname = '한스 짐머'))
and
movieid in (select movieid
from appear
where appearid in (SELECT distinct(appearid) FROM DatamotionMovieDatabase.awardinvolve))
7. 감독이 ‘제임스 카메론’이고 ‘아놀드 슈워제네거’가 출연한 영화를 출력하세요
1
2
3
4
5
6
7
8
9
select Title
from movie
where movieid in (select movieid
from appear
where (personid in (SELECT personid FROM DatamotionMovieDatabase.person where koreanname = '제임스 카메론')) and (roleID in (select roleID from role where RolekorName = '감독')))
and
movieid in (select movieid
from appear
where personid in ((SELECT personid FROM DatamotionMovieDatabase.person where koreanname = '아놀드 슈워제네거')) and (roleID in (select roleID from role where RolekorName = '배우')));
8. 상영시간이 100분 이상인 영화 중 레오나르도 디카프리오가 출연한 영화를 고르시오
1
2
3
4
5
select Title
from movie
where RunningTime > 100 and movieid in (select movieid
from appear
where (personid in (SELECT personid FROM DatamotionMovieDatabase.person where koreanname = '레오나르도 디카프리오')));
9. 청소년 관람불가 등급의 영화 중 가장 많은 수익을 얻은 영화를 고르시오
1
2
3
select koreantitle
from movie
where BoxOfficeUSGross + BoxOfficeWWGross = (select MAX(BoxOfficeUSGross + BoxOfficeWWGross) from movie where GradeInKoreaID = 4 );
10. 1999년 이전에 제작된 영화의 수익 평균을 고르시오
1
2
3
select avg(BoxOfficeUSGross + BoxOfficeWWGross)
from movie
where releaseYear <= 1999;
11. 가장 많은 제작비가 투입된 영화를 고르시오.
1
2
select max(Budget)
from movie;
12. 제작한 영화의 제작비 총합이 가장 높은 감독은 누구입니까?
1
2
3
4
5
6
7
select Name
from person
where personid =
(select a.personid
from movie as m join appear as a on m.MovieID = a.MovieID
where a.roleid = 2
group by PersonID limit 1)
13. 출연한 영화의 모든 수익을 합하여, 총 수입이 가장 많은 배우를 출력하세요.
1
2
3
4
5
6
7
select koreanname
from person
where personid = (select a.personid, m.BoxOfficeWWGross + m.BoxOfficeUSGross
from appear as a
join movie as m on a.movieid = m.movieid
order by (m.BoxOfficeWWGross + m.BoxOfficeUSGross) desc
limit 1);
14. 제작비가 가장 적게 투입된 영화의 수익을 고르세요. (제작비가 0인 영화는 제외합니다)
1
2
3
4
5
select koreantitle
from movie
where budget = ( select MIN(Budget)
from movie
where budget != 0);
15. 제작비가 5000만 달러 이하인 영화의 미국내 평균 수익을 고르세요
1
2
3
select avg(BoxOfficeUSGross)
from movie
where Budget <= 50000000
16. 액션 장르 영화의 평균 수익을 고르세요
1
2
3
4
5
select avg(BoxOfficeWWGross + BoxOfficeUSGross)
from movie
where MovieID in (select MovieID
from moviegenre
where genreID in (select GenreID from genre where genreName = 'action'));
17. 드라마, 전쟁 장르의 영화를 고르세요.
1
2
3
4
5
6
7
select title
from movie
where MovieID in (select MovieID
from moviegenre
where genreID in( (select GenreID from genre where genreName = 'Drama'))
or
(select GenreId from genre where genreName = 'war'));
**18. 톰 행크스가 출연한 영화 중 상영 시간이 가장 긴 영화의 제목, 한글제목, 개봉연도를 출력하세요.
- 아카데미 남우주연상을 가장 많이 수상한 배우를 고르시오**
1
2
3
4
5
6
7
8
select p.koreanname
from person p
join appear a on p.personid = a.personid
join awardinvolve as award on a.appearid = award.appearid
join sector as s on award.sectorid = s.SectorID
where s.SectorKorName = '남우주연상' and award.WinningID = 2
GROUP BY p.koreanname
ORDER BY count(p.koreanname) DESC;
20. 아카데미상을 가장 많이 수상한 영화인을 고르시오 (‘수상자 없음’이 이름인 영화인은 제외합니다)
1
2
3
4
5
6
7
8
9
10
11
select p.koreanname
from person as p join appear as a on p.personid = a.personid
join awardinvolve as award on a.AppearID = award.appearid
where a.roleid in (select r.roleid
from role as r
where roleid = 6 or roleid = 7)
and
award.WinningID = 2
group by p.koreanname
order by count(p.koreanname) desc
limit 1;
21. 아카데미 남우주연상을 2번 이상 수상한 배우를 고르시오
1
2
3
4
5
6
7
8
select p.koreanname
from person p
join appear a on p.personid = a.personid
join awardinvolve as award on a.appearid = award.appearid
join sector as s on award.sectorid = s.SectorID
where s.SectorKorName = '남우주연상' and award.WinningID = 2
GROUP BY p.koreanname
having count(p.KoreanName) >= 2;
23. 아카데미상을 가장 많이 수상한 사람을 고르세요.
1
2
3
4
5
6
7
8
select p.koreanname
from person as p join appear as a on p.personid = a.personid
join awardinvolve as award on a.AppearID = award.appearid
where
award.WinningID = 2
group by p.koreanname
order by count(p.koreanname) desc
limit 1 offset 1;
24. 아카데미상에 가장 많이 노미네이트 된 영화를 고르세요.
1
2
3
4
5
6
7
8
9
10
select m.Title
from movie as m join appear as a on m.movieid = a.movieid
join awardinvolve as award on a.AppearID = award.appearid
where award.SectorID in (select SectorID
from sector
where SectorKorName Like '%영화%')
and
award.WinningID = 1
group by m.title
order by count(m.Title) desc
25. 가장 많은 영화에 출연한 여배우를 고르세요.
1
2
3
4
5
6
7
select p.koreanname,count(p.personid)
from appear as a
join person as p on p.personid = a.PersonID
where a.roleid = ( select roleid from role where rolename = 'actress' )
group by p.personid, p.koreanname
order by count(p.personid) desc
limit 1;
26. 수익이 가장 높은 영화 TOP 10을 출력하세요.
1
2
3
4
select koreantitle
from movie
order by BoxOfficeWWGross + BoxOfficeUSGross desc
limit 10;
27. 수익이 10억불 이상인 영화중 제작비가 1억불 이하인 영화를 고르시오.
1
2
3
4
select koreantitle
from movie
where BoxOfficeWWGross + BoxOfficeUSGross > 1000000000
and budget < 100000000
28. 전쟁 영화를 가장 많이 감독한 사람을 고르세요.
1
2
3
4
5
6
7
8
9
select p.koreanname
from person as p
join appear as a on p.personid = a.personid
where a.roleid in (select roleid from role where rolename = 'director')
and
a.movieid in (select movieid from moviegenre where genreid in (select genreid from genre where genrename = 'war'))
group by p.koreanname, p.personid
order by count(p.personid) desc
limit 1;
29. 드라마에 가장 많이 출연한 사람을 고르세요.
1
2
3
4
5
6
7
8
9
10
SELECT p.KoreanName ,g.GenreKorName, COUNT(*) AS cnt
FROM person p
JOIN appear a ON a.PersonID = p.PersonID
JOIN movie m ON m.MovieID = a.MovieID
JOIN moviegenre mg ON mg.MovieID = m.MovieID
JOIN genre g ON g.GenreID = mg.GenreID
WHERE g.GenreKorName = '드라마' AND NOT p.KoreanName = '수상자 없음'
GROUP BY p.PersonID
ORDER BY COUNT(*) DESC
LIMIT 1;
30. 드라마 장르에 출연했지만 호러 영화에 한번도 출연하지 않은 사람을 고르세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
select distinct p.personid, p.koreanname
from person as p
join appear as a on p.personid = a.personid
where a.roleid in (select roleid from role where rolekorname = '배우')
and
a.movieid in (select movieid from moviegenre where genreid in (select genreid from genre where genrename = 'drama'))
and
a.personid not in ( select p.personid
from person as p
join appear as a on p.personid = a.personid
where a.roleid in (select roleid from role where rolekorname = '배우')
and
a.movieid in (select movieid from moviegenre where genreid in (select genreid from genre where genrename = 'horror')));
31. 아카데미 영화제가 가장 많이 열린 장소는 어디인가요?
1
2
3
4
5
select location
from awardyear
group by Location
order by count(location) desc
limit 1;
33. 첫 번째 아카데미 영화제가 열린지 올해 기준으로 몇년이 지났나요?