제7장: SQL 기본기 – 쿼리, 조인, 집계
SQL의 기본: 효율적인 질의의 시작
PostgreSQL을 효과적으로 활용하려면 SQL의 기초부터 확실히 다져야 합니다. 대부분의 데이터 조작은 SELECT, INSERT, UPDATE, DELETE와 같은 단순한 명령으로 시작합니다. 하지만, 실전에서는 단순히 정보를 불러오는 것을 넘어서 여러 테이블을 조합하거나, 요약된 데이터를 계산하는 복합 쿼리까지 요구됩니다. 이 장에서는 PostgreSQL에서 가장 핵심이 되는 질의 기술과 다양한 조합 방식, 집계 함수의 심화에 대해 다룹니다.
여러 테이블을 하나로: JOIN의 모든 것
현실의 데이터는 항상 여러 테이블에 분산되어 있습니다. 예를 들어 고객 정보와 주문 내역이 각기 다른 테이블에 저장된 경우, 두 정보를 연결해서 보고 싶다면 JOIN이 필수입니다. PostgreSQL의 JOIN 구문은 두 개 이상의 테이블을 논리적으로 결합하여 원하는 결과를 만들어냅니다. INNER JOIN은 두 테이블에 모두 존재하는 값만을 연결하고, LEFT JOIN은 기준이 되는 테이블의 모든 행을 포함시키면서 관련 정보가 없을 경우 NULL로 채웁니다. RIGHT JOIN, FULL OUTER JOIN 등 다양한 방식이 있는데, 상황에 맞는 JOIN을 선택하면 복잡한 비즈니스 로직도 간결하게 구현할 수 있습니다.
JOIN 연산의 성능은 테이블의 크기, 인덱스 여부, 그리고 조건문의 최적화 방식에 큰 영향을 받습니다. 가능한 한 JOIN 조건에 사용되는 컬럼에 인덱스를 만들고, 불필요한 컬럼이나 데이터 양을 최소화하는 것이 최적화의 핵심입니다. PostgreSQL은 내부적으로 다양한 JOIN 전략을 사용해 효율적인 실행 계획을 수립하므로, EXPLAIN 같은 도구로 쿼리를 분석하는 습관이 중요합니다.
데이터를 요약하는 힘: 집계와 그룹화
실제 데이터 분석 업무에서 가장 자주 활용되는 것이 바로 집계(aggregation)입니다. SUM, AVG, COUNT, MAX, MIN 같은 함수는 테이블 전체 값의 합계나 평균, 개수, 최대/최소값을 빠르게 구할 수 있습니다. GROUP BY 절과 결합하면 특정 컬럼을 기준으로 여러 그룹 별 요약 결과도 산출됩니다. 예를 들어, 부서별 직원 수를 집계하거나, 월별 매출 합계를 쉽게 계산할 수 있습니다.
집계 쿼리에 HAVING 절을 활용하면, 특정 집단만 필터링하여 더 정교한 결과를 얻을 수도 있습니다. 대용량 데이터나 복잡한 집계가 필요한 경우, Common Table Expression(CTE)이나 서브쿼리를 조합하면 쿼리의 가독성과 성능 모두를 놓치지 않을 수 있습니다.
실전 예시와 활용 전략
예상치 못하게 JOIN과 집계가 동시에 필요한 상황이 많습니다. 이때는 먼저 CTE로 미리 데이터 집합을 추려낸 뒤, 필요한 컬럼만 JOIN하여 집계함으로써 처리 속도와 유지보수성을 함께 확보할 수 있습니다. 또한, OUTER JOIN과 함께 미리 집계된 데이터를 결합하는 방식은 누락 데이터까지 고려한 분석에 힘을 실어줍니다.
강력한 SQL 기본기와 함께, PostgreSQL의 최적화 기능 및 실행 계획 해석 능력까지 갖춘다면, 어떤 데이터 분석 과제도 효과적으로 해결할 수 있을 것입니다.