MySQL DB 문제와 답
in Devlog on Db, Bit
MySQL로 각자 두문제씩 문제를 만들어 와서 풀도록 했다. 한지 오래되서 개념도 희미했는데, 이번 기회에 잘 개념 잡은것 같다.
Q1
각각의 대륙(continent)에서 인구수(population)가 가장많은(MAX) 나라(name)를 출력하시오, 단 0명이 최대인 경우 제외(NOT IN)시키시오.
조건 : NOT IN 사용
database : world
table : country
Result :
Name | Continent | population |
---|---|---|
Australia | Oceania | 18886000 |
Brazil | South America | 170115000 |
China | Asia | 1277558000 |
Nigeria | Africa | 111506000 |
Russian Federation | Europe | 146934000 |
United States | North America | 278357000 |
답 펼치기
SELECT C.CONTINENT, MAX(C.POPULATION) AS MAXPOPULATION FROM COUNTRY C
WHERE POPULATION NOT IN (0)
GROUP BY C.CONTINENT
Q2
‘America’가 들어가있는 대륙(continent) 중에서 인구수(population)가 가장많은(MAX) 나라(name)를 출력하시오, 단 0명이 최대인 경우 제외(NOT IN)시키시오.
조건 : LIKE 사용
database : world
table : country
Result :
Name | Continent | population |
---|---|---|
Brazil | South America | 170115000 |
United States | North America | 278357000 |
답 펼치기
SELECT C.NAME, C.CONTINENT, C.POPULATION FROM COUNTRY C
JOIN
(
SELECT C.CONTINENT, MAX(C.POPULATION) AS MAXPOPULATION FROM COUNTRY C
WHERE POPULATION NOT IN (0)
GROUP BY C.CONTINENT HAVING C.CONTINENT LIKE "%AMERICA%"
)J ON J.MAXPOPULATION = C.POPULATION AND J.CONTINENT = C.CONTINENT
Q3
장르가 드라마이고, 개봉일이 2019년 이후인 영화중에서 신세경이 출연했던 영화들(2개 있음)보다 상영시간이 더 긴 영화들의 영화제목과 개봉일, 상영시간을 상영시간을 기준으로 내림차순 출력
database : movie
table: movie, stars_in
Result :
MOVIE_NM | OPEN_DT | SHOW_TM | |
---|---|---|---|
더 서치 | 2019-01-17 | 134 | |
얼굴들 | 2019-01-24 | 131 | |
하트스톤 | 2019-04-25 | 129 | |
국경의 왕 | 2019-02-28 | 117 | |
자전차왕 엄복동 | 2019-02-27 | 116 | |
스트롱거 | 2019-06-27 | 118 | |
러브리스 | 2019-04-18 | 126 | |
더 페이버릿: 여왕의 여자 | 2019-02-21 | 119 | |
우행록: 어리석은 자의 기록 | 2019-01-17 | 120 | |
아사코 | 2019-03-14 | 119 | |
글래스 | 2019-01-17 | 129 | |
생일 | 2019-04-03 | 120 | |
기생충 | 2019-05-30 | 131 | |
원 네이션 | 2019-03-21 | 121 | |
말모이 | 2019-01-09 | 135 | |
레토 | 2019-01-03 | 128 | |
그린 북 | 2019-01-09 | 130 | |
가버나움 | 2019-01-24 | 126 | |
쿠르스크 | 2019-01-16 | 117 | |
살인마 잭의 집 | 2019-02-21 | 152 | |
그때 그들 | 2019-03-07 | 156 | |
증인 | 2019-02-13 | 129 | |
돈키호테를 죽인 사나이 | 2019-05-23 | 132 | |
세상을 바꾼 변호인 | 2019-06-13 | 120 | |
체 게바라: 1부 아르헨티나 | 2019-06-13 | 126 | |
체 게바라: 2부 게릴라 | 2019-06-13 | 127 | |
메리 | 퀸 오브 스코틀랜드 | 2019-02-14 | 124 |
라스트 미션 | 2019-03-14 | 116 | |
바이스 | 2019-04-11 | 132 | |
파이브 피트 | 2019-04-10 | 116 | |
어린 의뢰인 | 2019-05-22 | 114 | |
고양이 여행 리포트 | 2019-05-09 | 119 |
답 펼치기
SELECT M.MOVIE_NM, M.OPEN_DT, M.SHOW_TM FROM MOVIE M
WHERE M.SHOW_TM > ANY
(
SELECT M.SHOW_TM FROM MOVIE M
JOIN (SELECT * FROM STARS_IN SI WHERE SI.PEOPLE_NM = '신세경') J
ON J.MOVIE_CD = M.MOVIE_CD
)
AND M.REP_GENRE_NM = '드라마' AND YEAR(M.OPEN_DT) >= 2019
Q4
영화 마녀에 출연한 출연진의 남성과 여성의 수를 각각 구하기
database : movie
table : movie, stars_in, movie_people
Result :
SEX | COUNT(*) |
---|---|
여자 | 11 |
남자 | 15 |
답 펼치기
SELECT MP.SEX, COUNT(*) FROM MOVIE_PEOPLE MP
JOIN
(
SELECT * FROM STARS_IN SI
WHERE MOVIE_CD = (SELECT M.MOVIE_CD FROM MOVIE M WHERE M.MOVIE_NM = '마녀')
) J
ON MP.PEOPLE_CD = J.PEOPLE_CD
GROUP BY MP.SEX
Q5
각 유저가 본 영화 중 최대 상영시간을 구하고 최근 유저등록일로 정렬해라
DB : d_diver
테이블 : member, watch_list, movie
조건 : max order by
Result :
ID | REG_DATE | MAX(J1.SHOW_TM) |
---|---|---|
testid04 | 2019-06-11 23:51:27 | 143 |
testid03 | 2019-06-11 23:39:33 | 118 |
testid02 | 2019-06-11 12:28:54 | 118 |
testid01 | 2019-06-11 10:50:39 | 180 |
aaa | 2019-06-11 09:40:12 | 143 |
test01 | 2019-06-05 16:05:16 | 139 |
답 펼치기
JOIN
(SELECT * FROM MOVIE) J1
ON J1.MOVIE_CD = WL.MOVIE_CD
JOIN
(SELECT DM.ID, DM.REG_DATE FROM D_DIVER.MEMBER DM) J2
ON J2.ID = WL.ID
GROUP BY WL.ID
ORDER BY J2.REG_DATE DESC
Q6
입장 관객 수가 10 ~ 20 사이의 영화에서 스타 출연 수와 영화제목을 구하고 최신 제작일자로 정렬해라 (movie, stars_in)
DB : d_diver
테이블 : MOVIE_NM, VIEWS
조건 : count, between, order by
Result :
MOVIE_NM | VIEWS | COUNT(J.MOVIE_CD) | PRDT_DATE |
---|---|---|---|
갤버스턴 | 18 | 4 | 2018-01-01 |
007 스카이폴 | 12 | 6 | 2011-01-01 |
답 펼치기
SELECT J.MOVIE_NM, J.VIEWS, COUNT(J.MOVIE_CD), J.PRDT_DATE FROM STARS_IN SI
JOIN
(
SELECT * FROM MOVIE M
WHERE M.VIEWS BETWEEN 10 AND 20
) J
ON J.MOVIE_CD = SI.MOVIE_CD
GROUP BY J.MOVIE_CD
ORDER BY J.PRDT_DATE DESC
Q7
category_id값이 10미만 이면 “인기장르” 그외 “비주류장르” 이라 하고 Z로 시작하는 title, description, 장르인기도를 구하시오.
database : sakila table : file_category, film_text
(Select, join, case, as)
Result :
TITLE | DESCRIPTION | 인기도 |
---|---|---|
ZHIVAGO CORE | A Fateful Yarn of a Composer And a Man who must Face a Boy in The Canadian Rockies | 비주류 장르 |
ZOOLANDER FICTION | A Fateful Reflection of a Waitress And a Boat who must Discover a Sumo Wrestler in Ancient China | 인기장르 |
ZORRO ARK | A Intrepid Panorama of a Mad Scientist And a Boy who must Redeem a Boy in A Monastery | 인기장르 |
답 펼치기
SELECT FT.TITLE, FT.DESCRIPTION, J.인기도 FROM FILM_TEXT FT
JOIN
(
SELECT FC.film_ID,
(CASE
WHEN FC.CATEGORY_ID < 10 THEN '인기장르'
ELSE '비주류 장르'
END) AS '인기도'
FROM FILM_CATEGORY FC
)J ON FT.FILM_ID = J.FILM_ID
WHERE FT.TITLE LIKE "Z%"
ORDER BY FT.TITLE
Q8
customer_id별 요금 합이 60이하인 고객id, 총 요금 ,last_update를 구하시오.
database : sakila table : payment, rental (Select, join, group by, sum)
Result :
CUSTOMER_ID | SUM(P.AMOUNT) | LAST_UPDATE |
---|---|---|
61 | 58.86 | 2006-02-15 22:12:45 |
97 | 58.82 | 2006-02-15 22:12:58 |
110 | 59.86 | 2006-02-15 22:13:04 |
248 | 50.85 | 2006-02-15 22:14:47 |
281 | 50.86 | 2006-02-15 22:15:22 |
318 | 52.88 | 2006-02-15 22:16:01 |
395 | 57.81 | 2006-02-15 22:17:41 |
답 펼치기
SELECT P.CUSTOMER_ID, SUM(P.AMOUNT), P.LAST_UPDATE FROM PAYMENT P
GROUP BY P.CUSTOMER_ID HAVING SUM(P.AMOUNT) < 60
Q8
한국영화에 출연한 남자배우와 성별이 NULL인 배우들의 영화이름과 배우이름은?
DB : d_diver
테이블 : movie, stars_in, movie_people
Result :
영화이름 | 배우이름 | 성별 |
---|---|---|
엘 꼰도르 빠사 | 가우사이 | 남자 |
오늘도 평화로운 | 감승민 | 남자 |
나의 PS 파트너 | 강경준 | 남자 |
작은 연못 | 강경희 | NULL |
맛있는 인생 | 강계선 | NULL |
최종병기 활 | 강규영 | 남자 |
너의 결혼식 | 강기영 | 남자 |
답 펼치기
SELECT M.MOVIE_NM, J.PEOPLE_NM, '남자' FROM MOVIE M
JOIN
(
SELECT * FROM STARS_IN SI
WHERE PEOPLE_CD IN (SELECT MP.PEOPLE_CD FROM MOVIE_PEOPLE MP WHERE MP.SEX = '남자')
) J
ON J.MOVIE_CD = M.movie_cd
WHERE M.REP_NATION_NM = '한국'
ORDER BY J.PEOPLE_NM
Q9
멤버들이 시청한 영화 별 영화이름과 영화코드 그리고 영화 시청횟수를 구하여라
DB : d_diver
테이블 : movie, watch_list
Result :
MOVIE_NM | MOVIE_CD | 영화 시청 수 |
---|---|---|
토이 스토리 4 | 20184047 | 2 |
쁘띠 아만다 | 20198909 | 2 |
고산자, 대동여지도 | 20159648 | 1 |
극장판 뛰뛰빵빵 구조대 미션: 둥둥이를 구하라! | 20138501 | 1 |
극장판 나루토 질풍전: 로드 투 닌자 | 20134244 | 1 |
그것만이 내 세상 | 20176104 | 1 |
궁합 | 20150969 | 1 |
골든슬럼버 | 20168250 | 1 |
고백할 수 없는 | 20158745 | 1 |
답 펼치기
SELECT MP.PEOPLE_CD, MP.PEOPLE_NM FROM MOVIE_PEOPLE MP
JOIN
(
SELECT * FROM MOVIE_PEOPLE MP
GROUP BY MP.PEOPLE_NM
HAVING COUNT(MP.PEOPLE_NM) > 1
) J ON MP.PEOPLE_NM = J.PEOPLE_NM
ORDER BY MP.PEOPLE_NM
Q10
이름(stars_in.people_nm)이 ‘마동석’ 또는 ‘김태훈’이 출연한 영화의 ‘배급사’를(companies_in.company_Part_Nm) 중복없이 오름차순으로 정렬하여 출력 하세요
조건 : or 사용
database : d_diver
table : companies_in, stars_in
Result :
company_nm |
---|
(주)리틀빅픽쳐스 |
(주)쇼박스 |
(주)스톰픽쳐스코리아 |
(주)싸이더스 |
(주)에이스메이커무비웍스 |
(주)엣나인필름 |
(주)영화사 빅 |
(주)영화사오원 |
(주)인벤트스톤 |
(주)제이앤씨미디어그룹 |
(주)콘텐츠판다 |
(주)키위미디어그룹 |
(주)프레인글로벌 |
TCO(주)더콘텐츠온 |
롯데쇼핑㈜롯데엔터테인먼트 |
롯데컬처웍스(주)롯데엔터테인먼트 |
메가박스중앙(주)플러스엠 |
씨너스엔터테인먼트(주) |
씨제이엔터테인먼트 |
씨제이이앤엠(주) |
워너브러더스 코리아(주) |
주식회사 케이엠스타 |
코리아 코어 컨텐츠 |
답 펼치기
SELECT DISTINCT J.COMPANY_NM FROM STARS_IN SI
JOIN
(SELECT * FROM companies_in CI WHERE CI.company_Part_Nm = '배급사') J
ON J.MOVIE_CD = SI.MOVIE_CD
WHERE SI.PEOPLE_NM = '마동석' OR SI.PEOPLE_NM = '김태훈'
ORDER BY J.COMPANY_NM
Q11
‘마동석’이 출연한 영화중 ‘(주)쇼박스’가 하는게 아닌 영화의 장르별 개수를 구하는 쿼리문은 다음과 같다.
select REP_GENRE_NM, count(*)
from d_diver.movie
where movie_cd in (select movie_cd
from d_diver.stars_in
where people_nm = '마동석' and movie_cd not in (select movie_cd
from d_diver.companies_in
where company_nm = '(주)쇼박스' ))
group by d_diver.movie.REP_GENRE_NM;
그리고 위의 쿼리를 살짝 바꾼 다음의 쿼리가 있다.
select REP_GENRE_NM, count(*)
from d_diver.movie
where movie_cd in (select movie_cd
from d_diver.stars_in
where people_nm = '마동석' and movie_cd in (select movie_cd
from d_diver.companies_in
where company_nm <> '(주)쇼박스' ))
group by d_diver.movie.REP_GENRE_NM;
위에거는 되고, 밑에거는 안되는 이유를 서술하세요 (단, ‘당연히 안되지’는 오답임)
Result : 예를들어 다음과 같이 테이블이 구성되어있다고 치자. 그리고 범죄와의 전쟁의 movie_cd가 1이라고 가정하자. 이때, select movie_cd from d_diver.companies_in where company_nm = ‘(주)쇼박스’; 쿼리는 다음과 같은 결과를 낸다. 이를 not in연산으로 걸러내면 1, 2, 3이 걸러져 4,5만이 남는다. 그런데, select movie_cd from d_diver.companies_in where company_nm <> ‘(주)쇼박스’; 쿼리는 다음의 결과를 내고 이를 in으로 걸러내면 1, 4, 5가 남게된다. 그래서 그런거임답 펼치기
movie_cd company_nm 1 (주)쇼박스 1 A 1 B 2 (주)쇼박스 3 (주)쇼박스 4 A 5 A 5 B movie_cd company_nm 1 (주)쇼박스 2 (주)쇼박스 3 (주)쇼박스 movie_cd company_nm 1 A 1 B 4 A 5 A 5 B
Q12
남자 배우가 몇번 출현했는지 내림차순으로 정렬하여 새로운 테이블 actor_movie(배우이름, 횟수, 성별)을 생성해서 구하여라 (본인은 새로운 테이블 생성 하지 않았음) DB : d_diver
테이블 : stars_in, movie_people
Result :
배우이름 | 횟수 | 성별 |
---|---|---|
김태훈 | 210 | 남자 |
이준혁 | 154 | 남자 |
이승준 | 117 | 남자 |
박진수 | 104 | 남자 |
김동현 | 100 | 남자 |
김정현 | 88 | 남자 |
이정현 | 77 | 남자 |
이정민 | 70 | 남자 |
답 펼치기
SELECT SI.PEOPLE_NM, COUNT(SI.PEOPLE_NM) AS '출연횟수' FROM STARS_IN SI
JOIN
(SELECT * FROM MOVIE_PEOPLE MP WHERE MP.SEX = '남자') J
ON J.PEOPLE_CD = SI.PEOPLE_CD
GROUP BY SI.PEOPLE_NM
ORDER BY 출연횟수 DESC
Q13
영화 장르가 드라마인 영화이름만 가져와서 drama_movie(movie_nm, rep_nation_nm, rep_genre_nm, watch_Grade_Nm) 테이블을 생성하면서 구하여라 -> movie
Result :
movie_nm | rep_nation_nm | rep_genre_nm | watch_Grage_nm |
---|---|---|---|
파업전야 | 한국 | 드라마 | 12세이상관람가 |
로제타 | 프랑스 | 드라마 | 15세이상관람가 |
작은 연못 | 한국 | 드라마 | 15세이상관람가 |
웨딩드레스 | 한국 | 드라마 | 전체관람가 |
주문진 | 한국 | 드라마 | 12세이상관람가 |
클로이 | 프랑스 | 드라마 | 청소년관람불가 |
크레이지 하트 | 미국 | 드라마 | 15세이상관람가 |
블라인드 사이드 | 미국 | 드라마 | 12세이상관람가 |
친정엄마 | 한국 | 드라마 | 전체관람가 |
(…) |
답 펼치기
CREATE TABLE DRAMA_MOVIE
SELECT M.MOVIE_NM, M.REP_NATION_NM, M.REP_GENRE_NM, M.WATCH_GRADE_NM FROM MOVIE M
Q14
2015 년도 이후에 개봉한 미국 영화 중에서 상영 시간이 120분이 넘는 작품의 각 장르의 count를 구하시오.
조건 : select, where, count database : movie
table : movie
Result :
REP_GENRE_NM | COUNT(*) |
---|---|
SF | 3 |
공포(호러) | 1 |
드라마 | 19 |
뮤지컬 | 1 |
범죄 | 4 |
스릴러 | 3 |
애니메이션 | 2 |
액션 | 31 |
어드벤처 | 5 |
코미디 | 3 |
판타지 | 2 |
답 펼치기
SELECT M.REP_GENRE_NM, COUNT(*) FROM MOVIE M
JOIN
(
SELECT * FROM MOVIE M
WHERE YEAR(M.OPEN_DT) > 2014 AND M.SHOW_TM > 120 AND M.REP_NATION_NM = '미국'
) J
ON J.MOVIE_CD = M.MOVIE_CD
GROUP BY M.REP_GENRE_NM
ORDER BY M.REP_GENRE_NM
Q15
신세경이 출연한 영화 목록을 보이세요
조건 : select, where, count, any
database : movie
table : movie, stars_in
Result :
MOVIE_NM | PRDT_DATE |
---|---|
R2B: 리턴투베이스 | 2012-01-01 |
타짜-신의 손 | 2014-01-01 |
답 펼치기
SELECT * FROM MOVIE M
WHERE M.MOVIE_CD IN (SELECT SI.MOVIE_CD FROM stars_in SI WHERE SI.PEOPLE_NM = '신세경')
Q16
신세경이 출연한 영화의 수는? 데이타 베이스 : d_diver
사용 테이블 : movie , stares_in
사용 구문 : select , where , count , ANY
Result :
COUNT(*) |
---|
2 |
답 펼치기
SELECT COUNT(*) FROM stars_in SI
WHERE SI.PEOPLE_NM = '신세경'
Q17
LANGUAGE가 English인 국가들의 ‘CODE, NAME, LANGUAGE, GNP’를 CODE 그룹별로 묶어서 보여주되, ‘소득수준’이라는 별도의 열(컬럼)을 만들어서 만약 GNP가 1000 이상일 경우 ‘잘사네’라는 글자가 출력되고, 만약 GNP가 1000 이하일 경우 ‘못사네’라는 글자가 출력되도록 해라.
조건 : Select, Join, Group By, As, Case 사용
database : world
TABLE : country, countrylanguage
Result :
CODE | NAME | Language | GNP | 소득수준 |
---|---|---|---|---|
ABW | Aruba | English | 828.00 | 못사네 |
AIA | Anguilla | English | 63.20 | 못사네 |
ANT | Netherlands Antilles | English | 1941.00 | 잘사네 |
ASM | American Samoa | English | 334.00 | 못사네 |
ATG | Antigua and Barbuda | English | 612.00 | 못사네 |
AUS | Australia | English | 351182.00 | 잘사네 |
BHR | Bahrain | English | 6366.00 | 잘사네 |
BLZ | Belize | English | 630.00 | 못사네 |
(…) |
답 펼치기
SELECT C.CODE, C.NAME, J.LANGUAGE, C.GNP,
(CASE WHEN C.GNP > 1000 THEN '잘사네' ELSE '못사네' END) AS 소득수준
FROM COUNTRY C
JOIN (SELECT * FROM COUNTRYLANGUAGE CL WHERE CL.LANGUAGE = 'ENGLISH') J
ON C.CODE = J.COUNTRYCODE
Q18
고객 중 지불 내력이 있고 first_name이 4글자이고 A로 시작하는 고객들의 customer_id, first_name, ‘amount 총합’을 first_name 그룹별로 묶어서 출력하라.
조건 : Select, Join, Group By, Sum
database : sakila
TABLE : customer, payment
Result :
customer_id | first_name | SUM(amount) |
---|---|---|
33 | ANNA | 91.79 |
85 | ANNE | 87.77 |
196 | ALMA | 151.65 |
367 | ADAM | 101.78 |
389 | ALAN | 124.74 |
454 | ALEX | 151.67 |
582 | ANDY | 113.75 |
답 펼치기
SELECT P.CUSTOMER_ID, J.FIRST_NAME, SUM(P.AMOUNT) FROM PAYMENT P
JOIN (SELECT * FROM CUSTOMER C WHERE C.FIRST_NAME LIKE 'A___') J
ON J.CUSTOMER_ID = P.CUSTOMER_ID
GROUP BY P.CUSTOMER_ID
Q19
배우 강능원과 함께 영화 촬영을 한 감독과, 배우의 개수를 출력하라.
조건 : COUNT, JOIN, GROUP BY
database : movie
table : stars_in, movie_people
Result :
REP_ROLE_NM | COUNT(*) |
---|---|
배우 | 6 |
답 펼치기
SELECT J1.REP_ROLE_NM, COUNT(*) FROM STARS_IN SI
JOIN(SELECT * FROM MOVIE_PEOPLE MP WHERE MP.PEOPLE_NM = '강능원') J1
ON J1.PEOPLE_CD = SI.PEOPLE_CD
JOIN(SELECT * FROM STARS_IN SI) J2
ON J2.MOVIE_CD = SI.MOVIE_CD
GROUP BY J1.REP_ROLE_NM
Q20
주역 배우가 아닌 Casting을 한 배우가 참여한 영화 중, 국가가 소유하고있는 러닝 타임이 100분 이상인 영화의 개수를 출력하라.
조건 : COUNT, JOIN, GROUP BY
database : movie
table : movie, stars_in
Result :
REP_NATION_NM | COUNT(DISTINCT M.MOVIE_NM) |
---|---|
네덜란드 | 1 |
대만 | 1 |
덴마크 | 1 |
러시아 | 1 |
미국 | 56 |
스웨덴 | 1 |
스페인 | 3 |
아이슬란드 | 1 |
영국 | 2 |
이탈리아 | 2 |
인도 | 1 |
일본 | 33 |
중국 | 2 |
캐나다 | 1 |
프랑스 | 9 |
한국 | 251 |
호주 | 1 |
홍콩 | 1 |
답 펼치기
SELECT M.REP_NATION_NM, COUNT(DISTINCT M.MOVIE_NM) FROM MOVIE M
JOIN (SELECT * FROM STARS_IN SI WHERE SI.CAST IS NOT NULL) J
ON M.MOVIE_CD = J.MOVIE_CD
WHERE M.SHOW_TM >= 100
GROUP BY REP_NATION_NM
Q21
회원의 first_name, last_name과 주소, 주소 업데이트 시간을 표시한다. 대신 district(지역)을 중복 없애준 후 last_update값으로 내림차순으로 정렬.
조건 : Select, Join, Group By, ASC(DESC) 사용.
database : sakila
table : customer, address
Result :
first_name | last_name | district | last_update |
---|---|---|---|
MARIA | MILLER | Central Serbia | 2014-09-25 22:34:11 |
GINA | WILLIAMSON | Taizz | 2014-09-25 22:34:11 |
BARRY | LOVELACE | Copperbelt | 2014-09-25 22:34:11 |
MAX | PITT | Vojvodina | 2014-09-25 22:34:11 |
WILLIAM | SATTERFIELD | Sanaa | 2014-09-25 22:34:10 |
GORDON | ALLARD | Hodeida | 2014-09-25 22:34:10 |
ELLA | OLIVER | Aden | 2014-09-25 22:34:08 |
(…) |
결과 : 376row 답 펼치기
SELECT customer.first_name, customer.last_name, address.district, address.last_update FROM customer
JOIN address ON customer.address_id = address.address_id
GROUP BY address.district
ORDER BY last_update DESC;
Q22
title과 rating, rental_rate를 나타낸다. 대신 영화의 카테고리가 ‘comedy’인 영화만 뽑아와야 하며, title에 따라 내림 차순으로 정렬한다. (category 5로 직접 뽑아오기 금지)
조건 : Select, Join, ASC(DESC) 사용.
database : sakila
table : film, category, film_category
Result :
title | rating | rental_rate |
---|---|---|
CLOSER BANG | R | 4.99 |
ELEMENT FREDDY | NC-17 | 4.99 |
SNATCH SLIPPER | PG | 4.99 |
VELVET TERMINATOR | R | 4.99 |
CONTROL ANTHEM | G | 4.99 |
AIRPLANE SIERRA | PG-13 | 4.99 |
FLINTSTONES HAPPINESS | PG-13 | 4.99 |
PINOCCHIO SIMON | PG | 4.99 |
(…) |
결과 : 58row 답 펼치기
SELECT film.title, film.rating, film.rental_rate FROM film
JOIN film_category ON film.film_id = film_category.film_id
WHERE film_category.category_id IN (SELECT category.category_id FROM category WHERE category.name = 'COMEDY')
ORDER BY film.rental_rate DESC;
Q23
유해진이 출연한 영화들의 배급사를 중복없이 검색하시오
조건 : in, distinct 사용
database : d_diver
TABLE : stars_in, companies_in
Result :
company_nm |
---|
롯데쇼핑㈜롯데엔터테인먼트 |
(주)싸이더스 |
(주)쇼박스 |
CGV아트하우스 |
롯데컬처웍스(주)롯데엔터테인먼트 |
답 펼치기
SELECT DISTINCT CI.COMPANY_NM FROM COMPANIES_IN CI
JOIN (SELECT * FROM STARS_IN SI WHERE SI.PEOPLE_NM = '유해진') J
ON J.MOVIE_CD = CI.MOVIE_CD
WHERE CI.COMPANY_PART_NM = '배급사'
Q24
장르별 이정현이 출현한 횟수를 구하시오
조건 : join, group by 사용
database : d_diver
TABLE : movie, stars_in
Result :
REP_GENRE_NM | COUNT(*) |
---|---|
사극 | 1 |
코미디 | 1 |
스릴러 | 1 |
드라마 | 4 |
액션 | 3 |
가족 | 1 |
답 펼치기
SELECT M.REP_GENRE_NM, COUNT(*) FROM MOVIE M
JOIN (SELECT * FROM STARS_IN SI WHERE SI.PEOPLE_NM = '이정현') J
ON J.MOVIE_CD = M.MOVIE_CD
GROUP BY M.REP_GENRE_NM
Q25
상영시간이 100분 이상이고 이탈리아에서 10년이내에 제작한 영화의 제작일자(PRDT_DATE)와 일자별 제작 영화 수는?
조건 : DATE 값을 수기로 작성하지 않는다. ex) PRDT_DATE > ‘2019.09.06(X)’
database : d_diver
TABLE : stars_in, movie
Result :
PRDT_DATE | COUNT(*) |
---|---|
2010-01-01 | 1 |
2015-01-01 | 1 |
2017-01-01 | 2 |
2018-01-01 | 2 |
답 펼치기
SELECT M.PRDT_DATE, COUNT(*) FROM MOVIE M
JOIN
(
SELECT M.MOVIE_NM, M.PRDT_DATE FROM MOVIE M WHERE M.PRDT_DATE > (YEAR(NOW()) - 10)
)J ON J.MOVIE_NM = M.MOVIE_NM
WHERE M.REP_NATION_NM = '이탈리아' AND M.SHOW_TM > 120
GROUP BY M.PRDT_DATE
Q26
남자배우가 출연한 청소년관람불가 한국 영화중 상영시간이 100분 미만인 영화 장르와 장르별 영화 갯수는?
조건 : ANY 연산자 사용
database : d_diver
TABLE : stars_in, movie, movie_people
Result :
REP_GENRE_NM | COUNT(DISTINCT MOVIE_NM) |
---|---|
SF | 1 |
공포(호러) | 3 |
드라마 | 20 |
멜로/로맨스 | 8 |
미스터리 | 2 |
스릴러 | 5 |
액션 | 5 |
코미디 | 5 |
답 펼치기
SELECT M.REP_GENRE_NM, COUNT(DISTINCT MOVIE_NM) FROM MOVIE M
JOIN
(
SELECT SI.MOVIE_CD FROM STARS_IN SI
JOIN (SELECT MP.PEOPLE_CD FROM MOVIE_PEOPLE MP WHERE MP.SEX = '남자') J1
ON SI.PEOPLE_CD = J1.PEOPLE_CD
) J2 ON J2.MOVIE_CD = M.MOVIE_CD
WHERE M.WATCH_GRADE_NM = '청소년관람불가' AND M.SHOW_TM < 100 AND M.REP_NATION_NM = '한국'
GROUP BY M.REP_GENRE_NM
Q27
청소년 관람 불가 등급 영화들의 러닝타임 합계는?
조건 : sum
database : d_diver
TABLE : movie
Result :
SUM(M.SHOW_TM) |
---|
41534 |
답 펼치기
SELECT SUM(M.SHOW_TM) FROM MOVIE M
WHERE M.WATCH_GRADE_NM = '청소년관람불가'
Q28
movie_people 테이블에 있는 배우들과 stars_in 테이블에 있는 배우들을 모두 합한 결과에서 중복을 제외한 배우의 수를 구하여라
조건 : sum , union
database : d_diver
TABLE : stars_in, movie_people
Result :
COUNT(*) |
---|
23581 |
답 펼치기
SELECT COUNT(*) FROM (SELECT * FROM STARS_IN SI UNION SELECT * FROM MOVIE_PEOPLE MP) P
Q29
‘남자’이면서 ‘배우’가 출연한 영화의 장르별 평균 상영시간을 출력하라.
조건 : avg
database : d_diver
table : movie, stars_in, movie_people
Result :
REP_GENRE_NM | AVG(M.SHOW_TM) |
---|---|
액션 | 115.7306 |
드라마 | 109.7835 |
애니메이션 | 87.7520 |
공포(호러) | 93.8286 |
스릴러 | 107.9255 |
SF | 119.2975 |
미스터리 | 108.9763 |
전쟁 | 102.2239 |
멜로/로맨스 | 106.2234 |
범죄 | 119.2197 |
코미디 | 105.5355 |
사극 | 121.3376 |
어드벤처 | 124.7412 |
판타지 | 118.5738 |
가족 | 94.6329 |
뮤지컬 | 114.6522 |
기타 | 82.0000 |
답 펼치기
SELECT M.REP_GENRE_NM, AVG(M.SHOW_TM) FROM MOVIE M
JOIN
(
SELECT SI.MOVIE_CD FROM STARS_IN SI
WHERE SI.PEOPLE_CD IN (SELECT MP.PEOPLE_CD FROM MOVIE_PEOPLE MP WHERE MP.SEX = "남자" AND MP.REP_ROLE_NM = "배우")
) J
ON J.MOVIE_CD = M.MOVIE_CD
GROUP BY M.REP_GENRE_NM
Q30
애니메이션 장르(REP_GENRE_NM) 중에서 가장 작은(min 사용) 상영시간(show_Tm)을 가진 영화 제목(movie_nm)과 제작사(company_nm), 상영시간(show_Tm)를 구하라 (중복제거)
조건 : min 사용
database : d_diver
TABLE : movie, companies_in
Result :
MOVIE_NM | COMPANY_NM | SHOW_TM |
---|---|---|
미니 자이언트 | (주)박수엔터테인먼트 | 43 |
답 펼치기
SELECT DISTINCT M.MOVIE_NM, J.COMPANY_NM ,M.SHOW_TM FROM MOVIE M
JOIN (SELECT CI.MOVIE_CD, CI.COMPANY_NM FROM COMPANIES_IN CI) J
ON J.MOVIE_CD = M.MOVIE_CD
WHERE M.SHOW_TM = (SELECT MIN(M.SHOW_TM) AS 'MIN TIME' FROM MOVIE M WHERE REP_GENRE_NM = "애니메이션")
Q31
2015이후 고양이 키워드가 포함된 영화제목(movie_nm)에 출연한 배우의 숫자를 구하라
조건 : like 사용
database : d_diver
TABLE : movie, stars_in
Result :
COUNT(*) |
---|
14 |
답 펼치기
SELECT COUNT(*) FROM STARS_IN SI
JOIN(SELECT * FROM MOVIE M WHERE M.MOVIE_NM LIKE "%고양이%") J
ON J.MOVIE_CD = SI.MOVIE_CD
WHERE YEAR(J.PRDT_DATE) >= 2015
Q32
2018년 개봉 영화중 장르별로 상영시간이 가장 긴 영화의 제목, 장르, 개봉일, 나라, 상영시간을 출력. 단, 상영시간 기준 내림차순으로 조건 : max, between
DB : d_diver
테이블 : movie
Result :
MOVIE_NM | REP_GENRE_NM | open_dt | REP_NATION_NM | show_Tm |
---|---|---|---|---|
당갈 | 액션 | 2018-04-25 | 인도 | 160 |
더 스퀘어 | 코미디 | 2018-08-02 | 스웨덴 | 151 |
브림스톤 | 미스터리 | 2018-07-19 | 네덜란드 | 148 |
120 BPM | 드라마 | 2018-03-15 | 프랑스 | 143 |
디트로이트 | 스릴러 | 2018-05-31 | 미국 | 142 |
신과함께-인과 연 | 판타지 | 2018-08-01 | 한국 | 141 |
퍼스트맨 | SF | 2018-10-18 | 미국 | 141 |
마약왕 | 범죄 | 2018-12-19 | 한국 | 139 |
답 펼치기
SELECT M.MOVIE_NM, M.REP_GENRE_NM, M.OPEN_DT, M.REP_NATION_NM, M.SHOW_TM FROM MOVIE M
JOIN
(
SELECT MAX(M.SHOW_TM) AS MAX_SHOW_TM, M.REP_GENRE_NM FROM MOVIE M
WHERE YEAR(M.OPEN_DT) = 2018
GROUP BY M.REP_GENRE_NM
) J
ON J.MAX_SHOW_TM = M.SHOW_TM AND M.REP_GENRE_NM = J.REP_GENRE_NM
ORDER BY M.SHOW_TM DESC
Q33
2016~2018 3년간 3번이상 영화를 제작한 제작사와 제작한 영화의 갯수를 내림차순으로 출력. 조건 : count between
DB : d_diver
테이블 : movie, companines_in
Result :
company_nm | 제작횟수 |
---|---|
한국영화아카데미 | 6 |
(주)영화제작전원사 | 5 |
(주)하이브미디어코프 | 5 |
씨제이이앤엠(주) | 4 |
(주)페퍼민트앤컴퍼니 | 3 |
(주)영화사레드피터 | 3 |
(주)무비락 | 3 |
(주)비에이엔터테인먼트 | 3 |
(주)필름케이 | 3 |
(주)명필름 | 3 |
명필름랩 | 3 |
(주)외유내강 | 3 |
영화사 집 | 3 |
답 펼치기
SELECT CI.COMPANY_NM, COUNT(CI.COMPANY_NM) AS COUNT FROM COMPANIES_IN CI
JOIN (SELECT * FROM MOVIE M WHERE YEAR(M.PRDT_DATE) BETWEEN 2016 AND 2018) J
ON CI.MOVIE_CD = J.MOVIE_CD
WHERE CI.COMPANY_PART_NM = "제작사"
GROUP BY CI.COMPANY_NM
HAVING COUNT(*) >= 3
ORDER BY COUNT DESC
Q34
전체 영화 중 러닝타임이 독일영화 중 가장 짧은 러닝타임보다 작은 영화이름,러닝타임, 제작국가를 출력하세요.
조건 : All 사용
database : d_diver
table : movie
Result :
MOVIE_NM | SHOW_TM | REP_NATION_NM |
---|---|---|
은실이 | 72 | 한국 |
마징카이저 | 74 | 일본 |
33리 | 32 | 한국 |
눈의 여왕 | 76 | 러시아 |
파리의 도둑고양이 | 70 | 프랑스 |
롤플레이 | 76 | 한국 |
(…) |
결과 : 110row 답 펼치기
SELECT M.MOVIE_NM, M.SHOW_TM, M.REP_NATION_NM FROM MOVIE M
WHERE M.SHOW_TM < (SELECT MIN(M.SHOW_TM) FROM MOVIE M WHERE M.REP_NATION_NM = "독일")
Q35
제작사 ‘어뮤즈’에서 참여한 모든 영화들보다 러닝타임이 더 긴 영화들의 영화이름, 러닝타임, 제작국가를 내림차순(러닝타임)으로 출력하세요
조건 : All 사용
database : d_diver
table : movie , companies_in
Result :
MOVIE_NM | SHOW_TM | REP_NATION_NM |
---|---|---|
빌리 엘리어트 뮤지컬 라이브 | 180 | 미국 |
내부자들: 디 오리지널 | 180 | 한국 |
어벤져스: 엔드게임 | 180 | 미국 |
황금시대 | 178 | 중국 |
클라우드 아틀라스 | 172 | 미국 |
산다 | 165 | 한국 |
블레이드 러너 2049 | 163 | 미국 |
호빗: 스마우그의 폐허 | 161 | 미국 |
당갈 | 160 | 인도 |
밀레니엄 : 여자를 증오한 남자들 | 157 | 미국 |
(…) |
결과 : 729row 답 펼치기
SELECT M.MOVIE_NM, M.SHOW_TM, M.REP_NATION_NM FROM MOVIE M
WHERE M.SHOW_TM > ALL
(
SELECT M.SHOW_TM FROM MOVIE M
JOIN
(SELECT CI.MOVIE_CD FROM COMPANIES_IN CI WHERE CI.COMPANY_NM = '어뮤즈') J
ON J.MOVIE_CD = M.MOVIE_CD
)
ORDER BY M.SHOW_TM DESC
Q36
장르별 show_tm을 합산하여 합산한 값을 기준으로 오름차순
조건 : sum 사용
database : d_diver
TABLE : movie
Result :
REP_GENRE_NM | SUM(M.SHOW_TM) |
---|---|
기타 | 82 |
뮤지컬 | 1183 |
사극 | 1350 |
전쟁 | 1746 |
가족 | 1746 |
어드벤처 | 2555 |
미스터리 | 4090 |
판타지 | 4207 |
SF | 5447 |
범죄 | 8070 |
공포(호러) | 8798 |
스릴러 | 9038 |
코미디 | 15036 |
멜로/로맨스 | 15087 |
애니메이션 | 22887 |
액션 | 26212 |
드라마 | 54845 |
답 펼치기
SELECT M.REP_GENRE_NM, SUM(M.SHOW_TM) FROM MOVIE M
GROUP BY M.REP_GENRE_NM
ORDER BY SUM(M.SHOW_TM)
Q37
open_dt를
2017 ~ 2019 -> new
2014 ~ 2016 -> newold
나머지 -> old
영화들을 장르별로 묶어서 count
조건 : COUNT CASE BETWEEN 사용
database : d_diver
TABLE : movie
Result :
REP_GENRE_NM | NEW | NEWOLD | OLD |
---|---|---|---|
SF | 16 | 17 | 17 |
가족 | 9 | 5 | 3 |
공포(호러) | 50 | 31 | 13 |
기타 | 1 | ||
드라마 | 252 | 148 | 116 |
멜로/로맨스 | 55 | 56 | 36 |
뮤지컬 | 4 | 2 | 4 |
미스터리 | 22 | 14 | 3 |
범죄 | 39 | 21 | 13 |
사극 | 3 | 5 | 3 |
스릴러 | 35 | 35 | 17 |
애니메이션 | 140 | 67 | 54 |
액션 | 122 | 82 | 40 |
어드벤처 | 11 | 10 | 1 |
전쟁 | 9 | 6 | 1 |
코미디 | 71 | 48 | 29 |
판타지 | 22 | 11 | 6 |
답 펼치기
SELECT M.REP_GENRE_NM,
SUM(CASE WHEN YEAR(M.OPEN_DT) BETWEEN 2017 AND 2019 THEN 1 END) AS 'NEW',
SUM(CASE WHEN YEAR(M.OPEN_DT) BETWEEN 2014 AND 2016 THEN 1 END) AS 'NEWOLD',
SUM(CASE WHEN YEAR(M.OPEN_DT) < 2014 THEN 1 END) AS 'OLD'
FROM MOVIE M
GROUP BY M.REP_GENRE_NM