ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION364 / 1500
데이터베이스난이도 중하5분 답변 목표 · 보강본

구매 이력이 있는 회원만 조회하려고 주문과 JOIN했더니 회원이 여러 번 나옵니다. EXISTS는 어떤 차이가 있나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

필요한 것이 주문의 컬럼이 아니라 관련 주문의 존재 여부라면 EXISTS로 의미를 직접 표현할 수 있습니다. 일대다 JOIN은 자식 수만큼 부모 행을 늘릴 수 있어 중복과 페이지 경계가 달라집니다.

동작 원리와 전제

회원 A에 주문 세 개가 있으면 JOIN 결과는 A가 세 번 나올 수 있습니다. EXISTS는 조건에 맞는 주문이 하나라도 있는지를 판정하므로 회원을 한 번 반환하는 질의에 맞습니다. 옵티마이저는 이를 semi join 등으로 바꿀 수 있지만 실제 실행이 항상 같은 알고리즘이라는 뜻은 아닙니다.

선택과 실패 처리

DISTINCT를 추가해 결과를 맞출 수도 있지만 넓은 행의 정렬·해시 비용과 원래 의도를 봅니다. 최신 주문의 값까지 필요하다면 EXISTS만으로 부족하고 별도 집계·윈도 함수·제한된 조인을 선택해야 합니다. 부재를 찾는 NOT EXISTS는 NULL 포함 NOT IN과 의미가 다를 수 있습니다.

구체적인 사례와 검증

상위 20명의 회원을 보여 주려는 화면에서 JOIN 결과에 LIMIT 20을 걸면 주문이 많은 회원 몇 명만 남을 수 있습니다. 회원 존재 조건만 필요한 경우 EXISTS로 부모 집합을 정하고 그 뒤 필요한 주문 세부를 별도 조회할 수 있습니다. '쿼리 하나가 항상 빠르다'는 판단보다 부모·자식의 반환량과 네트워크 비용을 비교합니다. EXISTS의 내부 SELECT 컬럼은 존재 판정 목적이지만 엔진이 실제로 어떻게 실행하는지는 계획으로 확인합니다. 조건에 함수나 잘못된 타입 변환이 있으면 적절한 외래키 인덱스가 있어도 넓게 읽을 수 있습니다. 결과 의미와 접근 비용을 분리해서 검증하겠습니다.

주문 없음·한 개·여러 개·NULL 관계를 포함해 반환 회원 수와 LIMIT 동작을 확인합니다. 외래키 인덱스와 실제 계획을 보고 읽은 행·반환 행·중복 제거 비용을 비교합니다. 문법의 짧음보다 필요한 관계가 존재인지 값 결합인지 먼저 선언하는 것이 중요합니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 핵심 구분: 필요한 것이 주문의 컬럼이 아니라 관련 주문의 존재 여부라면 EXISTS로 의미를 직접 표현할 수 있습니다.
  • 선택 조건: DISTINCT를 추가해 결과를 맞출 수도 있지만 넓은 행의 정렬·해시 비용과 원래 의도를 봅니다.
  • 검증 기준: 주문 없음·한 개·여러 개·NULL 관계를 포함해 반환 회원 수와 LIMIT 동작을 확인합니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 일대다 JOIN의 LIMIT을 부모 개수 제한과 같다고 본다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 조건에 NULL이 포함되면 TRUE·FALSE 외의 결과가 필터와 집계에 어떤 영향을 주나요?
  • 한 요청의 DB 왕복을 줄이면서 부모 행과 페이지의 의미를 보존하려면 어떤 조회를 묶나요?
  • 동등 조건·범위·정렬을 함께 만족시키려면 복합 인덱스의 탐색 경계를 어떻게 정하나요?

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기