티스토리 뷰
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 |
JOIN 이전에 나오는 테이블은 왼쪽(LEFT) 테이블이 되고 , JOIN 이후에 나오는 테이블이 오른쪽(RIGHT) 테이블이 된다.
LEFT OUTER JOIN 은 왼쪽 테이블로부터 모든 정보를 포함시키며
RIGHT OUTER JOIN 은 오른쪽 테이블로부터 모든 정보를 포함시킨다
▷ 구문
<ANSI> FROM <결과집합1> LEFT OUTER JOIN <결과집합2> ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>
<T-SQL> 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 을 사용한다. |
'Database > General' 카테고리의 다른 글
SQL Server 진단을 위한 주요 성능카운터 (0) | 2014.02.20 |
---|---|
서버에서 데이터 베이스 이용시 유의 사항 (0) | 2010.08.13 |
한 테이블에 존재하는 인덱스의 종류에 따른 차이 (1) | 2009.03.26 |
인덱스 정리 (0) | 2009.03.26 |
인덱스가 있지만 인덱스를 안 타는 경우 (0) | 2009.03.26 |
- Total
- Today
- Yesterday
- 게임데브포에버
- NDC2013
- EzShortcut
- Rails
- 조엘 온 소프트웨어
- MS-SQL
- ftp
- ruby
- 임백준
- TDD
- 엘키
- 좋은 프로그래머
- svn
- 루비 온 레일즈
- EasyExec
- TraceRoute
- SDL
- Ruby on Rails
- 바로가기 프로그램
- SQLite Spy
- 디자인 패턴
- perfmon
- 리버스 엔지니어링
- 루비
- 멀티스레드
- 디버깅
- 게임개발포에버
- RoR
- c언어
- CppSQLite
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |