메인 콘텐츠로 건너뛰기

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

All examples on this page work on VillageSQL. Install Now →
INNER JOIN은 일치가 성공할 때만 행을 남깁니다. 한 테이블의 행이 다른 테이블의 행을 가리키고 둘 다 원할 때 쓰는 조인입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

INNER JOIN의 동작 방식

COLUMN_LIST를 원하는 열로, LEFT_TABLE을 시작하는 테이블로, RIGHT_TABLE을 추가 열을 가져올 테이블로, 각 COLUMN_NAME을 그쪽에서 둘을 연결하는 열로 바꾸세요. ON 절은 어느 행끼리 짝인지 말합니다. MySQL은 왼쪽 테이블의 각 행을 가져와서, 그 조건이 성립하는 오른쪽 테이블의 행을 찾고, 일치마다 결합된 행 1개를 반환합니다. 아무것도 찾지 못한 행은 어느 쪽이든 버려집니다. LEFT JOIN이 그 행을 대신 남기는 절입니다.

예제

  1. 테이블 2개 조인

film.language_id는 language.language_id를 가리킵니다. 그 쌍을 일치시키면 제목 옆에 언어 이름을 출력할 수 있습니다.
1,000개의 행으로, film 하나만 읽었을 때와 같은 수입니다. 모든 영화가 정확히 1개의 언어와 일치했는데, 조인 열이 단일 행을 가리킬 때 얻는 결과입니다.

  1. 외래 키를 따라 조인

고객은 도로명 주소를 별도의 테이블에 보관합니다.
599개의 행으로, 고객당 1개입니다.

  1. 테이블 3개 조인

테이블이 하나 더 늘 때마다 INNER JOIN 절을 하나씩 추가하세요. Sakila는 위치를 address, city, country로 나누어 두므로, 도시 이름에 닿으려면 2번 건너가야 합니다.
여전히 599개의 행입니다. 각 조인이 단일 행과 일치했으므로 수가 움직이지 않았습니다.

  1. USING으로 줄여 쓰기

2개의 열이 같은 이름을 가질 때, USING이 ON을 대신하고 이름을 한 번만 말합니다.
예제 1과 같은 1,000개의 행입니다. USING은 양쪽의 이름이 일치할 때만 동작하므로, 언제나 적용되는 형태는 ON입니다.

여러 행과 일치하면 행이 곱해집니다

조인은 일치당 1개의 행을 반환하므로, 여러 행과 일치하는 행은 여러 번 돌아옵니다. 각 영화에는 여러 배우가 있습니다.
1,000개의 영화에서 5,462개의 행이 나왔고, 각 제목이 배우마다 한 번씩 반복됩니다. 이것이 조인이 예상보다 많은 행을 반환하는 흔한 이유이고, 조인 위에서 계산한 합계가 너무 크게 나올 수 있는 이유입니다.

사람들이 걸려 넘어지는 2가지

일치하지 않은 행은 비어 있는 것이 아니라 사라집니다. film 대신 language에서 시작해도 1,005개가 아니라 여전히 1,000개의 행을 얻습니다: Sakila의 나머지 5개 언어는 어떤 영화와도 일치하지 않아 빠집니다. 내부 조인은 일치한 것을 보고하지, 빠진 것은 결코 보고하지 않습니다. LEFT JOIN이 그 반대 질문을 묻는 방법입니다. ON이 빠져도 오류가 아닙니다. MySQL은 ON이 없는 INNER JOIN을 두 테이블의 모든 조합으로 읽으므로, 오타가 오류 대신 1,000 곱하기 6개의 행을 반환합니다. CROSS JOIN이 의도한 경우와 실수인 경우 모두를 다룹니다.

요약

  • 테이블 간에 일치하는 행을 결합하려면 INNER JOIN과 ON을 사용하세요.
  • 테이블이 하나 더 늘 때마다 INNER JOIN 절을 1개 추가하세요.
  • 내부 조인은 일치만 보고하므로, 일치하지 않은 행은 사라집니다.
  • 행 1개가 여러 행과 일치하면 행 수가 늘어납니다.
  • USING은 열이 양쪽에서 같은 이름일 때만 사용하세요.

함께 보기