[강의명]
패스트캠퍼스 SQL 100제 + 자격증 완성 온라인 완주반
[수강목록]
1주차 과제 풀이 (SQL 1~20번 문제)
[강의내용]
기본적인 SQL 실습문제들을 풀이한다. dvdrental 데이터셋에 친숙해지기 위한 난이도가 낮은 문제들이 많다.(SQL 문제들을 풀면서 느낀 점은 데이터셋을 면밀히 파악하는 것이 무척 중요하다는 점이었다. 어떤 테이블에 어떤 컬럼들이 있는지 모르면 문제를 푸는데 시간이 정말 오래 걸린다..)예전 강의에서 다뤘던 내용도 포함되어 있고, 수업에서 test로 진행된 문제들은 풀이를 업로드하지 않아서 복습차원에서 종합적으로 업로드를 해보려한다.
문제1번) dvd 렌탈 업체의 dvd 대여가 있었던 날짜를 확인해주세요.
대여가 있었던 날짜들을 구하면 된다. 예를 들어 5/24에 15시, 16시, 17시에 총 3건의 대여가 있었다고 해도, 5/24는 1건만 구하면 된다.
주의할 점은 rental_date는 시각까지 나타나 있는 timestamp 형식이므로 date 함수를 통해 날짜만 나타날 수 있도록 가공해주어야 한다.
SELECT DISTINCT date(rental_date)
FROM rental
ORDER BY date(rental_date);
문제2번) 영화길이가 120분 이상이면서, 대여기간이 4일 이상이 가능한, 영화제목을 알려주세요.
영화제목을 구하는데, 1) 길이가 120분 이상, 2) 대여기간이 4일 이상인 영화제목들만 필터링해서 출력해야 한다.
WHERE절을 이용한다.
SELECT title
FROM film
WHERE length >= 120
AND rental_duration >= 4;
문제3번) 직원의 id가 2번인 직원의 id, 이름, 성을 알려주세요
staff_id = 2 조건을 충족하는 데이터만 출력해야 한다.
SELECT staff_id, first_name, last_name
FROM staff
WHERE staff_id = 2;
문제4번) 지불 내역 중에서, 지불 내역 번호가 17510 에 해당하는, 고객의 지출 내역 (amount)는 얼마인가요?
SELECT amount
FROM payment
WHERE payment_id = 17510;
문제5번) 영화 카테고리 중에서, Sci-Fi 카테고리의 카테고리 번호는 몇번인가요?
SELECT category_id
FROM category
WHERE name = 'Sci-Fi';
문제6번) film 테이블을 활용하여, rating 등급(?) 에 대해서, 몇개의 등급이 있는지 확인해보세요.
rating 등급의 가짓수가 총 몇가지인지 찾으면 된다. count 함수를 쓰면 되고, 중복을 제거해주는 distinct를 select 다음에 기재해주면 된다.
SELECT count(DISTINCT rating)
FROM film;
문제7번) 대여 기간이 (회수 - 대여일) 10일 이상이였던 rental 테이블에 대한 모든 정보를 알려주세요.
단, 대여기간은 대여일자부터 대여기간으로 포함하여 계산합니다.
WHERE절에서 조건을 입력할 때, 수식을 조건으로 입력하는 것도 가능하다. 이 점을 이용하면 된다.
즉, return_date - rental_date +1 >= 10 처럼 기재하면 된다. 대여일자를 포함해야 하기 때문에 +1을 반드시
기재해주어야 한다.
SELECT *, (date(return_date) - date(rental_date) + 1) AS rental_duration
FROM rental
WHERE (date(return_date) - date(rental_date) + 1) >= 10;
rental_duration 이라는 별도의 컬럼을 생성하여 대여 기간을 나타냈다.
문제8번) 고객의 id가 50,100,150 ..등 50번의 배수에 해당하는 고객들에 대해서, 회원 가입 감사 이벤트를 진행합니다.
고객 아이디가 50번 배수인 아이디와, 고객의 이름 (성, 이름)과 이메일에 대해 확인해주세요.
customer_id가 50의 배수인 것들만 골라내기 위해 50으로 나눴을 때 나머지가 0인 것들을 골라내는 조건을 삽입한다.
MOD 함수를 이용하면 된다.
MOD(n1,n2) : n1을 n2로 나눴을 때의 나머지를 리턴한다
또한 다른 텍스트를 하나로 합치는 기능은 2가지가 있다.
concat 함수와 || 기호(키보드에서 \의 상위 문자가 | (bar라고 읽음) 이다, '또는'의 의미)
concat(문자열1, 문자열2, ...) : 문자열1문자열2를 리턴한다
||은 기호의 성격으로 '문자열1' || '문자열2' 는문자열1문자열2를 리턴한다
SELECT customer_id, first_name , last_name, last_name || ', ' || first_name AS fullname, email
FROM customer
WHERE MOD(customer_id, 50) = 0;
문제9번) 영화 제목의 길이가 8글자인, 영화 제목 리스트를 나열해주세요.
문자열의 길이를 확인하려면 CHAR_LENGTH 함수를 이용하면 된다.
SELECT title
FROM film
WHERE char_length(title) = 8;
문제10번) city 테이블의 city 갯수는 몇개인가요?
혹시 실수로 중복 입력된 데이터가 있을 수 있기 때문에 DISTINCT를 걸어주는 편이 정확도를 높일 수 있다.
SELECT count(DISTINCT city)
FROM city;