티스토리 뷰

1 . 데이터의 결합방법

1) 가로로 연결 : JOIN

     - 의미 있는 연결을 위해서는 로우(ROW)의 공통 요소를 이용하여 연결할 경우 사용

2) 세로로 연결 : UNION

     - 컬럼(Colum)의 공통된 형식을 어기면 연결 불가

2 . JOIN

가로(수평적)로 하나의 결과 집합과 다른 결과 집합을 연결하는 것

(집합 : 테이블, 뷰, 인라인뷰, 테이블변수....)

조인의 종류

 ◎ INNER JOIN

 ◎ OUTER JOIN (LEFT , RIGHT 모두)

 ◎ FULL JOIN

 ◎ CROSS JOIN

 ◎ SELF JOIN

1) INNER JOIN

 두 집합간의 하나나 그 이상의 공통 필드들에 기반해서 레코드들을 일치

 INNER JOIN 은 배타적(exclusive) 결합 이다.

 두 집합(테이블) 모두에서 일치하는 것이 없으면 그 레코드는 반환되지 않는다.

 ▷ 구문

<ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> INNER JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

 SELECT <선택_목록>

 FROM <결과집합1> JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 ▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d JOIN stores s

                               ON d.stor_id = s.stor_id

1) OUTER JOIN

JOIN 이전에 나오는 테이블은 왼쪽(LEFT) 테이블이 되고 , JOIN 이후에 나오는 테이블이 오른쪽(RIGHT) 테이블이 된다.

LEFT OUTER JOIN 은 왼쪽 테이블로부터 모든 정보를 포함시키며

RIGHT OUTER JOIN 은 오른쪽 테이블로부터 모든 정보를 포함시킨다

 ▷ 구문

 <ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> LEFT OUTER JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> *= <결과집합2>.<조인조건2>

 <ANSI>

SELECT <선택_목록>

 FROM <결과집합1> RIGHT OUTER JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> =* <결과집합2>.<조인조건2>

 

▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d LEFT OUTER JOIN stores s

                               ON d.stor_id = s.stor_id

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d RIGHT OUTER JOIN stores s

                               ON d.stor_id = s.stor_id

 

※ OUTER JOIN 을 이용하여 일치하지 않는 레코드들 찾기

-- 할인 레코드를 가지지 않은 모든 상점들의 이름 찾기

 

       USE Pubs

       SELECT s.stor_name AS [Store Name]

       FROM discounts d RIGHT OUTER JOIN stores s

                               ON d.stor_id = s.stor_id

       WHERE d.stor_id IS NULL

3) FULL JOIN

JOIN 양쪽의 데이터를 모두 일치 시켜서 양쪽 모두를 포함시키는 것이다.

어느쪽에도 중점을 두지 않고 양쪽 모두의 데이터를 보려 할 때를 위하여 만들어진 것

간단히 FULL JOIN 은 RIGHT JOIN 과 LEFT JOIN 을 동시에 적용하는 것이라 할 수 있다.

 ▷ 구문

<ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> FULL JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> *= <결과집합2>.<조인조건2>

 UNION

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> =* <결과집합2>.<조인조건2>

▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d FULL JOIN stores s

                               ON d.stor_id = s.stor_id

4) CROSS JOIN

한쪽의 모든 레코드를 그 반대쪽의 모든 레코드들과 결합시킨다.

간단히 CROSS JOIN 은 '데카르트의 곱(Cartesian product)' 이라 할수 있다

CROSS JOIN 의 구문 구조는 ON 연산자가 없다는 점만 빼고는 다른 JOIN 들과 동일하다.

테스트용 데이터를 만드는 용도로 사용한다.

 ▷ 구문

<ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> CROSS JOIN <결과집합2> 

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2> 

▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d CROSS JOIN stores s

5) SELF JOIN

필요에 의해 JOIN 구문에 같은 테이블이 두번 이상 등장하는 경우이다.

 

자신의 상급자를 매핑하기위해 SELF 조인을 사용한 예제이다.

▷ 예제

       USE Northwind

       SELECT a.EmployeeID, a.LastName, a.FirstName, b.EmployeeID, b.LastName, b.FirstName

       FROM employees a, employees b

       WHERE a.reportsTo = b.employeeid

2 . UNION

2개이상의 데이터 집합을 세로(수직적)로 연결하는 방법으로

결합되는 각 컬럼간의 형식이 일치하면 하나의 집합으로 도출 가능하다.

 

▷ 주의점

 ◎ UNION 으로 쿼리들을 결합할 때, 모든 쿼리들의 SELECT 목록에 있는 열들의 개수는 같아야 한다.

 ◎ 결합된 결과의 제일 처음에 나타날 헤더들은 오직 첫번째 쿼리에 의해서만 결합된다.

 ◎ 결합될 쿼리들의 각 열들은 동일한 데이터 형식이거나 적어도 묵시적으로 변환될 수 있는 것들이어야 한다.

 ◎ UNION 의 경우 기본적으로 DISTINCT 가 적용된다. 중복된 행을 표시하고 싶들떄는 UNION ALL 을 사용한다.

 

Northwind 에 관련된 모든사람에게 우편물을 보내고자 할 때의 UNION 을 통해 모든 사람의 주소를 가져오는 쿼리

▷ 예제

       USE Northwind

 

       SELECT CompanyName as Name, Address, City, Region, PostalCode, Country

       FROM Customers

       UNION

       SELECT CompanyName , Address, City, Region, PostalCode, Country

       FROM Suppliers

       UNION

       SELECT FirstName + ' ' + LastName , Address, City, Region, PostalCode, Country

       FROM Employees

 
3 . 요약

RDBMS 에서는 데이터를 둘 이상의 테이블에 분산시켜야 하는 경우가 많다.

따라서 JOIN 및 UNION 을 이용하여 여러 테이블들의 있는 데이터를 결합시켜 사용 할 수 있다.

 ◎ 일치하지 않는 열들을 제외하고자 할 경우에는 INNER JOIN 을 사용한다.

 ◎ 일치하는 것들을 뽑아야 할 뿐만 아니라, JOIN의 한 쪽에 있는 테이블의 모든 것들을 포함시키려 할 때는 OUTER JOIN 을 사용한다.

 ◎ 일치하는 것들을 뽑아야 할 뿐만 아니라, 양쪽에 있는 테이블의 모든 것들을 포함시키려 할 때는 FULL JOIN 을 사용한다.

 ◎ 두 테이블의 대해 행들에 기반한 데카르트 곱을 수행하려 할 때에는 CROSS JOIN 을 사용한다. 과학계산이 필요하거나 테스트 데이터를 생성할때 유용하다.

 ◎ 여러 쿼리들의 결과를 수직적으로 결합할 때에는 UNION 을 사용한다.

댓글