MySQL JOINS 튜토리얼: INNER, OUTER, LEFT, RIGHT, CROSS

조인이란 무엇입니까?

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

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

참고: JOIN은 SQL 학습자 사이에서 가장 오해되는 주제입니다. 단순성과 이해의 용이성을 위해 새로운 데이터베이스를 사용하여 샘플을 연습하겠습니다. 아래 그림과 같이

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 말리와 나 로맨스

조인 유형

크로스 조인

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" 절

위의 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 다음과 같은 조항 그룹 기준, 위치 심지어 다음과 같은 기능도 있습니다. SUM, AVG

조인을 사용해야 하는 이유는 무엇입니까?

이제 쿼리를 실행하는 동일한 작업을 수행할 수 있는데 왜 JOIN을 사용하는지 생각할 수 있습니다. 특히 데이터베이스 프로그래밍 경험이 있다면 쿼리를 하나씩 실행하고 각 쿼리의 출력을 연속 쿼리에 사용할 수 있다는 것을 알고 있습니다. 물론 가능합니다. 그러나 JOIN을 사용하면 검색 매개변수와 함께 하나의 쿼리만 사용하여 작업을 완료할 수 있습니다. 반면에 MySQL 더 나은 성능을 얻을 수 있습니다 인덱싱을 사용할 수 있으므로 JOIN을 사용합니다. 여러 쿼리를 실행하는 대신 단일 JOIN 쿼리를 사용하면 서버 오버헤드가 줄어듭니다. 대신 여러 쿼리를 사용하면 서로 더 많은 데이터가 전송됩니다. MySQL 및 애플리케이션(소프트웨어). 또한 애플리케이션 종료 시 더 많은 데이터 조작이 필요합니다.

우리가 더 나은 성과를 낼 수 있다는 것은 분명합니다 MySQL JOIN을 사용한 애플리케이션 성능.

제품 개요

  • JOINS를 사용하면 둘 이상의 테이블의 데이터를 단일 결과 집합으로 결합할 수 있습니다.
  • JOINS는 하위 쿼리에 비해 성능이 더 좋습니다.
  • INNER JOINS는 주어진 기준을 충족하는 행만 반환합니다.
  • OUTER JOINS는 일치하는 항목이 발견되지 않은 행을 반환할 수도 있습니다. 일치하지 않는 행은 NULL 키워드와 함께 반환됩니다.
  • 주요 JOIN 유형에는 Inner, Left Outer, Right Outer, Cross JOINS 등이 있습니다.
  • JOIN 작업에서 자주 사용되는 절은 "ON"입니다. "USING" 절은 일치하는 열이 동일한 이름이어야 합니다.
  • JOINS는 GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS 등과 같은 다른 절에서도 사용할 수 있습니다.