SQL 쿼리 문법을 활용하여 데이터 분석을 진행하기(4)

2023. 12. 7. 20:08TIL

테이블을 집합으로 생각하기
  • INNER JOIN: l ∩ r
  • LEFT JOIN: l ∪ (l ∩ r)
  • LEFT ANTI JOIN: l - (l ∩ r)
  • RIGHT JOIN: r ∪ (l ∩ r)
  • RIGHT ANTI JOIN: r - (l ∩ r)
  • FULL OUTER JOIN: l ∪ r

 WHERE절로 필터링을 할 때 최대한 먼저 필터링해서 집합의 크기를 작게 만들어 놓고 JOIN을 하는 게 실행시간이 적게 걸리고 효율적이다.

 

*,% 사용 지양하기
SELECT product_id, category, name
FROM products
LIMIT 10

 새로운 테이블을 접할때 데이터 일부를 보고 테이블을 파악을 해야 한다. 행의 수가 어마어마할 수 있기 때문에 LIMIT을 걸고 테이블을 조회해야 한다.

 

SELECT clk_index, user_name, product_id
FROM clicks
WHERE date = '20231207'
LIMIT 10

 마찬가지로 파티션이 있는 테이블인지 확인하고, 파티션을 필터 조건으로 걸고 테이블을 조회해야 한다.

 

SELECT product_id, category_name, sales_yn
FROM products
LIMIT 10

 컬럼 수가 많은 테이블이 있을 수 있기 때문에 SELECT * 를 지양해야 한다.

 

SELECT product_id, name
FROM products
WHERE name LIKE '23FW%'
LIMIT 10

 LIKE 사용 시 %을 사용하면 문자열의 제한이 없기 때문에 %는 제한적으로 사용하고 __를 대신 사용한다.

 

데이터 타입 잘 확인하기
SELECT count(1)
FROM clicks
WHERE date > '20231031'

 SQL에서는 비교하는 변수의 형태가 다를 때 알아서 형태를 변환하여 비교하는 것(묵시적 형 변환)을 지원한다. 하지만 형태를 변환하는 시간만큼 쿼리가 비효율적이라 형태를 잘 확인해야 한다. 

 

WITH clk as (
    SELECT clk_index, event_index, date
    FROM clicks
),
event as (
    SELECT event_index, DATE_FORMAT(event_end, '%Y%m%d') as event_end_dt
    FROM events
)
SELECT count(1)
FROM clk INNER JOIN event ON clk.event_index = event.event_index
WHERE date <= event_end_dt

 이벤트 관련 상품을 클릭한 사람들 중 이벤트가 끝나기 전 클릭수를 집계하는 쿼리이다. clk테이블의 date와 event테이블의 date format이 달라서 맞춰주기 위해 DATE_FORMAT 함수를 사용하였다. WHERE절에서 컬럼쪽에 함수를 사용할 경우 인덱스를 사용할 수 없다. 그래서 WHERE절에서 왼쪽 컬럼에 함수 적용을 지양해야 한다. 

 

 

JOIN시 유의할 점
  • JOIN하는 테이블 간의 관계를 고려하기(1:1, 1:n, n:n)
  • 데이터 중복이 있는지 확인하기(중복 고려를 안 할 시 쿼리 처리속도가 느려질 수도 있고, 의도했던 것과 다른 결과를 얻을 수도 있다.)
  • 여러 가지 쿼리 방식을 고려하기(쿼리 방식에 따라 같은 결과라도 처리시간이 달라진다.)

 

가독성 높이기
  •  서브쿼리 보다는 WITH 구문이 좋은 가독성
  • WITH 절을 사용할 때, 각 블록 이름을 잘 지정하기
  • 쿼리가 복잡해지면 중간에 주석 작성

 

공부하며 어려웠던 내용

 배운 내용을 유념하여 SQL 쿼리 작성하는 습관을 잘 들여놔야겠다.