join 11

31
JOIN

Upload: yundukgun

Post on 14-Jul-2015

355 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Join    11

JOIN

Page 2: Join    11

학습 목표

이 수업이 종료되면 학생들은

JOIN 의 개념을 설명할 수 있다

INNER JOIN 을 이용한 쿼리문을 작성할 수 있다

CROSS JOIN 을 이용한 쿼리문을 작성할 수 있다

OUTER JOIN 을 이용한 쿼리문을 작성할 수 있다

SELF JOIN 을 이용한 쿼리문을 작성할 수 있다

Page 3: Join    11

pubs 데이터베이스의 ERD

Page 4: Join    11

JOIN 의 개념

공통열의 값을 비교하여 연결해서 데이터를 추출하는 작업 SQL 의 꽃이라 불리며 , 가장 중요하고 기본적인 기능

JOIN 이 필요한 이유

데이터 베이스 설계 과정에서는 발생하는 여러 문제들 ( 예를 들면 데이터 중복 , 삽입이상 , 삭제 이상 , 갱신 이상 등 ) 을

해결하기 위해 정규화 과정을 거침 원하는 정보가 여러 테이블에 나누어져 있을 가능성이 큼

JOIN 이란

Page 5: Join    11

JOIN 의 종류

내부 조인 (INNER JOIN)

상호 조인 (CROSS JOIN)

외부 조인 (OUTER JOIN)

자체 조인 (SELF JOIN)

JOIN 문 작성

ANSI-SQL 문 어떤 DBMS 에서도 동작

T-SQL 문 사용하기 편리하나 일부 구문의 경우 작동하지 않을 수도 있음

JOIN 의 종류

Page 6: Join    11

JOIN? JOIN 이란 하나 이상의 테이블로부터 연관된 데이터를 검색해 오는 방

법입니다 . 일반적인 경우에 행들은 Primary Key(PK) 와 Foreign Key(FK) 값의 연관에 의해 JOIN 이 성립되지만 어떤 경우에는 이러한 PK, FK 관계가 없어도 논리적인 값들의 연관만으로 JOIN 이 성립되기도 합니다 .

[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ < join_hint > ]

JOIN 그렇다면 조인 (JOIN) 의 종류에는 어떤 것이 있을까요 ? 조인의 종류설명

내부 조인 (INNER JOIN)

: 테이블간의 연결 조건을 모두 만족하는 행을 조회하는 조인

외부 조인 (OUTER JOIN)

: 테이블간의 연결 조건을 모두 만족하는 행과 특정한 테이블을 기준으로 조인에 실패한 자료를 동시에 조회하는 조인

상호 조인 (CROSS JOIN)

: 조인 조건이 없는 경우에 사용하여 양쪽 테이블에 있는 행의 수를 곱한 크기의 자료를 조회하는 조인 (cartesian product)

Page 7: Join    11

JOIN 문은 어려운 것이 아니다

일단 SELECT FROM WHERE 부터 나열한다

JOIN 하고자 하는 테이블의 ERD 를 보자 ( 혹은 생각하자 )

마지막으로 JOIN 방식을 결정한 후 JOIN 문을 작성하자

대부분의 실제 응용에서는 조인 구문이 필요하다

조인 (JOIN) 구문 (1)

SELECT

FROM

WHERE

꼭 기억하세요 !조인이란 ?

둘 이상의 테이블에서 공통된 컬럼 비교를 통해 관련된 레코드를 연결하여 SELECT함으 로써 원하는 정보를 얻어내는 방법을 말한다 .

일반적으로 정규화를 거친 테이블로부터 정보를 끌어낼 때에는 대부분 조인을 거쳐야 한다 .

Page 8: Join    11

JOIN 구문 (ANSI-SQL 문법 )

JOIN 구문 (T-SQL 문법 )

조인 (JOIN) 구문 (2)

SELECT table_name.column_name[, table_name.column_name …]

FROM {table_name [join_type] JOIN table_name

ON search_conditions}

WHERE [search_condition…]

