ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <아티클 스터디 : SQL> Select문으로 SQL 쿼리를 시작하지 마라
    아티클 스터디 2024. 1. 6. 01:00

    1. 오늘의 아티클

    출처 : https://towardsdatascience.com/dont-start-your-sql-queries-with-select-clause-d30fa1b701f6

     

    Don’t Start Your SQL Queries with the ‘Select’ Statement

    Follow this right approach to write your SQL queries

    towardsdatascience.com

    2. 아티클 내용 

    <본 아티클 내용은 해당 게시글을 번역 및 요약한 것이다.>

     

    대부분 SQL 개발자들이 SELECT절을 사용하여 쿼리를 작성하기 시작해서 FROM WHERE.. HAVING... 순으로 작성한다. 그러나 이런 작성 방식은 SQL을 잘 모르는 초보자의 경우 구문 오류를 일으킬 수 있다. 따라서 SQL을 작성하는 올바른 방법이 아니다.

     

    이상적인 쿼리 작성 순서

    쿼리 작성 순서는 SQL을 실행했을 때 프로그램이 쿼리를 실행하는 순서와 일치해야한다. 

     

    다음과 같은 테이블의 데이터가 있다고 했을 때 

    고객(Customers) 및 주문(Orders) 테이블을 사용하여 미국/영국에서 총 지출 금액이 $300 이상인 고객 중

    총 지출금액 상위 2명을 찾아야한다고 해보자

     

    1. 항상 FROM/JOIN으로 쿼리를 시작하라 

    FROM Customers
    INNER JOIN Orders
    ON Customers.customer_id = Orders.customer_id

    FROM절을 사용하여 테이블을 읽고 필요한 경우 JOIN을 먼저 수행하여

    사용할 데이터를 불러오는 것으로 쿼리를 시작한다.

    먼저 고객 ID를 기준으로 고객과 주문 데이터를 JOIN하여 FROM절로 불러온다.

     

    2. WHERE절을 작성하라

    FROM Customers
    INNER JOIN Orders
    ON Customers.customer_id = Orders.customer_id
    WHERE country in ('USA','UK')

    실행 순서의 두 번째는 WHERE절이다. FROM으로 불러온 테이블을 필터링한다.

    여기서는 미국/영국 두 나라의 데이터만을 사용할 것이므로 해당 조건을 입력한다.

     

    3. GROUP BY절을 작성하라

    FROM Customers
    INNER JOIN Orders
    ON Customers.customer_id = Orders.customer_id
    WHERE country in ('USA','UK')
    GROUP BY Customers.customer_id

    WHERE절 다음에는 GROUP BY절을 작성한다. 선택한 열을 기준으로 행을 그룹화하는데 사용된다.

    고객 ID를 기준으로 그룹화하고 그룹화를 수행하면 각 그룹(고객ID)은 출력에 하나의 행만을 갖게 된다.

    일반적으로 데이터를 그룹화할 때 집계(합계, 최소, 최대값, 행의 수)를 사용한다.

    이 예시에서는 Customers 테이블에서 금액(amount)의 합계를 찾는다.

     

    4. HAVING절을 작성하라

    FROM Customers
    INNER JOIN Orders
    ON Customers.customer_id = Orders.customer_id
    WHERE country in ('USA','UK')
    GROUP BY Customers.customer_id
    HAVING sum(amount) >300

    HAVING절은 GROUP BY절 이후에 실행되며, 그룹에서 생성된 집계를 필터링 하는데 사용된다.

    예시에서는 각 고객이 지출한 금액의 합계가 300보다 크도록 필터링을 한다.

     

    5. SELECT절을 작성하라

    select Customers.customer_id, sum(amount) as total_amount
    FROM Customers
    INNER JOIN Orders
    ON Customers.customer_id = Orders.customer_id
    WHERE country in ('USA','UK')
    GROUP BY Customers.customer_id
    HAVING sum(amount) >300

    출력하고자 하는 열을 이제 SELECT절에 작성한다.

    GROUP BY절을 사용하여 데이터를 그룹화 한 경우 SELECT문을 사용하여 그룹화된 열을 선택해야한다.

    이 예에서는 고객 ID와 합산된 금액(sum(amount))를 선택하여 각 고객의 총 지출액을 표시한다.

     

    6. ORDER BY를 작성하라

    SELECT Customers.customer_id, sum(amount) as total_amount
    FROM Customers
    INNER JOIN Orders
    ON Customers.customer_id = Orders.customer_id
    WHERE country in ('USA','UK')
    GROUP BY Customers.customer_id
    HAVING sum(amount) >=300
    ORDER BY total_amount desc

    행을 출력할 순서를 제공하는 열을 선택한다.

    상위 지출자를 골라야하기 때문에 총 지출액을 기준으로 내림차순 정렬한다.

     

    7. LIMIT를 작성하여 마무리.

    SELECT Customers.customer_id, sum(amount) as total_amount
    FROM Customers
    INNER JOIN Orders
    ON Customers.customer_id = Orders.customer_id
    WHERE country in ('USA','UK')
    GROUP BY Customers.customer_id
    HAVING sum(amount) >=300
    ORDER BY total_amount desc
    LIMIT 2

    마지막으로 출력에 표시하려는 행수를 제한하는 LIMIT을 작성해준다.

    예시에서는 출력 행수를 2로 제한하여 상위 2명을 조회한다.

    SQL 작성 순서(실행 순서)

     

    결론 

    SQL 실행 순서에 맞게 쿼리를 작성하면 구문 오류를 범하지 않고 효율적인 SQL 작성이 가능하다

    그러므로 위 순서에 맞게 쿼리를 작성하라.

    3. 인사이트

    기존에 코드테스트를 풀 때 습관적으로 뽑아내야하는 컬럼 먼저 SELECT문 옆에 쓴 상태에서

    쿼리 작성을 시작하는 습관이 들었었는데

     

    CTE구문이나 복잡한 조건을 작성해야하는 쿼리의 경우 편의를 위해 SELECT문 부터 작성하고 생각하는 것이

    오히려 쿼리를 작성하는데 방해를 했던 것은 아니었을까 하는 생각이 들었다. 

     

    어렵고 복잡한 쿼리를 요구하는 문제일수록 기본부터 지켜서 실행 순서에 맞게 어떤 테이블이 필요하고 어떤 조건이 필요한지 차근차근 풀어보는 습관을 들여야겠다.

Designed by Tistory.