[SQL] 제로베이스 - 데이터 조회와 필터링 실습문제 1, 2 풀이

2406 단어 비개발자sqlITIT
제로베이스 SQL 완주반 실습문제 풀이 노트
활용 데이터셋 : dvdrental (sql sample data)

Q1. Payment 테이블에서 단일 거래의 amount의 액수가 가장 많은 고객들의 customer_id를 추출하라.
단, customer_id의 값은 유일해야 한다.


🧨 1차 시도

select
	amount
from
	payment
order by
	amount desc
;
select
	customer_id
from
	payment
where
	amount = '11.99'
  • 서브쿼리 개념에 대해 진도가 나가지 않은 상태라, 처음에는 이렇게 분리해서 풀었다.
    원하는 값이 나오기는 했지만, 더 간결하게 풀 수 있는 방법이 없을까?

🧨 2차 시도

select
	customer_id
from
	payment
where
	amount
    	in (select
        	amount
            from
            	payment
            order by
            	amount desc
            limit 1)
;
  • 이번에는 서브쿼리를 활용했다.
    처음에는 서브쿼리의 select 값에 넣어야 할 알맞은 column을 못 찾아서 값이 안 나왔는데 적절하게 고쳐 보았다.
    order by~desc로 max값을 구하고 limit 1으로 최댓값 하나 산출하기!

🎉 인스트럭터의 모범 풀이 & 📖 문제 풀이 순서 분석하기

select          		      --- (2). payment 테이블에서 가장 큰 
      distinct A.customer_id	    	  amount를 가진 customer_id를 구하고
from					  중복을 제거한다.
	payment A
where
	A.amount = (select            --- (1). 우선, 전체 거래 중 amount의 
    			K. amount	   액수가 가장 큰 amount를 구한다.
                from
                	payment K
                order by
                	k.amount desc
                limit 1)
;
  • 앨리어스 처리 해준 후 서브쿼리를 사용했다.
    뜯어 보면 내가 풀이한 것과 같은데, 주목할 부분은 가독성을 위한 앨리어스 처리.

Q2. 고객들에게 단체 이메일을 전송하고자 한다. Customer 테이블에서 고객의 email 주소를 추출하고, 이메일 형식에 맞지 않는 이메일 주소는 제외시켜라.
(이메일 형식은 '@'가 존재해야 하고, '@'로 시작하지 말아야 하고, '@'로 끝나지 말아야 한다.)


🧨 1차 시도와 correction

select
	email
from
	customer c
where
	email like '%@%'
and
	email not like '@%'
and
	email not like '%@'
;
  • 이 문제는 황당하게 틀렸다. 바로 where~like절 사이에 column명을 안 넣어줬기 떄문... 모든 걸 다 잘했는데! 이렇게 황당한 실수를 줄여나가기 위해서는 역시 쿼리를 많이 작성해보는 수 밖에 없는 것 같다.

좋은 웹페이지 즐겨찾기