클릭 수와 조회 수를 집계하는 SQL 쿼리는 리포팅에서 가장 기본이면서도 자주 사용되는 유형입니다. 이 글에서는 서브쿼리와 JOIN 방식을 비교해보고, MySQL(MariaDB)과 Oracle(티베로) 환경에서 각각 어떤 쿼리 문법을 사용하는지 살펴봅니다.
리포팅 쿼리는 왜 중요한가?
- 비즈니스 인사이트를 도출하거나 마케팅 효과를 분석할 때, 클릭 수 및 조회 수는 핵심 지표입니다.
- 실시간 통계판, 관리자 대시보드, 광고주 보고서 등 다양한 곳에서 이 쿼리를 활용합니다.
기본 서브쿼리 방식
🔷 MySQL(MariaDB) 버전
SELECT A.slug,
(SELECT COUNT(*) FROM click_actions WHERE slug = A.slug) AS click_cnt,
(SELECT COUNT(*) FROM page_views WHERE slug = A.slug) AS view_cnt
FROM store_page_info A
GROUP BY A.slug;
SQL🔶 Oracle / 티베로 버전
SELECT A.slug,
(SELECT COUNT(*) FROM click_actions WHERE slug = A.slug) AS click_cnt,
(SELECT COUNT(*) FROM page_views WHERE slug = A.slug) AS view_cnt
FROM store_page_info A
GROUP BY A.slug;
SQL✅ 설명
- 키값(slug)별 클릭 수, 조회 수를 각각 서브쿼리로 조회합니다.
- 단순하고 직관적이지만, 서브쿼리가 각 행마다 반복 수행되기 때문에 성능 저하의 원인이 될 수 있습니다.
- 매장 정보 테이블(store_page_info)의 다른 칼럼 값은 별도로 추가 해야한다.
- 예) A.slug, A.store_nm, 이런식으로 칼럼 추가
성능 개선용 JOIN 방식 (실무 추천)
🔷 MySQL(MariaDB) 버전
SELECT
spi.slug,
COUNT(DISTINCT ca.id) AS click_cnt,
COUNT(DISTINCT pv.id) AS view_cnt
FROM store_page_info spi
LEFT JOIN click_actions ca ON ca.slug = spi.slug
LEFT JOIN page_views pv ON pv.slug = spi.slug
GROUP BY spi.slug;
SQL🔶 Oracle / 티베로 버전
SELECT
spi.slug,
COUNT(DISTINCT ca.id) AS click_cnt,
COUNT(DISTINCT pv.id) AS view_cnt
FROM store_page_info spi
LEFT OUTER JOIN click_actions ca ON ca.slug = spi.slug
LEFT OUTER JOIN page_views pv ON pv.slug = spi.slug
GROUP BY spi.slug;
SQL✅ 설명
- JOIN을 통해 관련 데이터를 한 번에 묶은 뒤 집계하므로 성능이 향상됩니다.
COUNT(DISTINCT ca.id)
처럼 ID 기준으로 중복 방지를 해야 정확한 값이 나옵니다.- Oracle에서는
LEFT OUTER JOIN
을 명시하는 것이 더 명확합니다.
두 방식 비교 정리
- 서브쿼리 방식
- 초급자가 이해하기 쉬움
- slug가 많으면 느림 (N+1 쿼리)
- 유지보수 어려움
- 테스트용, 단순 보고서
- JOIN 방식
- JOIN 이해가 필요함
- 효율적, 대용량에서도 안정적
- 다양한 집계 항목 추가 용이
- 실무 리포트, 관리자 통계
마무리 및 다음 예고
리포팅 쿼리는 실무에서 반복적으로 사용되기 때문에, 성능까지 고려한 구조로 짜는 것이 중요합니다.
이 유형의 DB 쿼리는 검색엔진(구글, 네이버, 다음, 빙) 웹마스터 도구에서도 활용되는 대표적인 통계 집계 방식입니다.
👉 관련 주제인 검색엔진 사이트 등록 가이드 보러가기
다음 글에서는 일자별 클릭 수 집계 쿼리 또는 누적 통계 쿼리 등 실전형 리포트를 이어서 소개할 예정입니다.