VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
mysql -u root -p sakila로 클라이언트를 여세요.
셀프 조인의 동작 방식
TABLE_NAME을 테이블로, FIRST_ALIAS와 SECOND_ALIAS를 그 테이블의 서로 다른 2개의 이름으로, 각 COLUMN_NAME을 비교하는 열로 바꾸세요.
조인의 다른 부분은 아무것도 바뀌지 않습니다. 서버는 양쪽이 하나의 테이블이라는 것을 전혀 모르고, 다른 어떤 테이블 쌍과 똑같이 다룹니다.
별칭은 선택 사항이 아닙니다
별칭이 없으면 쿼리는 2개의 것을 모두actor라고 부르고 둘을 구별할 수 없습니다.
ERROR 1066은 서버가 각 쪽에 이름이 필요하다고 말하는 것입니다.
예제
- 값을 공유하는 행
Sakila의 일부 배우는 성을 공유합니다. 이 쿼리는 그들 각각을 나머지와 짝지어 줍니다.
- 숫자로 행 비교하기
같은 형태가 “어떤 영화가 어떤 영화와 정확히 같은 길이인가”에 답합니다. 이 쿼리는 카탈로그에서 가장 긴 영화로 범위를 좁힙니다.
두 번째 조건이 하는 일
a1.actor_id < a2.actor_id가 각 쌍을 한 번만 유지하고 배우가 자기 자신과 짝지어지지 않게 막는 것입니다. 이것을 빼면 같은 쿼리가 다른 질문에 답합니다.
CHRISTIAN AKROYD는 자기 자신과 짝지어졌는데, 자신의 행이 a1.last_name = a2.last_name을 만족하기 때문입니다. 그리고 CHRISTIAN과 DEBBIE가 나온 다음 DEBBIE와 CHRISTIAN이 나오는데, 이것은 같은 쌍을 거꾸로 쓴 것입니다.
id를 <로 비교하면 둘 다 한 번에 해결됩니다. 어떤 id도 자기 자신보다 작지 않으므로 행이 자기 자신과 일치하는 것을 막고, 진짜 쌍 각각의 1가지 배열만 유지합니다. 셀프 조인이 쌍을 찾을 때는 언제나 <를 쓰세요.
요약
- 1개의 테이블의 행을 서로 비교하려면 셀프 조인을 쓰세요.
- 테이블에 2개의 별칭을 주세요. 별칭이 없으면
ERROR 1066이 납니다. - 각 쌍을 한 번만 원할 때는 2개의 별칭의 기본 키를
<로 비교하세요. - 막지 않으면 행이 자기 자신과 일치한다고 예상하세요.
함께 보기
- 테이블 별칭 — 이 쿼리가 의존하는 이름 붙이기
- INNER JOIN — 셀프 조인이 그 특수한 경우인 조인
- 조인의 동작 방식 — 다른 종류 사이에서 이것의 위치
- MySQL JOIN 성능과 흔한 실수 — 큰 테이블에서 셀프 조인의 비용