SQLD 서브쿼리 개념부터 단일행·다중행·연관 서브쿼리 총정리
SQL 서브쿼리의 세계로 떠나는 여정
데이터베이스를 다루다 보면 복잡한 조건의 데이터를 한 번에 가져와야 하는 상황을 자주 마주하게 됩니다. 이때 가장 강력한 도구가 바로 서브쿼리입니다. SQLD 자격증을 준비하는 분들뿐만 아니라 현업에서 데이터를 다루는 실무자들에게도 서브쿼리는 마치 마법과 같은 존재입니다. 서브쿼리는 쿼리문 안에 또 다른 쿼리문을 포함하는 방식을 말하는데, 이를 잘 활용하면 여러 단계의 복잡한 절차를 단 한 번의 SQL 실행으로 해결할 수 있습니다. 오늘은 서브쿼리의 기초부터 실전 활용 팁까지 상세히 알아보겠습니다.
서브쿼리가 왜 중요한가
데이터 분석이나 개발을 할 때 우리는 종종 기준값이 유동적인 데이터를 조회해야 합니다. 예를 들어 ‘전체 평균 급여보다 많이 받는 직원들’을 뽑고 싶다고 가정해 봅시다. 평균 급여는 전체 데이터를 집계해야 알 수 있고, 그 평균값보다 큰 사람을 찾으려면 다시 전체 테이블을 뒤져야 합니다. 서브쿼리를 사용하지 않는다면 평균을 구하는 쿼리를 먼저 실행하고, 그 결과를 다시 메인 쿼리에 입력하는 번거로운 과정을 거쳐야 합니다. 서브쿼리는 이 과정을 논리적으로 결합하여 코드의 가독성을 높이고 유지보수를 쉽게 만듭니다.
서브쿼리의 다양한 유형 이해하기
서브쿼리는 반환되는 데이터의 형태와 메인 쿼리와의 연관성에 따라 몇 가지 유형으로 나뉩니다. 각 유형별 특성을 이해하는 것이 SQLD 합격과 실무 역량 강화의 지름길입니다.
단일행 서브쿼리
단일행 서브쿼리는 실행 결과가 단 하나의 행만 반환하는 쿼리를 의미합니다. 주로 비교 연산자(=, <, >, <=, >=, <>)와 함께 사용됩니다.
- 특징: 하나의 값만 반환하므로 메인 쿼리와의 연산이 명확합니다.
- 예시: 급여가 가장 높은 직원의 정보를 가져올 때, ‘최대 급여값’을 구하는 서브쿼리가 해당됩니다.
- 주의사항: 만약 서브쿼리의 결과가 두 개 이상 반환된다면 에러가 발생하므로 주의해야 합니다.
다중행 서브쿼리
다중행 서브쿼리는 결과값이 여러 행으로 반환되는 경우입니다. 단일행 연산자로는 처리할 수 없으며, 다중행 연산자를 사용해야 합니다.
- IN: 서브쿼리의 결과값 중 하나라도 일치하면 참입니다.
- ANY: 서브쿼리의 결과값 중 하나라도 조건을 만족하면 참입니다.
- ALL: 서브쿼리의 모든 결과값을 만족해야 참입니다.
- EXISTS: 서브쿼리의 결과가 존재하기만 하면 참을 반환합니다.
연관 서브쿼리
연관 서브쿼리는 메인 쿼리의 컬럼을 서브쿼리 내부에서 참조하는 방식입니다. 메인 쿼리의 각 행에 대해 서브쿼리가 반복적으로 실행되기 때문에 성능 면에서 신중한 접근이 필요합니다. 주로 특정 부서 내에서 평균보다 높은 급여를 받는 사람을 찾을 때와 같이 ‘행별 비교’가 필요할 때 사용합니다.
실생활에서의 서브쿼리 활용 시나리오
우리가 사용하는 쇼핑몰 앱을 생각해보겠습니다. ‘최근 3개월 동안 구매 이력이 있는 고객 중, 이번 달 신규 가입자’를 찾으려면 어떻게 해야 할까요?
- 메인 쿼리: 고객 테이블에서 이번 달 가입자를 조회합니다.
- 서브쿼리: 구매 테이블에서 최근 3개월 구매 이력이 있는 고객 아이디 목록을 가져옵니다.
- 결합: IN 연산자를 사용하여 이 두 조건을 연결합니다.
이처럼 서브쿼리는 비즈니스 로직을 SQL 문장에 자연스럽게 녹여내는 역할을 합니다.
전문가가 말하는 서브쿼리 활용 팁
많은 초보자가 서브쿼리를 남발하여 데이터베이스 성능을 저하시키곤 합니다. 전문가들이 강조하는 몇 가지 조언을 정리해 드립니다.
성능을 고려한 쿼리 작성
연관 서브쿼리는 메인 쿼리의 데이터 건수만큼 반복 실행되므로 데이터 양이 많아질수록 속도가 급격히 느려집니다. 가능하면 조인(JOIN)으로 변경할 수 있는지 먼저 검토하세요. 조인은 데이터베이스 엔진이 최적화하기 더 좋은 구조인 경우가 많습니다.
명확한 별칭 사용
서브쿼리를 사용할 때는 반드시 AS를 이용해 별칭을 부여하세요. 특히 다중 테이블을 다룰 때 별칭이 없으면 어떤 컬럼이 어느 테이블에서 왔는지 혼동하기 쉽습니다. 이는 코드의 가독성을 높이고 협업 시 실수를 방지하는 가장 기본적인 습관입니다.
서브쿼리 대신 CTE 활용하기
최근의 SQL 버전에서는 WITH 구문을 사용하는 CTE(Common Table Expression)를 적극 권장합니다. 서브쿼리가 복잡해질수록 괄호가 겹치며 코드를 읽기 힘들어지는데, CTE를 사용하면 논리적인 단계를 분리하여 훨씬 깔끔한 쿼리를 작성할 수 있습니다.
자주 묻는 질문과 답변
Q: 서브쿼리는 WHERE 절에서만 쓸 수 있나요?
A: 아닙니다. 서브쿼리는 WHERE 절뿐만 아니라 SELECT 절(스칼라 서브쿼리), FROM 절(인라인 뷰) 등 거의 모든 곳에서 사용할 수 있습니다. SELECT 절에 쓰이는 서브쿼리는 마치 엑셀의 VLOOKUP처럼 작동하여 특정 값을 가져올 때 매우 유용합니다.
Q: 서브쿼리의 결과가 NULL이면 어떻게 되나요?
A: 연산자에 따라 다르지만, 일반적으로 NULL과 비교하면 결과는 알 수 없음(UNKNOWN) 상태가 됩니다. 따라서 IN 연산자를 사용할 때 서브쿼리 결과에 NULL이 포함되어 있으면 기대하지 않은 결과가 나올 수 있으니 주의가 필요합니다. 항상 IS NOT NULL 조건 등을 활용해 데이터를 정제하는 것이 좋습니다.
Q: 인라인 뷰는 무엇인가요?
A: FROM 절에 사용되는 서브쿼리를 인라인 뷰라고 합니다. 테이블처럼 동작하며, 복잡한 집계 데이터를 미리 계산해두고 메인 쿼리에서 가져다 쓸 때 사용합니다. 페이지네이션(데이터 10개씩 끊어서 보기)을 구현할 때 필수적인 개념입니다.
비용 효율적인 데이터베이스 운영을 위한 서브쿼리 전략
데이터베이스 자원은 유한합니다. 불필요하게 복잡한 서브쿼리는 CPU와 메모리 사용량을 높입니다. 비용을 절감하면서 효율적인 SQL을 작성하려면 다음의 전략을 기억하세요.
- 불필요한 서브쿼리 제거: 조인으로 해결 가능한 것은 조인을 우선 사용하세요.
- 인덱스 활용: 서브쿼리 내부에서 검색 조건으로 사용하는 컬럼에는 반드시 인덱스를 생성하세요.
- 데이터 범위 제한: 서브쿼리 내부에서 처리하는 데이터의 범위를 최소화하세요. WHERE 절을 통해 최대한 행을 줄인 뒤 메인 쿼리와 결합하는 것이 유리합니다.
- 실행 계획 확인: EXPLAIN 명령어를 통해 SQL이 어떻게 실행되는지 확인하는 습관을 들이세요. 비용(Cost)이 높은 쿼리는 반드시 개선의 여지가 있습니다.
데이터베이스를 다루는 것은 요리와 같습니다. 좋은 재료(데이터)가 있어도 조리법(SQL)이 나쁘면 맛있는 요리(정보)를 만들기 어렵습니다. 서브쿼리는 여러분의 요리 실력을 한 단계 높여줄 고급 조리 도구입니다. 처음에는 괄호와 쉼표를 챙기는 것이 낯설 수 있지만, 반복적으로 연습하다 보면 데이터의 흐름을 꿰뚫어 보는 눈을 갖게 될 것입니다. SQLD 자격증 취득을 넘어, 실무에서 데이터를 자유자재로 다루는 전문가로 성장하시길 응원합니다. 지금 바로 간단한 데이터셋을 열고 서브쿼리를 직접 작성해 보는 것부터 시작해보세요. 직접 실행해 본 쿼리 한 줄이 책 한 권보다 더 큰 깨달음을 줄 것입니다.
ace


댓글 0
첫 댓글을 남겨보세요.