2. TODO
• MySQL 에서 조인(Join)에 대해 알아보기
• 더불어, 중학교때 배웠던 집합(Set)에 대해서도 복습 해보기
• Query 실행 순서에 대해 알아보기
3. Definition
“A SQL join clause combines records from two or more tables in a relational
database. It creates a set that can be saved as a table or used as it is. A JOIN
is a means for combining fields from two tables (or more) by using values
common to each. ANSI-standard SQL specifies five types of JOIN: INNER,
LEFT OUTER, RIGHT OUTER, FULL OUTER and CROSS. As a special case, a
table (base table, view, or joined table) can JOIN to itself in a self-join.
- Wikipedia, “Join(SQL)”, https://en.wikipedia.org/wiki/Join_(SQL), 2015.08.17
4. Definition
• 관계형 데이터베이스(Relational Database) 시스템에서
2개 이상의 테이블을 연결하는 것
• ANSI Standard SQL은 5개의 JOIN을 규정하고 있음
• INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN,
FULL OUTER JOIN, CROSS JOIN
• 특별한 경우(base table, view, or joined table)에 자기 자신
을 JOIN 할 수 있음
• SELF JOIN
5. Example Tables
순번 이름 팀 번호
1 권혁 1993
2 이범호 2001
3 필 2001
4 박병호 2010
5 양준혁 NULL
순번 팀 번호 팀명
1 1993 한화
2 1999 두산
3 2001 기아
4 2010 넥센
baseball_player baseball_team
A B
7. 1. INNER JOIN(JOIN)
• A 테이블과 B 테이블이 겹치는 항목 선택
• 즉, 교집합에 해당하는 데이터 선택
• INNER JOIN 은 JOIN 이라는 키워드와 동일
• CROSS JOIN 이라는 키워드는 INNER JOIN과 동일
(MySQL 5.0)
• CROSS JOIN = INNER JOIN = JOIN
name team_no team_name
권혁 1993 한화
이범호 2001 기아
필 2001 기아
박병호 2010 넥센
SELECT player.name, player.team_no, team.name AS team_name
FROM baseball_player AS player
JOIN baseball_team AS team ON player.team_no = team.team_no
8. 2. LEFT OUTER JOIN
(LEFT JOIN) (1)
• A 테이블 전체와 B 테이블 내용 중
A 테이블과 겹치는 항목만 선택
• LEFT OUTER JOIN 은 LEFT JOIN 이라는
키워드와 동일
name team_no team_name
권혁 1993 한화
이범호 2001 기아
필 2001 기아
박병호 2010 넥센
양준혁 NULL NULL
SELECT player.name, player.team_no, team.name AS team_name
FROM baseball_player AS player
LEFT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
9. 3. RIGHT OUTER JOIN
(RIGHT JOIN) (1)
• B 테이블 전체와 A 테이블 내용 중
B 테이블과 겹치는 항목만 선택
• RIGHT OUTER JOIN 은 RIGHT JOIN 이라는
키워드와 동일
name team_no team_name
권혁 1993 한화
NULL NULL 두산
이범호 2001 기아
필 2001 기아
박병호 2010 넥센
SELECT player.name, player.team_no, team.name AS team_name
FROM baseball_player AS player
LEFT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
10. Difference Between
LEFT and RIGHT OUTER JOIN
• JOIN 절을 기준으로 어느 쪽에 위치한 테이블을 모두 포함
시킬지 여부를 결정
• 모든 데이터를 포함하는 기준이 되는 테이블을 설정
FROM baseball_player AS player LEFT OUTER JOIN baseball_team AS team
ON player.team_no = team.team_no
<왼쪽(LEFT)> <오른쪽(RIGHT)>
11. LEFT / RIGHT OUTER JOIN (2)
LEFT OUTER JOIN RIGHT OUTER JOIN
• A 테이블 전체에서 B 테이블 내용과
겹치지 않는 항목만을 선택
• 즉, A 테이블에만 존재하는 값을 SELECT
• B 테이블 전체에서 A 테이블 내용과
겹치지 않는 항목만을 선택
• 즉, B 테이블에만 존재하는 값을 SELECT
WHERE 절을 이해하는것이 쉽지 않음
12. Logical Query Processing
Phases
• 사용자가 입력한 Query가 실행되는 Logical한 순서
• 실제 DBMS에서는 사용자가 작성한 Query에 따라 실행순서가 달라질
수 있음(Query Optimization).
FROM
JOIN
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT
13. LEFT OUTER JOIN(2)
SELECT player.name, player.team_no AS player_side_team_no, team.team_no AS team_side_team_no, team.name AS team_name
FROM baseball_player AS player
LEFT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
WHERE team.team_no IS NULL
name player_side_team_no team_side_team_no team_name
권혁 1993 1993 한화
이범호 2001 2001 기아
필 2001 2001 기아
박병호 2010 2010 넥센
양준혁 NULL NULL NULL
FROM
JOIN
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT
name player_side_team_no team_side_team_no team_name
양준혁 NULL NULL NULL
14. RIGHT OUTER JOIN(2)
SELECT player.name, player.team_no AS player_side_team_no, team.team_no AS team_side_team_no, team.name AS team_name
FROM baseball_player AS player
RIGHT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
WHERE player.team_no IS NULL
name player_side_team_no team_side_team_no team_name
권혁 1993 1993 한화
NULL NULL NULL 두산
이범호 2001 2001 기아
필 2001 2001 기아
박병호 2010 2010 넥센
FROM
JOIN
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT
name player_side_team_no team_side_team_no team_name
NULL NULL 1999 두산
15. FULL OUTER JOIN
• MySQL에는 FULL OUTER JOIN 이라는 키워드가 존재하지
않음
• But, UNION 키워드를 이용해 구현 가능
16. FULL OUTER JOIN(1)
name player_side_team_no team_side_team_no team_name
권혁 1993 1993 한화
이범호 2001 2001 기아
필 2001 2001 기아
박병호 2010 2010 넥센
양준혁 1982 NULL NULL
NULL NULL 1999 두산
SELECT player.name, player.team_no AS player_side_team_no, team.team_no AS team_side_team_no, team.name AS team_name
FROM baseball_player AS player
LEFT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
UNION
SELECT player.name, player.team_no AS player_side_team_no, team.team_no AS team_side_team_no, team.name AS team_name
FROM baseball_player AS player
RIGHT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
17. FULL OUTER JOIN(2)
SELECT player.name, player.team_no AS player_side_team_no, team.team_no AS team_side_team_no, team.name AS team_name
FROM baseball_player AS player
LEFT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
WHERE team.team_no IS NULL
UNION
SELECT player.name, player.team_no AS player_side_team_no, team.team_no AS team_side_team_no, team.name AS team_name
FROM baseball_player AS player
RIGHT OUTER JOIN baseball_team AS team ON player.team_no = team.team_no
WHERE player.team_no IS NULL
name player_side_team_no team_side_team_no team_name
양준혁 1982 NULL NULL
NULL NULL 1999 두산
18. UNION vs JOIN
• UNION
• 2개 이상의 테이블 결과를 중복제거하여 합침
• 단, 2개 이상의 테이블들의 컬럼 개수와 타입이 일치해야 함
• UNION ALL: UNION과 동일하나 중복을 제거하지 않음
• JOIN
• Cartesian Product 를 수행하여 2개 이상의 테이블들을 결합하는 것
• INNER JOIN(CROSS JOIN)
• 특정 테이블을 기준으로 하여 2개 이상의 테이블들을 결합하는 것
• OUTER JOIN
An outer join does not require each record in the two joined tables to have a matching record. The joined table retains each record—even if no other matching
record exists. Outer joins subdivide further into left outer joins, right outer joins, and full outer joins, depending on which table's rows are retained (left, right, or
both).
19. Cartesian Product
In mathematics, a Cartesian product is a mathematical operation which
returns a set (or product set or simply product) from multiple sets.
- Wikipedia, "Cartesian Product", https://en.wikipedia.org/wiki/Cartesian_product, 2015.08.21
20. Cartesian Product
• 공집합이 아닌 여러 집합들로부터 새로운 집합(Set)을 만들
어 내는 방법
• Cartesian Product(카티션 프로덕트), 데카르트 곱,
곱집합, 순서쌍 이라는 이름으로도 불리며 곱하기(X) 기호로
표현
• A = {1, 2, 3}, B = {a, b} 의 두 집합이 있을 때, 카티션 곱
A X B = {(1,a), (1,b), (2, a), (2,b), (3,a), (3,b)}
21. Cartesian Product
• Cartesian Product 결과: 조회 가능한 모든 집합(Set) 출력
SELECT player.name, player.team_no AS player_side_team_no, team.team_no AS team_side_team_no, team.name AS team_name
FROM baseball_player AS player
JOIN baseball_team AS team
name player_side_team_no team_side_team_no team_name
권혁 1993 1993 한화
권혁 1993 1999 두산
권혁 1993 2001 기아
권혁 1993 2010 넥센
이범호 2001 1993 한화
이범호 2001 1999 두산
이범호 2001 2001 기아
이범호 2001 2010 넥센
필 2001 1993 한화
필 2001 1999 두산
... ... ... ...
22. Cartesian Product
• 조회 가능한 모든 결과 출력을 방지하기 위해, ON 절에 조건
부여
• 하지만, Cartesian Product 가 필요한 경우가 존재함
name team_no team_name
권혁 1993 한화
이범호 2001 기아
필 2001 기아
박병호 2010 넥센
SELECT player.name, player.team_no, team.name AS team_name
FROM baseball_player AS player
JOIN baseball_team AS team ON player.team_no = team.team_no
24. Conclusion
• 관계형 DB에서 JOIN은 자주 사용되기 때문에 5가지 JOIN
의 의미를 이해하고 사용하는 것이 중요
• 최대한, 가능하면 표준 SQL을 이용할 것
• "표준" 이라는 뜻은 해당 분야의 어디에서나 사용 가능하다는 의미
(이식성)
• 그래도 어쩔 수 없으면 해당 DBMS에서 제공하는 문법을 써야함
• MySQL의 LIMIT 와 같은 키워드
25. References
1. Wikipedia, “Join(SQL)”, https://en.wikipedia.org/wiki/Join_(SQL), 2015.08.17
2. Wikipedia, “SQL”, https://en.wikipedia.org/wiki/SQL, 2015.08.17
3. StackOverflow, "MySQL cartesian product between two SELECT statements", http://stackoverflow.com/questions/
4481396/mysql-cartesian-product-between-two-select-statements, 2015.08.18
4. MySQL::MySQL 5.0 Reference Manual :: 13.2.8.2 JOIN Syntax, "13.2.8.2 JOIN Syntax",
"http://dev.mysql.com/doc/refman/5.0/en/join.html", 2015.08.18
5. StackOverflow, "What's the execute order of the different parts of a SQL select statement?",http://stackoverflow.com/
questions/2617661/whats-the-execute-order-of-the-different-parts-of-a-sql-select-statement , 2015.08.21
6. StackOverflow, "What is the difference between Join and Union?", http://stackoverflow.com/questions/905379/what-is-
the-difference-between-join-and-union, 2015.08.21
7. Wikipedia, "Cartesian Product", https://en.wikipedia.org/wiki/Cartesian_product, 2015.08.21
8. Wikipedia, "Venn Diagram", https://en.wikipedia.org/wiki/Venn_diagram, 2015.08.21
9. SQL with Manoj, "SQL Server JOINS and Types", http://sqlwithmanoj.com/tag/cross-join-2/, 2015.08.21