join 11

Post on 14-Jul-2015

355 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

JOIN

학습 목표

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

JOIN 의 개념을 설명할 수 있다

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

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

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

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

pubs 데이터베이스의 ERD

JOIN 의 개념

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

JOIN 이 필요한 이유

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

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

JOIN 이란

JOIN 의 종류

내부 조인 (INNER JOIN)

상호 조인 (CROSS JOIN)

외부 조인 (OUTER JOIN)

자체 조인 (SELF JOIN)

JOIN 문 작성

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

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

JOIN 의 종류

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)

JOIN 문은 어려운 것이 아니다

일단 SELECT FROM WHERE 부터 나열한다

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

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

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

조인 (JOIN) 구문 (1)

SELECT

FROM

WHERE

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

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

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

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

내부 조인 (INNER JOIN)

가장 일반적인 JOIN 방법

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

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

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

내부 조인 (INNEER JOIN) (1)

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

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

동등조인 (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

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

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

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

상호 조인 (CROSS JOIN)

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

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

상호 조인 (CROSS JOIN)

SELECT title, price, qty

FROM titles CROSS JOIN sales

SELECT title, price, qty

FROM titles, sales

외부 조인 (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

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

SELF JOIN 의 개념

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

SELF JOIN 의 개념

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

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

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

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

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

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

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

USE NorthwindSELECT EmployeeID, LastName, ReportsToFROM Employees

Fuller

Davolio Leverling Peacock Buchanan Callahan

Suyama King Dodsworth

모든 직원에 대한 상급자 구하기 (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

모든 직원에 대한 부하직원 구하기 (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

작가와 책 사이의 관계

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

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

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

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

USE pubs

SELECT *

FROM titleauthor

ORDER BY title_id

공동 저자 구하기

동일한 컬럼에 조인 걸기 (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

공동 저자 구하기 ( 계속 )

동일한 컬럼에 조인 걸기 (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

공동 저자 구하기 ( 계속 )

동일한 컬럼에 조인 걸기 (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

공동 저자 구하기 ( 계속 )

동일한 컬럼에 조인 걸기 (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

실습 과제 과제 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 이상인 책만을 구하는 것이다 .

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

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

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

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

직원을 알 수 있도록 하라 .

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

학습 요약

이번 시간에는

INNER JOIN

CROSS JOIN

OUTER JOIN

SELF JOIN

에 대해 알아 보았습니다 .

top related