DA Study/TIL

[TIL] 조건 비교를 위한 IN / EXISTS 구문 활용(서브쿼리) # MySQL # SQL

harrym8n 2025. 1. 3. 14:23

HackerRank Intermediate - Binary Tree Nodes
👉 문제 바로가기(HackerRank)

-- Find the node type of Binary Tree(Root, Leaf, Inner)
-- Order by the value of the node

-- 풀이1) IN 구문 활용
SELECT 
    N,
    CASE WHEN P IS NULL THEN 'Root'
         WHEN P IS NOT NULL AND
              N NOT IN (SELECT P AS N FROM BST WHERE P IS NOT NULL) THEN 'Leaf'
         ELSE 'Inner'
    END AS NODE
FROM BST
ORDER BY N

-- 풀이2) EXISTS 구문 활용
SELECT N, 
      CASE WHEN p IS NULL THEN 'Root' 
      WHEN EXISTS (select P from BST t1 where t2.N = t1.P) THEN 'Inner'
      ELSE 'Leaf' END AS NODE
FROM BST t2
ORDER BY N

[ 논리 과정 ]

  1. 노드 유형인 Root, Leaf, Inner 조건 정리
  2. IN 구문을 통해 조건 비교하여 유형 구분 후 출력

[ 문제 상황 ]

  • IN 구문은 조건을 비교할 때 서브쿼리를 먼저 실행해 결과를 메모리에 저장하고 메인쿼리에 비교하기 때문에 서브 쿼리의 row가 많을수록 EXISTS 보다 성능이 떨어지게 된다.
  • 서브 쿼리 ROW가 많다고 가정했을 때, 쿼리 성능 개선이 요구된다.

[ 해결 ]

  • IN 구문 대신 EXISTS 구문을 사용하여 조건을 비교해 부합하는 데이터를 선별한다.

[ 회고 ]

  • EXISTS 구문과 IN 구문의 차이
    • EXISTS : 메인 쿼리의 각 ROW에 대해 서브쿼리를 실행하고, 서브쿼리가 결과를 반환하는지 여부를 확인합니다. (메인 쿼리 > 서브 쿼리)
      • 작동 방식
        1. 메인 쿼리의 각 행에 대해 서브쿼리를 반복적으로 실행합니다.
        2. 서브쿼리가 조건을 만족하는지 확인하고, 만족하는 행이 있으면 TRUE를 반환하여 메인 쿼리가 해당 행을 포함합니다.
        3. 조건이 충족되면 바로 종료하므로 전체 서브쿼리를 실행하지 않아도 됩니다.
    • IN : 메인 쿼리에서 주어진 값이 서브쿼리의 결과 집합에 포함되는지 확인 (서브 쿼리 > 메인 쿼리)
      • 작동 방식
        1. 서브쿼리가 먼저 실행되어 결과를 메모리에 저장합니다.
        2. 메인 쿼리는 저장된 결과와 비교하여 일치하는 행을 반환합니다.