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이 그 행을 대신 남기는 절입니다.
예제
- 테이블 2개 조인
film.language_id는 language.language_id를 가리킵니다. 그 쌍을 일치시키면 제목 옆에 언어 이름을 출력할 수 있습니다.
film 하나만 읽었을 때와 같은 수입니다. 모든 영화가 정확히 1개의 언어와 일치했는데, 조인 열이 단일 행을 가리킬 때 얻는 결과입니다.
- 외래 키를 따라 조인
고객은 도로명 주소를 별도의 테이블에 보관합니다.
- 테이블 3개 조인
테이블이 하나 더 늘 때마다 INNER JOIN 절을 하나씩 추가하세요. Sakila는 위치를 address, city, country로 나누어 두므로, 도시 이름에 닿으려면 2번 건너가야 합니다.
- USING으로 줄여 쓰기
2개의 열이 같은 이름을 가질 때, USING이 ON을 대신하고 이름을 한 번만 말합니다.
USING은 양쪽의 이름이 일치할 때만 동작하므로, 언제나 적용되는 형태는 ON입니다.
여러 행과 일치하면 행이 곱해집니다
조인은 일치당 1개의 행을 반환하므로, 여러 행과 일치하는 행은 여러 번 돌아옵니다. 각 영화에는 여러 배우가 있습니다.사람들이 걸려 넘어지는 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은 열이 양쪽에서 같은 이름일 때만 사용하세요.
함께 보기
- 조인의 동작 방식 — 이 조인과 다른 종류의 차이
- LEFT JOIN — 이 조인이 버리는 행 남기기
- MySQL JOIN 성능과 흔한 실수 — 조인에 인덱스 만들기, 그리고 잘못 나오는 행 수
- MySQL의 외래 키 — 이 조인들이 따라가는 관계