feat. 서브쿼리 활용
안녕하세요, 브래드입니다.
오늘은 하나의 SQL문 안에 또 다른 SQL문이 들어가는 서브쿼리 개념을 함께 공부해보겠습니다.
서브쿼리란 하나의 SQL문 안에 또 다른 SQL문이 들어가는 것을 말합니다. 하나의 SQL문으로 풀 수 없을 때 서브쿼리를 사용하여 복잡한 데이터를 추출할 수 있습니다.
서브쿼리가 들어가는 주요 위치는 일반적으로 FROM 절이나 JOIN절 위치에 들어갑니다. 즉, 서브쿼리는 테이블명을 대체하여 쿼리문이 대신 들어가는 것을 알 수 있습니다.
서브쿼리를 사용해야 하는 경우는, 다음 예시와 같이 두 가지로 나뉘는 복합한 구문에서 데이터를 구할 때 사용됩니다.
따라서, 먼저 각각의 구문을 구한 후 합쳐주는 작업이 필요합니다.
먼저, 하루 동안 2개 이상 상품을 구매한 고객을 추출한 모습입니다.
Online_order 테이블에서 userid와 itemid를 가져온 모습입니다.
특히, COUNT를 사용하여 itemid를 가져왔으니, 집계함수를 필터링 해주는 Having 절을 사용하여 2개 이상 상품을 구입한 고객을 구해줍니다. WHERE절과 Having절의 사용을 구분하여 정확히 인지해둘 필요가 있습니다.
어떤 상품을 구매했는지 알기 위하여, 이번엔 상품을 불러오는 작업이 필요합니다.
item 테이블을 조인한 후, Online_order 테이블에서 itemid를 그리고 item 테이블에서는 item_name을 가져와줍니다.
상품을 불러온 쿼리문에 추가로 Join을 추가하여 처음에 구했던 하루동안 2개 이상의 상품을 구매한 고객의 쿼리 문을 삽입해줍니다.
그리고 (AS) 이름 ON oo.userid = 이름. userid를 입력하여 우리가 원하는 데이터를 구하도록 만들어줍니다. 예시에서는 이름을 customer로 입력했는데, 원하는 이름을 입력해줄 수 있습니다. 또한 as는 생략가능합니다.
이를 통해, Online_order 테이블에서 하루 동안 2개 이상의 상품을 구매한 고객이 어떤 상품을 구매했는지에 대한 데이터를 파악할 수 있습니다.
하루 동안 2개 이상의 상품을 구매한 고객이 어떤 상품을 구매했는지를 알아보기 위하여, SELECT 절에 기존에 입력했던 컬럼을 지우고 item_name과 sum(gmv)를 입력해줍니다.
그리고 group by와 order by를 진행하여 우리가 원하는 데이터를 구해줍니다.
다음 예시로 특정한 상품을 구매한 고객이 특정한 상품 외에 어떤 상품을 추가로 구매했는지 알아보는 작업을 진행해보겠습니다. 특정한 상품은 예시로 기본 가디건으로 가정하겠습니다.
item 테이블을 조인한 후 where 절을 추가하여 기본 가디건 아이템을 구매한 고객을 불러옵니다. 추가로 SELECT 절에서 DISTINCT userid를 입력하여 구별되는 userid를 구해줍니다.
직전에 구했던 기본 가디건을 구매한 고객 테이블을 item_name과 sum(gmv)를 구한 테이블에 서브쿼리로 삽입하여 다음과 같이 기본 가디건 외에 추가로 구매한 상품이 무엇인지를 알 수 있습니다.
굳이 기본 가디건을 항목을 보고 싶지 않다면 WHERE 절을 추가하여 기본 가디건을 제외한 항목들을 확인할 수 있습니다.
지금까지 SQL문 안에 또 다른 SQL문을 삽입하여, 원하는 데이터를 구해보는 서브쿼리에 대해 알아보았습니다.
서브쿼리를 함께 연습해보며 복합한 데이터 내에서도 원하는 데이터를 추출할 수 있는 능력을 키워보아요.
브래드였습니다. 감사합니다.