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로 클라이언트를 여세요.
데이터가 나뉘어 있는 이유
Sakila는 각 영화의 언어를 숫자로 기록합니다.English라는 단어를 한 번 저장하고 1,000번 가리키는 것이 1,000번 저장하는 것보다 자리를 덜 차지하고, 철자를 고치는 일은 1,000개가 아니라 1개의 행을 바꾸는 일이 됩니다. 그 대가로, 제목과 언어 이름을 원하는 쿼리는 두 테이블을 모두 읽어야 합니다.
조인의 동작 방식
COLUMN_LIST를 원하는 열로, LEFT_TABLE을 시작하는 테이블로, RIGHT_TABLE을 추가 열을 가져올 테이블로, 각 COLUMN_NAME을 그쪽에서 두 테이블을 연결하는 열로 바꾸세요.
서버는 왼쪽 테이블의 각 행을 가져와서, ON 조건이 참인 오른쪽 테이블의 행을 찾고, 일치마다 결합된 행 1개를 반환합니다.
예제
- 숫자 대신 이름 읽기
AS f와 AS l은 테이블 별칭인데, 다음 수업이 다룹니다.
조인의 종류는 각각 무엇을 위한 것인가
종류들은 1가지에서 다릅니다: 일치를 찾지 못한 행에 무슨 일이 일어나는가입니다.
외부 조인이 남긴 일치하지 않은 행도 값이 없는 열을 채워야 하고, NULL로 채웁니다. 그래서
LEFT JOIN 옆에 IS NULL이 그렇게 자주 나타납니다: 아무것과도 일치하지 않은 행을 요청하는 방법이기 때문입니다.
CROSS JOIN은 아무것도 일치시키지 않으므로 특이한 쪽입니다. 모든 조합을 원할 때 일부러 요청하는 조인이고, ON 절을 빠뜨렸을 때 실수로 얻는 조인입니다.
키워드보다 조건이 중요합니다
MySQL에서JOIN, INNER JOIN, CROSS JOIN은 1가지이고, 문법은 그 어느 것에나 ON 절을 붙이거나 붙이지 않는 것을 허용합니다. 그러므로 입력한 키워드가 결과를 결정하지 않습니다. ON 조건의 존재가 결정합니다: 있으면 일치를 얻고, 없으면 3개의 단어 중 무엇을 썼든 모든 조합을 얻습니다.
서버가 둘을 대신 구분해 주지 않으므로, 일치를 뜻할 때는 INNER JOIN ... ON을, 모든 조합을 뜻할 때는 ON이 없는 CROSS JOIN을 쓰세요. 그러면 키워드는 서버에 대한 지시가 아니라 다음 독자를 위한 메모가 됩니다.
요약
- 정보는 테이블마다 나뉘어 있고, 1개의 테이블이 id로 다른 테이블을 가리킵니다.
- 그 테이블들을 쿼리 1개로 가로질러 읽으려면 조인을 사용하세요.
ON조건은 어느 행끼리 짝인지 정하는 규칙으로 읽으세요.- 아무것과도 일치하지 않는 행에 무슨 일이 일어나야 하는지에 따라 조인의 종류를 고르세요.
- 외부 조인이 일치 없이 남긴 행의 열에는 NULL이 들어갑니다.
함께 보기
- 테이블 별칭과 INNER JOIN — 짧은 이름, 그리고 일치만 남기는 조인
- LEFT JOIN과 RIGHT JOIN — 일치하지 않은 행을 남기는 조인
- CROSS JOIN과 셀프 조인 — 모든 조합, 그리고 자기 자신과 조인한 테이블
- MySQL JOIN 성능과 흔한 실수 — 테이블이 커지면 잘못되는 것들