다대통행 관계에서 SQL 결과 필터링: 실용 가이드
다중 연결 관계가 있는 테이블 전체에서 효율적으로 데이터를 쿼리하는 것은 데이터베이스 성능에 매우 중요합니다. 세 개의 테이블이 포함된 일반적인 시나리오를 예로 들어 보겠습니다.
student
(ID, 이름)club
(ID, 이름)student_club
(학생_ID, 클럽_ID)과제: 축구(club_id 30)와 야구(club_id 50) 클럽 모두의 회원인 학생을 식별하세요.
Simple JOIN이 실패하는 이유:
조인을 사용하는 순진한 접근 방식은 효과적이지 않습니다.
<code class="language-sql">SELECT student.* FROM student INNER JOIN student_club sc ON student.id = sc.student_id LEFT JOIN club c ON c.id = sc.club_id WHERE c.id = 30 AND c.id = 50;</code>
단일 club
레코드는 id = 30
과 id = 50
을 동시에 가질 수 없기 때문에 실패합니다.
효과적인 솔루션:
1. 중첩된 IN
쿼리:
이 접근 방식은 두 개의 하위 쿼리를 사용하여 각 클럽의 학생을 찾은 다음 결과를 교차시킵니다.
<code class="language-sql">SELECT student.* FROM student WHERE student.id IN ( SELECT student_id FROM student_club WHERE club_id = 30 ) AND student.id IN ( SELECT student_id FROM student_club WHERE club_id = 50 );</code>
이 방법은 대규모 데이터 세트의 경우에도 일반적으로 효율적입니다.
2. INTERSECT
사용:
INTERSECT
연산자는 보다 간결한 솔루션을 제공합니다.
<code class="language-sql">SELECT student.* FROM student WHERE student.id IN ( SELECT student_id FROM student_club WHERE club_id = 30 ) INTERSECT SELECT student.id FROM student WHERE student.id IN ( SELECT student_id FROM student_club WHERE club_id = 50 );</code>
INTERSECT
은 두 하위 쿼리 모두에서 공통 학생 ID만 반환하여 두 클럽의 학생을 효과적으로 식별합니다. 이 접근 방식과 중첩 IN
접근 방식 간의 선택은 데이터베이스 시스템 기본 설정 및 쿼리 최적화 프로그램 동작에 따라 달라지는 경우가 많습니다. 일반적으로 두 가지 모두 이 작업에 효율적입니다.
위 내용은 다대다관계에서 여러 클럽에 속한 학생을 효율적으로 필터링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!