SELECT table_name.column_name[, table_name.column_name …]

FROM {table_name, table_name}

WHERE table_name.column_name join_operator

table_name.column_name

Page 9: Join    11

내부 조인 (INNER JOIN)

가장 일반적인 JOIN 방법

어떤 조인인지 지정하지 않으면 INNER JOIN 에 해당

T-SQL 과 ANSI-SQL 구문이 있으며 , ANSI-SQL 문을 권장

내부 조인에 사용할 테이블의 ERD

내부 조인 (INNEER JOIN) (1)

Page 10: Join    11

INNER JOIN 무조건 따라 하기 (T-SQL)

내부 조인 (INNEER JOIN) (2)

SELECT title, price, pub_name FROM titles,publishersWHERE titles.pub_id = publishers.pub_id

SELECT titles.title, titles.price, publishers.pub_name FROM titles,publishersWHERE titles.pub_id = publishers.pub_id

SELECT a.title, a.price, b.pub_name FROM titles a,publishers bWHERE a.pub_id = b.pub_id

Page 11: Join    11

INNER JOIN 무조건 따라 하기 (ANSI-SQL)

내부 조인 (INNEER JOIN) (3)

SELECT title, price, pub_name FROM titles [INNER] JOIN publishers

ON titles.pub_id = publishers.pub_idORDER BY titles.pub_id

SELECT titles.title, titles.price, publishers.pub_name FROM titles [INNER] JOIN publishers

ON titles.pub_id = publishers.pub_idORDER BY titles.pub_idSELECT a.title, a.price, b.pub_name FROM titles a [INNER] JOIN publishers b

ON a.pub_id = b.pub_idORDER BY a.pub_id

Page 12: Join    11

동등조인 (EquiJOIN)

학술적인 의미만 있고 , 거의 사용하지 않음

데이터의 중복 발생

자연조인 (Natural JOIN)

실제로 널리 사용하는 조인 구문

내부 조인 (INNEER JOIN) (4)

SELECT *

FROM authors AS a INNER JOIN publishers AS p

ON a.city = p.city

ORDER BY a.au_lname DESC

SELECT p.pub_id, p.pub_name, p.state, a.*

FROM authors AS a INNER JOIN publishers AS p

ON a.city = p.city

ORDER BY a.au_lname DESC

Page 13: Join    11

3 개 이상의 테이블 조인

크게 달라질 것은 없다 다만 ERD 가 절대적으로 필요하다

내부 조인 (INNEER JOIN) (5)

SELECT title AS [ 제목 ], pub_name as [ 출판사 ], qty AS [ 판매량 ]

FROM titles JOIN publishers

ON titles.pub_id = publishers.pub_id

JOIN sales ON sales.title_id = titles.title_id

ORDER BY title

Page 14: Join    11

3 개 이상의 테이블 조인 ( 계속 )

내부 조인 (INNEER JOIN) (6)

SELECT title AS [ 제목 ], pub_name as [ 출판사 ],

stor_name AS [ 판매서점 ], qty AS [ 판매량 ]

FROM titles t JOIN publishers p ON t.pub_id = p.pub_id

JOIN sales sa ON sa.title_id = t.title_id

JOIN stores st ON sa.stor_id = st.stor_id

ORDER BY title

SELECT title AS [ 제목 ], pub_name as [ 출판사 ], qty AS [ 판매량 ]

FROM sales JOIN titles

ON sales.title_id = titles.title_id

JOIN publishers

ON titles.pub_id = publishers.pub_id

ORDER BY title

Page 15: Join    11

3 개 이상의 테이블 조인 ( 계속 )

T-SQL 구문

내부 조인 (INNEER JOIN) (7)

SELECT title AS [ 제목 ], pub_name as [ 출판사 ],

stor_name AS [ 판매서점 ], qty AS [ 판매량 ]

FROM titles t, publishers p, sales sa, stores st

WHERE t.pub_id=p.pub_id AND t.title_id = sa.title_id

AND sa.stor_id = st.stor_id

ORDER BY title

