본문 바로가기

Data Literacy/SQL

Chapter 1. 데이터 조회, 필터링(5) - 실전 예제1 [2/2]

PostgreSQL logo image

 

 

 

 

Q. rental 테이블에서, 대여 기간(회수일 - 대여일)이 10일 이상이었던 건에 대해서 모든 정보를 출력하세요. 
     단, '대여 기간'은 대여일까지 포함하여 계산합니다. 예를 들어 대여 1/1 ~ 회수 1/3이라면, 총 3일로 계산합니다.

 

우선은 rental 테이블 전체를 조회해서 정보를 확인해 보겠습니다. 

 

 

위 데이터 중에서 [rental_date][return_date]를 사용해야 할 듯 합니다. 하지만 해당 칼럼에는 시각까지 포함되어 있기 때문에, date 함수를 사용해 형 변환까지 진행해야 합니다. 

 

그리고 두 칼럼 값의 차이를 조건에 맞게 계산하고, 해당 결과 값이 10보다 크거나 같은 건들을 출력하면 되겠네요. 이를 순서대로 쿼리로 작성해 보겠습니다. 

 

select *,
       date(return_date),
       date(rental_date),
       date(return_date) - date(rental_date) + 1 as during 
  from rental r 
 where date(return_date) - date(rental_date) + 1 >= 10

 

date() 함수를 통해 날짜+시간 칼럼을 날짜 항목으로 바꾸는 것은 조금 익숙해지셨을 것입니다. 한 가지, SELECT에서 as를 이용해 일정한 연산을 한 새로운 칼럼의 이름을 붙여 추가로 출력하는 방법도 확인하시기 바랍니다. 

 

 

 


 

 

Q. 고객의 ID(customer_id)는 숫자로 되어 있습니다. 회원 50만 명 달성 이벤트를 위해, 고객 ID가 50, 100, 150, 200... 이렇게 50의 배수에 해당하는 고객들에 대해서 쿠폰을 증정하려고 합니다. 고객 아이디가 50의 배수인 ID, 그리고 고객의 이름(성+이름 합쳐서!), 이메일을 추출해 주세요.

 

 

우선, 이 경우는 '특정 조건에 부합하는' 칼럼들을 출력하는 케이스입니다. 그럼, 그 '조건'을 제외하고 칼럼을 출력하는 것만 먼저 진행해 보겠습니다. 여기서 필요한 테이블은 일단 CUSTOMER겠죠. 여기에서 출력할 칼럼을 추려보면 우선 CUSTOMER_ID / FIRST_NAME / LAST_NAME / EMAIL 이 필요할 것 같습니다. 그런데 하나 특이 사항은 성과 이름을 굳이 합쳐달라는 요구 조건도 있었습니다. 

 

성과 이름을 하나의 칼럼에 합쳐서 새로 생성하고, 이를 FULL_NAME이라고 불러보겠습니다. 그럼 이 FULL_NAME은 어떻게 생성할까요? FIRST_NAME 과 LAST_NAME 사이에 엑셀처럼 '+'를 붙여주면 될까요? 

 

SQL에서는 concat을 사용해 줍니다. 기호 ' || '를 사용해 줍니다. 여기서 FIRST_NAME과 LAST_NAME 사이에 쉼표를 하나 더해서 두 개의 칼럼을 합치고 새로운 칼럼을 만드는 것까지 완료해서 다음과 같이 쿼리를 완성해 보겠습니다.

 

select customer_id ,
       first_name ,
       last_name ,
       first_name || ', ' || last_name as full_name ,
       email 
  from customer c

 

 

 

우선 우리가 원하는 데이터의 칼럼들은 모두 추출한 것 같습니다. 이제 조건을 붙여야 하겠습니다. WHERE로 붙이면 될 것 같은데, 어떤 조건을 붙여야 할까요? 간단하게, CUSTOMER_ID를 50으로 나눈 '나머지'가 0인경우입니다. 몫이 아닌 나머지가 0이라는 점을 주의합시다.

 

이제 여기서는 특정 나눗셈의 나머지를 구하는 함수를 사용해야 합니다. MOD(분자, 분모)를 사용해 주면 되겠습니다. 이제 조건을 붙여 추출해 보겠습니다. 

 

select customer_id ,
       first_name ,
       last_name ,
       first_name || ', ' || last_name as full_name ,
       email 
  from customer c 
 where mod(customer_id, 50) = 0

 

 

 

 


 

 

 

Q. 영화배우들의 이름을 모두 대문자로 FULL NAME 칼럼을 만들어서 FIRST_NAME과 LAST_NAME을 합쳐서 추출해주세요. 중복이 있다면 제거합니다.

 

우리가 지금까지 배워온 내용들을 이용하면, 충분히 쉽게 해결할 수 있을 것 같습니다. 대문자 변환 함수가 upper()라는 점만 기억하시면 됩니다.

 

select distinct upper(first_name || ' ' || last_name) as actor_fullname
       from actor a

 

 

 

 


 

 

 

Q. FILM 테이블에서 대여 기간(RENTAL_DURATION)이 7일 이상인 영화의 FILM_ID, TITLE, DESCRIPTION 정보를 추출해 주세요.

 

select film_id , 
       title ,
       description
  from film f
 where rental_duration >= 7