데이터 기반 테이블 관계와 조인의 필요성
데이터베이스를 설계하다 보면 테이블 간의 관계가 명시적인 외래 키로 정의되지 않고, 데이터 값 자체에 의존하는 경우가 있습니다. 이런 상황에서는 일반적인 방식으로 테이블을 조인하기 어렵지만, SELECT 목록에서 CASE 문을 활용하면 다양한 조인 가능성을 손쉽게 처리할 수 있습니다.
예제 테이블 소개
먼저 학생 정보를 담고 있는 Student_Detail 테이블을 살펴보겠습니다.
mysql> Select * from student_detail; +----+---------+ | Id | Name | +----+---------+ | 1 | Harshit | | 2 | Rahul | | 3 | Aarav | +----+---------+ 3 rows in set (0.00 sec)
그다음, 각 학생별로 별도로 생성된 세 개의 테이블 — Student_Harshit, Student_Rahul, Student_Aarav — 에는 해당 학생에 대한 평가(remarks)가 저장되어 있습니다.
mysql> Select * from Student_Harshit; +----+-----------+ | Id | Remarks | +----+-----------+ | 1 | Excellent | +----+-----------+ 1 row in set (0.00 sec) mysql> Select * from Student_Rahul; +----+---------+ | Id | Remarks | +----+---------+ | 2 | Average | +----+---------+ 1 row in set (0.00 sec) mysql> Select * from Student_Aarav; +----+-------------+ | Id | Remarks | +----+-------------+ | 3 | Intelligent | +----+-------------+ 1 row in set (0.00 sec)
CASE 문과 LEFT JOIN을 결합한 해결 방법
핵심 아이디어는 세 개의 학생별 테이블을 모두 LEFT JOIN으로 연결한 뒤, CASE 문을 사용해 이름 값에 따라 어떤 테이블의 평가 내용을 가져올지 동적으로 결정하는 것입니다. 이렇게 하면 데이터 기반 관계를 하나의 쿼리로 깔끔하게 처리할 수 있습니다.
mysql> Select sd.id, sd.name, CASE name WHEN 'Harshit' THEN H1.Remarks WHEN 'Rahul' THEN R1.Remarks WHEN 'Aarav' THEN A1.Remarks ELSE 'Error' END as REMARKS FROM Student_detail AS sd LEFT JOIN Student_Harshit AS H1 ON sd.id = H1.id LEFT JOIN Student_Rahul AS R1 ON sd.id = R1.id LEFT JOIN Student_Aarav AS A1 ON sd.id = A1.id; +----+---------+-------------+ | id | name | REMARKS | +----+---------+-------------+ | 1 | Harshit | Excellent | | 2 | Rahul | Average | | 3 | Aarav | Intelligent | +----+---------+-------------+ 3 rows in set (0.00 sec)
쿼리 동작 원리
위 쿼리는 다음과 같은 순서로 작동합니다.
1. 기준 테이블 지정: Student_detail을 메인 테이블로 사용하여 모든 학생 목록을 확보합니다.
2. 다중 LEFT JOIN: 세 개의 학생별 테이블을 각각 Id를 기준으로 조인합니다. LEFT JOIN이므로 매칭되는 행이 없어도 결과가 사라지지 않습니다.
3. CASE 문 분기 처리: 이름이 'Harshit'이면 H1 테이블의 평가를, 'Rahul'이면 R1 테이블의 평가를, 'Aarav'이면 A1 테이블의 평가를 반환합니다. 그 외의 경우에는 'Error'를 출력해 예외 상황을 알립니다.
정리 및 실무 팁
이처럼 CASE 문과 LEFT JOIN을 조합하면 외래 키 없이 데이터 값에 의존하는 테이블 관계도 효과적으로 유지할 수 있습니다. 다만 실무 환경에서는 학생마다 테이블을 따로 만드는 구조보다는, 모든 평가를 하나의 테이블에 통합하고 학생 ID로 참조하는 정규화된 설계를 권장합니다. 테이블 수가 늘어날수록 위와 같은 쿼리는 복잡해지고 성능 저하와 유지보수 부담이 커질 수 있기 때문입니다.