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 을
사용한다.
|