MySQL 결합 방식: 내부, 외부, 좌측, 우측, 교차
⚡ 스마트 요약
MySQL JOIN은 두 개 이상의 관련 테이블의 행을 하나의 결과 집합으로 결합합니다. 이 자료에서는 CROSS, INNER, LEFT, RIGHT 및 OUTER JOIN에 대해 실행 가능한 쿼리, 샘플 데이터 및 명확한 출력 테이블을 통해 실제 데이터베이스 작업에 도움이 되도록 설명합니다.

조인이란 무엇입니까?
조인은 두 개 이상의 데이터베이스 테이블에서 데이터를 검색하는 데 도움이 됩니다.
테이블은 기본 키와 외래 키를 사용하여 상호 관련됩니다.
참고: JOIN은 SQL 학습자들 사이에서 가장 오해가 많은 주제입니다. 이해를 돕기 위해 새로운 데이터베이스를 예시로 사용하겠습니다. 아래 그림과 같습니다.
아래의 모든 예제는 이 두 표를 사용합니다. 영화_ID 열 회원 을 가리킨다 id 열 영화 산업 — 각 JOIN이 매칭되는 관계.
회원
| id | 이름 | LAST_NAME | 영화_ID |
|---|---|---|---|
| 1 | 아담 | 스미스 | 1 |
| 2 | 라비 | 쿠마르 | 2 |
| 3 | Susan의 이야기 | 데이비슨 | 5 |
| 4 | 제니 | Adrianna | 8 |
| 5 | 바람이 불어가는 쪽 | 탁구 | 10 |
영화 산업
| id | 제목 | 범주 |
|---|---|---|
| 1 | ASSASSIN'S CREED: 엠버스 | 애니메이션 |
| 2 | 리얼스틸(2012) | 애니메이션 |
| 3 | 앨빈과 다람쥐 | 애니메이션 |
| 4 | 주석 주석의 모험 | 애니메이션 |
| 5 | 세이프 (2012) | 동작 |
| 6 | 안전가옥(2012) | 동작 |
| 7 | GIA | 18+ |
| 8 | 마감일 2009 | 18+ |
| 9 | 더러운 그림 | 18+ |
| 10 | 말리와 나 | 로맨스 |
JOIN을 사용해야 하는 이유는 무엇일까요?
각 JOIN 유형을 살펴보기 전에, 여러 쿼리를 실행하는 것보다 JOIN을 사용하는 것이 더 나은 이유를 아는 것이 유용합니다.
이제 쿼리를 실행하는 동일한 작업을 수행할 수 있는데 왜 JOIN을 사용하는지 생각할 수 있습니다. 특히 데이터베이스 프로그래밍 경험이 있다면 쿼리를 하나씩 실행하고 각 쿼리의 출력을 연속 쿼리에 사용할 수 있다는 것을 알고 있습니다. 물론 가능합니다. 그러나 JOIN을 사용하면 검색 매개변수와 함께 하나의 쿼리만 사용하여 작업을 완료할 수 있습니다. 반면에 MySQL 더 나은 성능을 얻을 수 있습니다 인덱싱을 사용할 수 있으므로 JOIN을 사용합니다. 여러 쿼리를 실행하는 대신 단일 JOIN 쿼리를 사용하면 서버 오버헤드가 줄어듭니다. 대신 여러 쿼리를 사용하면 서로 더 많은 데이터가 전송됩니다. MySQL 및 애플리케이션(소프트웨어). 또한 애플리케이션 종료 시 더 많은 데이터 조작이 필요합니다.
우리가 더 나은 성과를 낼 수 있다는 것은 분명합니다 MySQL JOIN을 사용한 애플리케이션 성능.
조인 유형
MySQL 여러 JOIN 유형을 지원하며, 각 유형은 동일한 두 테이블에 대해 서로 다른 질문에 답합니다. 아래 표는 이러한 유형을 비교하고, 각 유형에 대한 쿼리와 그 결과를 보여줍니다.
| JOIN 유형 | 반환된 행 | 결과에 NULL 값이 있나요? | 일반적인 사용 |
|---|---|---|---|
| 크로스 가입 | 표 A의 모든 행은 표 B의 모든 행과 짝을 이룹니다. | 아니 | 가능한 모든 조합 생성 |
| 내부 결합 | 두 테이블 모두에서 조건을 만족하는 행만 표시됩니다. | 아니 | 실제로 영화를 대여한 회원 |
| 왼쪽 가입 | 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 더합니다. | 네, 오른쪽에요. | 모든 영화, 심지어 한 번도 빌려보지 않은 영화까지 |
| 오른쪽 조인 | 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 모두 더한 결과입니다. | 네, 왼쪽에요. | 멤버가 연결되지 않은 영화를 포함한 모든 영화 |
크로스 가입
Cross JOIN은 한 데이터베이스 테이블의 각 행을 다른 데이터베이스 테이블의 모든 행과 일치시키는 가장 간단한 형태의 JOIN입니다.
즉, 첫 번째 테이블의 각 행과 두 번째 테이블의 모든 레코드의 조합을 제공합니다.
모든 영화 기록에 대해 모든 회원 기록을 얻고 싶다고 가정하면 아래에 표시된 스크립트를 사용하여 원하는 결과를 얻을 수 있습니다.
SELECT * FROM `movies` CROSS JOIN `members`
위 스크립트를 실행하면 MySQL 워크 벤치 결과는 다음과 같습니다.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
내부 결합
크로스 조인은 가능한 모든 쌍을 반환하는데, 이는 원하는 결과가 아닌 경우가 많습니다. 이너 조인은 실제로 관련된 쌍으로 결과를 좁혀줍니다.
내부 JOIN은 주어진 조건을 만족하는 두 테이블 모두에서 행을 반환하는 데 사용됩니다.
예를 들어, 영화를 대여한 회원 목록과 각 회원이 대여한 영화 제목을 얻고 싶다고 가정해 보겠습니다. 이 경우 INNER JOIN을 사용하면 간단하게 두 테이블에서 주어진 조건을 만족하는 행만 반환받을 수 있습니다.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
위 스크립트를 실행하면
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
위의 결과 스크립트를 다음과 같이 작성하여 동일한 결과를 얻을 수도 있습니다.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
외부 조인
내부 조인은 짝이 없는 행을 조용히 삭제합니다. 짝이 없는 행이 중요한 경우에는 외부 조인이 적합합니다.
MySQL 외부 JOIN은 두 테이블에서 일치하는 모든 레코드를 반환합니다.
조인된 테이블에서 일치하는 항목이 없는 레코드를 검색할 수 있습니다. 그것은 반환 NULL 일치하는 항목이 없으면 조인된 테이블의 레코드 값입니다.
복잡하게 들리나요? 예를 들어 살펴볼까요?
왼쪽 가입
이제 모든 영화의 제목과 해당 영화를 대여한 회원의 이름을 얻고 싶다고 가정해 보겠습니다. 일부 영화는 어느 누구도 대여하지 않은 것이 분명합니다. 우리는 간단히 사용할 수 있습니다 왼쪽 가입 목적을 위해.
LEFT JOIN은 오른쪽 테이블에 일치하는 행이 없더라도 왼쪽 테이블의 모든 행을 반환합니다. 오른쪽 테이블에 일치하는 항목이 없으면 NULL이 반환됩니다.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
위 스크립트를 실행하면 MySQL 워크벤치에서 제공하는 결과입니다. 아래에 나열된 결과를 보시면, 대여되지 않은 영화의 경우 멤버 이름 필드에 NULL 값이 있는 것을 확인할 수 있습니다. 즉, 해당 영화에 대해 멤버 테이블에서 일치하는 멤버를 찾을 수 없다는 의미입니다.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
오른쪽 조인
RIGHT JOIN은 분명히 LEFT JOIN의 반대입니다. RIGHT JOIN은 왼쪽 테이블에 일치하는 행이 없더라도 오른쪽 테이블의 모든 열을 반환합니다. 왼쪽 테이블에 일치하는 항목이 없으면 NULL이 반환됩니다.
이 예에서는 회원 이름과 회원이 대여한 영화를 가져와야 한다고 가정해 보겠습니다. 이제 아직 영화를 대여하지 않은 새 회원이 생겼습니다.
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
위 스크립트를 실행하면 MySQL 워크벤치는 다음과 같은 결과를 제공합니다.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
"ON" 및 "USING" 절
지금까지의 모든 쿼리는 ON 절을 사용하여 행을 일치시켰습니다. MySQL 일치하는 열의 이름이 같을 경우 더 짧은 대안을 제공합니다.
위의 JOIN 쿼리 예에서는 테이블 간의 레코드를 일치시키기 위해 ON 절을 사용했습니다.
USING 절도 같은 목적으로 사용될 수 있습니다. 와의 차이점 사용 그렇죠 두 테이블의 일치하는 열에 대해 동일한 이름이 있어야 합니다.
지금까지 “movies” 테이블에서는 “id”라는 이름의 기본 키를 사용했습니다. "movie_id"라는 이름으로 "members" 테이블에서 동일한 내용을 참조했습니다.
"movies" 테이블의 "id" 필드 이름을 "movie_id"로 바꾸겠습니다. 동일한 일치 필드 이름을 갖기 위해 이 작업을 수행합니다.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
다음으로 위의 LEFT JOIN 예제와 함께 USING을 사용해 보겠습니다.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
사용과는 별도로 ON JOIN과 함께 사용 당신은 다른 많은 것을 사용할 수 있습니다 MySQL 다음과 같은 조항 GROUP BY, 어디 심지어 다음과 같은 기능도 있습니다. SUM, AVG등




