MySQL 결합 방식: 내부, 외부, 좌측, 우측, 교차

⚡ 스마트 요약

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

  • 🔗 핵심 원칙: JOIN은 기본 키와 외래 키 관계를 사용하여 테이블 간의 행을 일치시킵니다.
  • 어떤 의미에서 중요한가: 하나의 JOIN 쿼리는 인덱싱을 사용하여 여러 개의 개별 쿼리에 비해 서버 왕복 횟수를 줄입니다.
  • ✖️ Cross JOIN 동작: 첫 번째 표의 모든 행은 두 번째 표의 모든 행과 짝을 이루어 데카르트 곱을 생성합니다.
  • 🎯 내부 JOIN 행동: 두 테이블 모두에서 일치 조건을 만족하는 행만 반환됩니다.
  • ↔️ 외부 JOIN 동작: LEFT JOIN과 RIGHT JOIN은 일치하지 않는 행을 반환하고 누락된 열을 NULL로 채웁니다.
  • 🧩 켜짐 vs 사용: USING은 열 이름이 동일해야 하지만, ON은 일치하는 모든 표현식을 지원합니다.

MySQL 조인

조인이란 무엇입니까?

조인은 두 개 이상의 데이터베이스 테이블에서 데이터를 검색하는 데 도움이 됩니다.

테이블은 기본 키와 외래 키를 사용하여 상호 관련됩니다.

참고: 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
Note: Null is returned for non-matching rows on right

오른쪽 조인

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
Note: Null is returned for non-matching rows on left

"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

자주 묻는 질문

JOIN은 두 테이블의 열을 나란히 결합하고 키를 기준으로 행을 일치시킵니다. UNION은 두 쿼리의 결과를 세로로 쌓으며 열 개수와 데이터 유형이 일치해야 합니다.

예. 각각 고유한 ON 조건을 가진 추가 JOIN 절을 연결할 수 있습니다. MySQL 먼저 두 테이블을 조인한 다음, 그 중간 결과를 다음 테이블과 조인하는 식으로 계속 진행합니다.

셀프 조인은 두 개의 별칭을 사용하여 테이블을 자기 자신과 조인합니다. 예를 들어 직원 행과 해당 직원의 관리자 행을 비교하는 것과 같이 한 테이블 내의 행들을 비교합니다.

예. 편집기에 내장된 AI 비서 등이 있습니다. MySQL 워크 벤치 일반 언어로 작성된 프롬프트에서 JOIN 쿼리를 작성할 수 있습니다. 생성된 ON 조건을 항상 검토하십시오. 잘못된 키를 입력하면 오류 메시지 없이 잘못된 결과가 생성될 수 있습니다.

부분적으로는 그렇습니다. AI 어드바이저는 인덱스와 더 나은 조인 순서를 제안하여 실행 시간을 단축하는 경우가 많습니다. 하지만 옵티마이저가 최종 실행 계획을 선택하므로 조인 키에 대한 올바른 인덱싱이 여전히 가장 중요한 요소입니다.

이 게시물을 요약하면 다음과 같습니다.