메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
셀프 조인은 같은 쿼리에서 1개의 테이블을 두 번 읽어서, 그 행들을 서로 비교할 수 있게 합니다. 쌍에 관한 질문에 답하는 방법입니다: 어떤 행들이 값을 공유하는지, 어떤 행이 어떤 행보다 큰지 같은 것입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

셀프 조인의 동작 방식

TABLE_NAME을 테이블로, FIRST_ALIAS와 SECOND_ALIAS를 그 테이블의 서로 다른 2개의 이름으로, 각 COLUMN_NAME을 비교하는 열로 바꾸세요. 조인의 다른 부분은 아무것도 바뀌지 않습니다. 서버는 양쪽이 하나의 테이블이라는 것을 전혀 모르고, 다른 어떤 테이블 쌍과 똑같이 다룹니다.

별칭은 선택 사항이 아닙니다

별칭이 없으면 쿼리는 2개의 것을 모두 actor라고 부르고 둘을 구별할 수 없습니다.
ERROR 1066은 서버가 각 쪽에 이름이 필요하다고 말하는 것입니다.

예제

  1. 값을 공유하는 행

Sakila의 일부 배우는 성을 공유합니다. 이 쿼리는 그들 각각을 나머지와 짝지어 줍니다.
3명의 배우가 AKROYD라는 성을 쓰고, 그들 사이에 3개의 쌍이 만들어집니다.

  1. 숫자로 행 비교하기

같은 형태가 “어떤 영화가 어떤 영화와 정확히 같은 길이인가”에 답합니다. 이 쿼리는 카탈로그에서 가장 긴 영화로 범위를 좁힙니다.
10편의 영화가 185분이고, 45는 10개의 것으로 만들 수 있는 쌍의 수입니다.

두 번째 조건이 하는 일

a1.actor_id < a2.actor_id가 각 쌍을 한 번만 유지하고 배우가 자기 자신과 짝지어지지 않게 막는 것입니다. 이것을 빼면 같은 쿼리가 다른 질문에 답합니다.
108개가 아니라 416개의 행이고, 2종류의 행이 끼어들었습니다. CHRISTIAN AKROYD는 자기 자신과 짝지어졌는데, 자신의 행이 a1.last_name = a2.last_name을 만족하기 때문입니다. 그리고 CHRISTIAN과 DEBBIE가 나온 다음 DEBBIE와 CHRISTIAN이 나오는데, 이것은 같은 쌍을 거꾸로 쓴 것입니다. id를 <로 비교하면 둘 다 한 번에 해결됩니다. 어떤 id도 자기 자신보다 작지 않으므로 행이 자기 자신과 일치하는 것을 막고, 진짜 쌍 각각의 1가지 배열만 유지합니다. 셀프 조인이 쌍을 찾을 때는 언제나 <를 쓰세요.

요약

  • 1개의 테이블의 행을 서로 비교하려면 셀프 조인을 쓰세요.
  • 테이블에 2개의 별칭을 주세요. 별칭이 없으면 ERROR 1066이 납니다.
  • 각 쌍을 한 번만 원할 때는 2개의 별칭의 기본 키를 <로 비교하세요.
  • 막지 않으면 행이 자기 자신과 일치한다고 예상하세요.

함께 보기