Page 16: Join    11

상호 조인 (CROSS JOIN)

각 테이블에서 모든 row 에 대해 가능한 모든 조합(combination) 을 갖는 쿼리 결과 산출

Cartesian product 라 부르기도 함 학술적 의미는 있으나 거의 사용하지 않음

상호 조인 (CROSS JOIN)

SELECT title, price, qty

FROM titles CROSS JOIN sales

SELECT title, price, qty

FROM titles, sales

Page 17: Join    11

외부 조인 (OUTER JOIN)

내부조인은 두 테이블에 있는 키 값이 일치하는 데이터만 가 져오는 것에 비해 외부조인은 어느 한 쪽의 데이터를 모두 가

져옴 실무에서 아주 빈번히 사용함

외부 조인 (OUTER JOIN) (1)

SELECT t.title, t.price, s.qtyFROM titles t INNER JOIN sales s

ON t.title_id = s.title_idORDER BY t.title_id

SELECT t.title, t.price, s.qtyFROM titles t LEFT OUTER JOIN sales s

ON t.title_id = s.title_idORDER BY t.title_id

SELECT t.title, t.price, s.qtyFROM titles t RIGHT OUTER JOIN sales s

ON t.title_id = s.title_idORDER BY t.title_id

Page 18: Join    11

T-SQL 문법

T-SQL 문법과 ANSI-SQL 문법의 차이

외부 조인 (OUTER JOIN) (2)

SELECT t.title, t.price, s.qtyFROM titles t, sales sWHERE t.title_id *= s.title_idORDER BY t.title_id

SELECT t.title, t.price, s.qtyFROM titles t, sales sWHERE t.title_id =* s.title_idORDER BY t.title_id

SELECT t.title, t.price, s.qtyFROM titles t LEFT OUTER JOIN sales s

ON t.title_id = s.title_idWHERE qty IS NULL

SELECT t.title, t.price, s.qtyFROM titles t, sales sWHERE t.title_id = s.title_id

AND qty IS NULL

Page 19: Join    11

SELF JOIN 의 개념

하나의 테이블 내에 있는 컬럼 간의 참조관계 설정

SELF JOIN 의 개념

동일 테이블의 다른 컬럼에 조인 걸기

동일 테이블의 같은 컬럼에 조인 걸기

Page 20: Join    11

Northwind 데이터베이스의 employees 테이블

직원의 상급자를 알고자 한다면 ReportsTo 컬럼을 확인

다른 컬럼에 조인 걸기 (1)

Page 21: Join    11

Northwind 데이터베이스의 employees 테이블 구조 확인

다른 컬럼에 조인 걸기 (2)

USE NorthwindSELECT EmployeeID, LastName, ReportsToFROM Employees

Fuller

Davolio Leverling Peacock Buchanan Callahan

Suyama King Dodsworth

Page 22: Join    11

모든 직원에 대한 상급자 구하기 (OUTER JOIN 필요 )

다른 컬럼에 조인 걸기 (3)

USE Northwind

SELECT t1.EmployeeID, t1.LastName, t1.ReportsTo,

t2.EmployeeID, t2.LastName

FROM Employees t1 LEFT OUTER JOIN Employees t2

ON t1.ReportsTo=t2.EmployeeID

Page 23: Join    11

모든 직원에 대한 부하직원 구하기 (OUTER JOIN 필요 )

다른 컬럼에 조인 걸기 (4)

USE Northwind

SELECT t1.EmployeeID, t1.LastName, t1.ReportsTo,

t2.EmployeeID, t2.LastName

FROM Employees t1 RIGHT OUTER JOIN Employees t2

ON t1.ReportsTo=t2.EmployeeID

Page 24: Join    11

작가와 책 사이의 관계

작가는 여러 권의 책을 쓸 수도 있고 , 한 권의 책을 여러 작 “ 가가 쓸 수도 있는 다 : ” 다 의 관계임

제 4 정규형 위배 pubs 데이터베이스에서는 titleauthor “테이블을 도입하여

