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 |
오른쪽 조인
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" 절
위의 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 등과 같은 다른 절에서도 사용할 수 있습니다.