411. 디비전 (Division, ÷) 연산

⚠️ 이 문서는 관계 대수(409번 문서) 연산 중 가장 이해하기 까다로운 개념으로, 수학의 나눗셈처럼 **"A 테이블에서 B 테이블이 가진 조건들을 '모두' 만족하는 데이터만 몫으로 남기는 특수한 검색 연산인 '디비전'"**을 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 두 개의 릴레이션 $R$과 $S$가 있을 때, $R \div S$는 **"$S$의 모든 조건을 빠짐없이 만족하는 $R$의 튜플만 추출하라"**는 뜻이다.
  2. 가치: "모든", "전부"라는 까다로운 교집합 조건을 걸어 검색할 때 아주 유용하다. (예: "수학, 영어, 과학을 모두 수강하는 학생을 찾아라")
  3. 실무 한계: SQL에는 이 ÷ 기호와 똑같이 작동하는 단일 명령어가 없다. 그래서 실무에서는 NOT EXISTSGROUP BY ... HAVING COUNT를 조합해서 억지로 똑같은 결과를 만들어내야 한다.

Ⅰ. 개요: 깐깐한 손님의 주문 (Context & Necessity)

"우리 식당 메뉴 중에서 김밥, 떡볶이, 튀김을 전부 다 시킨 테이블을 찾아봐."

이 질문을 데이터베이스에 날리려면 머리가 아파진다.

  • "김밥을 시키거나 떡볶이를 시킨 테이블"은 WHERE 메뉴 = '김밥' OR 메뉴 = '떡볶이'로 쉽게 찾는다.
  • 하지만 **"전부 다(All)"**를 만족해야 하는 질문은 AND로 묶기도 애매하다. 한 사람이 메뉴 3개를 동시에 시킬 순 있어도, 데이터베이스의 한 줄(Tuple)에는 메뉴 1개씩만 들어가기 때문이다.

이런 깐깐한 교집합 질문을 한 방에 해결하기 위해 수학자들이 만들어낸 기호가 바로 디비전($\div$) 연산이다.

📢 섹션 요약 비유: 디비전 연산은 **'스탬프 투어 완성자 찾기'**와 같습니다. A, B, C 코스 스탬프(기준 릴레이션 S)를 모두 찍은 사람(릴레이션 R)만 골라내어 최종 선물(결과값)을 주는 깐깐한 심사 위원입니다. 하나라도 안 찍혀있으면 무조건 탈락입니다.


Ⅱ. 디비전(÷) 연산의 완벽한 이해 ★

디비전 연산이 어떻게 작동하는지 표를 통해 직관적으로 이해해 보자.

[ R 릴레이션 (수강 현황) ]

학번과목명
100수학
100영어
100과학
200수학
200영어

[ S 릴레이션 (검색 기준) ]

과목명
수학
영어
과학

🎯 연산: $R \div S$ (결과)

학번
100

해설:

  • 기준이 되는 S 릴레이션의 데이터는 수학, 영어, 과학 3개다.
  • R 릴레이션을 보니, 200번 학생은 수학과 영어만 듣고 과학은 안 듣는다 (탈락!).
  • 100번 학생만이 S에 있는 3과목을 '모두' 듣고 있다 (합격!).
  • 따라서 결과는 100번 학생의 학번만 남게 된다.

Ⅲ. 실무에서의 디비전 구현 (SQL 꼼수)

위에서 말했듯, SQL에는 DIVISION 이라는 명령어가 없다. 하지만 정보처리기사 실기나 코딩 테스트에서는 "디비전 연산과 똑같은 결과를 내는 SQL을 짜보시오"라는 문제가 종종 등장한다. 가장 흔한 꼼수는 **'숫자 세기(GROUP BY + COUNT)'**다.

-- 꼼수 1: COUNT를 이용한 디비전 구현 (가장 쉽고 직관적임)
SELECT 학번
FROM 수강
WHERE 과목명 IN ('수학', '영어', '과학')
GROUP BY 학번
HAVING COUNT(DISTINCT 과목명) = 3; 
-- (내가 수강한 3과목이 저 3과목과 일치하는가?)
-- 꼼수 2: NOT EXISTS를 이중으로 사용하는 방법 (정통 SQL 방식, 엄청 헷갈림)
SELECT DISTINCT 학번 FROM 수강 R1
WHERE NOT EXISTS (
    SELECT * FROM 기준 S
    WHERE NOT EXISTS (
        SELECT * FROM 수강 R2
        WHERE R1.학번 = R2.학번 AND R2.과목명 = S.과목명
    )
);
-- (해석: "S의 과목 중 R1 학생이 수강하지 않은 과목이 존재하지 않는 학생을 찾아라")

Ⅳ. 결론

"디비전은 관계 대수 8형제 중 가장 이질적이면서도 매력적인 연산이다." 디비전 연산은 사실 '카테시안 곱, 차집합, 프로젝션' 세 가지 기본 연산자를 복잡하게 섞어놓은 파생 연산자다. 실무에서 이 연산을 직접 쓸 일은 거의 없지만, "A 집합이 B 집합의 모든 요소를 포함하고 있는가?"를 묻는 복잡한 비즈니스 로직(예: 졸업 필수 과목을 모두 수강했는지 검사하는 로직)을 마주쳤을 때, 디비전의 철학을 이해하고 있으면 훨씬 더 우아하고 빠른 SQL 쿼리를 설계할 수 있다.


📌 관련 개념 맵

  • 상위 개념: 관계 대수 (Relational Algebra - 409번 문서)
  • 비교 연산자: 카테시안 곱 (Cartesian Product - 412번 문서)
  • SQL 구현체: NOT EXISTS, HAVING COUNT
  • 시험 빈출 키워드: "모두 만족하는", "릴레이션 A를 B로 나누는"

👶 어린이를 위한 3줄 비유 설명

  1. 디비전 연산은 까다로운 '아이돌 팬클럽 가입 심사'와 같아요.
  2. 심사 기준(S 릴레이션)이 "우리 오빠 1집, 2집, 3집 앨범 다 있어야 해!"라고 정해져 있어요.
  3. 1집과 2집만 있는 사람은 쫓겨나고, 1, 2, 3집 앨범을 '전부 다' 가진 진짜 팬 1명(결과 튜플)만 통과시켜 주는 게 바로 디비전이랍니다!