목록SQL (23)
tak's data blog
문제 dvd렌탈 시스템의 관리자는 고객별 매출 순위를 알고 싶다. 신규 테이블을 생성해서 고객의 매출 순위를 관리하고 싶으며 신규 테이블의 이름은 customer_rank이고 테이블 구성은 customer_id, customer_rank로 정했다. ctas 기법을 이용하여 신규 테이블을 생성하면서 데이터를 입력해라. ctas(create table as select)란 서브쿼리를 이용한 테이블 생성을 말한다. 1. payment 테이블을 customer_id로 group by한 후 amount의 합계를 구한다. 2. 1번에 추출한 집합을 인라인뷰로 감싸 amount 합계 별 순위를 구한다. 3. ctas문을 이용하여 테이블 생성 및 데이터를 입력한다. 유의해야할 점 : row_number 의 활용성
문제 아래 SQL문은 EXCEPT 연산을 사용하여 재고가 없는 영화를 구하고 있다. 해당 SQL문은 EXCEPT연산을 사용하지 말고 같은 결과를 도출하라. except 연산은 차집합 연산이기 때문에 빼주거나 다양한 방법이 있을 것 같았다. 처음에 left join을 생각해봤지만 다시 생각할 필요가 있었다. 1. film 테이블을 먼저 조회한다. 2. not exists 문을 사용하여 재고 존재하는 집합은 film집합에서 제외 시킨다. 여기서 select 1이란 해당 테이블의 갯수만큼 1로된 행을 출력한다는 뜻이다. 값의 존재유무를 우선시한다. 3. (같은결과를 반환하는 다른 문장) 4. (같은결과를 반환하는 다른 문장) 유의해야할 점 : 재고가 없는 집합을 찾기 위해서 not exists처럼 무언가 존재..
이번에는 집합 연산자와 서브쿼리와 관련된 문제풀이를 시작하겠습니다! 문제 아래 SQL문은 FILM 테이블을 2번이나 스캔하고 있다. FILM 테이블을 한번만 SCAN하여 동일한 결과 집합을 구하는 SQL을 작성해라. 좀더 효율적인 SQL을 위해서 줄이는 과정이다. 1. 분석함수 AVG를 사용해서 평균을 구한다. 2. 위에서 구한 값을 인라인뷰로 감싼 후 평균보다 큰 값을 구한다. 유의해야할 점 : 효율적인 SQL작성을 위해 서브쿼리, 인라인 뷰 등의 활용성과 보기쉽게 작성하는 점이 중요하다.
이번에도 어김없이 문제풀이를 해보겠습니다! 문제 rental과 customer 테이블을 이용하여 현재까지 가장 많이 rental을 한 고객의 고객id, 렌탈순위, 누적렌탈횟수, 이름을 출력해라. 미리 생각할점으로 우선 고객id를 뽑기위해 두 테이블을 조인한다./ 순위를 구해야한다(분석함수를 써야한다. 집계함수로는 안된다.) 1. rental 테이블을 살펴보자. 2. customer 테이블을 살펴보자. 3. 가장 많이 렌탈을 한 고객을 구한다. 4. row_number()를 활용해 순위를 구한다. 5. rental_rank를 기준으로 order by를 한다. 그 후 customer테이블과 조인/ group by를 위해서 max를 쓰게 됨. 6. max를 안쓰고 나타내는 또다른 방법.(결과는 같다.) 유의해..
이번에는 rollup의 유용함을 볼 수 있습니다. rollup은 지정된 grouping 칼럼의 소계를 생성하는데 사용합니다. 문제 rental 테이블을 이용하여 연, 월일, 연월일, 전체 각각의 기준으로 rental_id 기준 렌탈이 일어난 횟수를 출력해라. 1. rental테이블을 살펴보자. 2. 연 기준으로 count해본다. 3. 연월기준으로 count해본다. 4. 연월일 기준으로 count한다. 5. rollup함수를 사용하여 grouping 칼럼의 총계를 생성한다. 유의해야할 점 : rollup함수를 사용하는 것과 날짜 데이터를 다룰 때 사용하는 방식.
지난 문제풀이에 이어서 이번에도 문제풀이를 이어가겠습니다. 문제 고객들에게 단체 이메일을 전송 할때, customer 테이블에서 고객의 email주소를 추출하고, 이메일 형식에 맞지 않는 이메일 주소는 제외시켜라. (이메일 형식은 '@'가 존재해야 하고 '@'로 시작하지 말아야 하고 '@'로 끝나지 말아야 한다.) 1. customer 테이블을 살펴보자. 2. like를 이용해서 이메일 형식의 3가지 조건을 만족하도록 다음과 같이 작성한다. 유의해야할 점 : where절에 like연산자를 사용해서 이메일 형식에 해당하도록 작성해야 한다. 1) '@' 가 존재해야 한다. -> like '%@%' 2) '@' 로 시작하면 안된다. -> not like '@%' 3) '@' 로 끝나도 안된다. -> not l..
SQL을 공부하면서 문제풀이를 공유하고자 합니다. 나아가서 나중에는 직접 데이터를 가져와 문제 풀이 내용을 바탕으로 실습해볼 예정입니다!! 문제 payment 테이블에서 단일 거래의 amount의 액수가 가장 많은 고객들의 customer_id를 추출해라. 단, customer_id의 값은 유일. 1. payment 테이블의 구조를 살펴본다. 테이블을 살펴본 후 한꺼번에 생각하지 말고 차례대로 나눠서 생각해보자 2. 전체 거래 중 amount의 액수가 가장 큰 amount를 구한다. 첫번째로 desc를 써 내림차순으로 한 후 limit 1을 정해 가장 큰 amount를 구합니다. 3. payment 테이블에서 가장 큰 amount를 가진 customer_id를 구하고 중복을 제거한다. where절에서 서..