다 : 1 : ” 다 의 관계로 변환

동일한 컬럼에 조인 걸기 (1)

USE pubs

SELECT *

FROM titleauthor

ORDER BY title_id

Page 25: Join    11

공동 저자 구하기

동일한 컬럼에 조인 걸기 (2)

USE pubs

SELECT t1.title_id, t1.au_id, t2.au_id

FROM titleauthor t1 JOIN titleauthor t2

ON t1.title_id=t2.title_id

ORDER BY t1.title_id

t1 t2

Page 26: Join    11

공동 저자 구하기 ( 계속 )

동일한 컬럼에 조인 걸기 (3)

USE pubs

SELECT t1.title_id, t1.au_id, t2.au_id

FROM titleauthor t1 JOIN titleauthor t2

ON t1.title_id=t2.title_id

AND t1.au_id <> t2.au_id

ORDER BY t1.title_id

Page 27: Join    11

공동 저자 구하기 ( 계속 )

동일한 컬럼에 조인 걸기 (4)

USE pubs

SELECT t1.title_id, t1.au_id, t2.au_id

FROM titleauthor t1 JOIN titleauthor t2

ON t1.title_id=t2.title_id

AND t1.au_id < t2.au_id

ORDER BY t1.title_id

Page 28: Join    11

공동 저자 구하기 ( 계속 )

동일한 컬럼에 조인 걸기 (5)

USE pubs

SELECT t1.title_id, tit.title, t1.au_id, au1.au_fname,

t2.au_id, au2.au_fname

FROM titleauthor t1 JOIN titleauthor t2

ON t1.title_id=t2.title_id AND t1.au_id < t2.au_id

JOIN titles tit ON t1.title_id = tit.title_id

JOIN authors au1 ON t1.au_id = au1.au_id

JOIN authors au2 ON t2.au_id = au2.au_id

ORDER BY t1.title_id

Page 29: Join    11

실습 과제 과제 1 : pubs 데이터베이스의 titles 테이블의 title_id, title,

price 와 titleauthor 테이블의 royaltyper 를 SELECT 하는 INNER JOIN 의 쿼리문을 작성하라 . 연결되는 키 값은 지참한 pubs 데이터베이스의 ERD 를 참고하라 .

과제 2 : pubs 데이터베이스의 titles 테이블의 title, type 와 authors 테이블의 au_lname+au_fname AS [author], city, state, zip 을 SELECT 하는 INNER JOIN 쿼리문을 작성하라 . 연결되는 키 값은 지참한 pubs 데이터베이스의 ERD 를 참고하라 .

과제 3 : pubs 데이터베이스의 titles 테이블의 title, type, price 와 sales 테이블의 qty 를 OUTER JOIN 하여 SELECT 하는 쿼리문을 작성하라 . 단 , 검색조건은 titles 테이블의 type 이 ‘ business’ 인 것이다 .

과제 4 : pubs 데이터베이스의 titles 테이블의 title, type, price 와 publishers 테이블의 pub_name, city, state, country를 OUTER JOIN 하여 SLELCT 하는 쿼리문을 작성하라 . 단 , 검색조건은 titles 테이블의 price 가 20.0 이상인 책만을 구하는 것이다 .

Page 30: Join    11

실습 과제 과제 5 : Northwind 데이터베이스의 Employees 테이블에서

의 상급자는 3 단계에 걸쳐 존재한다 . 동일 테이블에 SELF JOIN 을 2 차례 실시하여 3 단계의 상급자를 모두 포함하도록( 그림 참조 ) 하는 쿼리문을 작성하라 . (OUTER JOIN 필요 )

과제 6 : 과제 5 의 쿼리문을 일부

수정하여 모든 직원에 대한 부하

직원을 알 수 있도록 하라 .

( 그림 참고 ) (OUTER JOIN 필요 )

Page 31: Join    11

학습 요약

이번 시간에는

INNER JOIN

CROSS JOIN

OUTER JOIN

SELF JOIN

에 대해 알아 보았습니다 .