이 내용은 2011년 6월 현재 SQL2011(코드명 Denali) Beta를 기준으로 작성 되었으며
SQL2011(코드명 Denali) 공식버전(RTM) 발표까지 꾸준히 업데이트 예정입니다.
아울러, 현재 Beta버전이지만 강좌를 따라해
보시는데 아무 문제 없으실거에요. 도움 되시길
바랍니다.
==================================================================================================
안녕하세요. 이스트럭(강동운) 입니다.
이번에는 DDL 에서 SELECT 절을 이용해 두개 이상의 테이블에서 데이터를 가져올 경우JOIN 을 활용해서 가지고 올 수 있습니다. 여기서 JOIN의 방식들은 어떤 것이 있는지에 대해서 설명을 드리겠습니다.
JOIN 이란?
A 테이블과 B의 테이블의 결합!
즉 두 개 이상의 테이블에 있는 데이터를 가지고 오는 수단이라고 보시면 되겠습니다.
JOIN 해서 얻을 수 있는 집합은 크게 3가지로 구성되어있으며, OUTER
JOIN은 3가지로 나뉩니다.
1. CROSS
JOIN
2. INNER
JOIN
3. OUTER JOIN(LEFT, RIGHT, FULL
OUTER)
예제를 위해 테이블을 만들어보도록 하겠습니다.
USE tempdb GO IF OBJECT_ID('JoinA','U') IS NOT NULL DROP TABLE JoinA GO IF OBJECT_ID('JoinB','U') IS NOT NULL DROP TABLE JoinB GO CREATE TABLE JoinA(idx INT NOT NULL) GO CREATE TABLE JoinB(idx INT NOT NULL) GO INSERT INTO JoinA VALUES(1),(2),(3) INSERT INTO JoinB VALUES(1),(5) GO |
JoinA 테이블에는 1,2,3의 row를 가지고 있고
JoinB 테이블에는 1,5의 row를 가지고 있습니다.
첫 번째, CROSS
JOIN
CROSS JOIN은 A 테이블에 n개가 있고,
B 테이블에 m개가 있으면, 얻을 수
있는 row는..총 m*n개에 해당이 됩니다. 즉 A테이블에 있는 모든 원소와 B테이블에 있는 모든 원소가 결합되는
테이블을 말합니다.
예제를 살펴보도록 하겠습니다.
--//ANSI
SQL-92 문법 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A --// AS A 는 JoinA 라는 테이블의 별칭입니다. CROSS JOIN JoinB AS B --// AS
B 는 JoinB 라는 테이블의 별칭입니다.
|
A에 있는 1,2,3과 B에 있는 1,5와 모두 결합이 되어 나타나게 됩니다.
이게 바로 CROSS JOIN 이며, 보통 원본 테이블을 두번이상 읽어야 하는 경우에 한번만 읽어서 뻥튀가 하는데 주로 이용합니다.
나중에 접하시겠지만, 열 => 행으로 바꿀 때 많이 사용하는 방법 중 하나 입니다.
--//ANSI
SQL-89 문법 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A ,
JoinB AS B |
ANSI SQL-92 문법에 비해 오래된 ANSI SQL-89 문법은 중간에 CROSS JOIN이란 단어가
없이 컴마로 구분됩니다. SQL Server Denali에서는 ANSI
SQL-92와 89 문법을 모두 제공하지만, 되도록이면 최신에 계정된 ANSI SQL-92 문법을 사용하는
것이 좋습니다. 오래된 방식이다 보니 차기버전 혹은 그 후 버전에서는 사용하지 못할 수도 있기
때문입니다.
두 번째, INNER
JOIN(내부 조인).
INNER
JOIN은.. A 테이블과 B 테이블간의 교집합을
의미합니다.
예제를 바로 보도록 하겠습니다.
--//ANSI
SQL-92 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A INNER JOIN JoinB AS B ON A.idx = B.IDX
|
CROSS JOIN는 두개의 테이블의 행이 조인이 되기 때문에 따로
조인 조건이 필요하지 않지만, INNER JOIN은 서로 공통이 되는 키 값을 가지고 올 수 있도록
하기 위해 ON 절 뒤에..연결고리가 될 수 있는 Key를 지정해야 하는 것이 특징입니다.
또한 중간에 INNER 라는 단어를 넣지 않아도 DEFAULT 값이기 때문에 똑같이 작동합니다.
--//ANSI
SQL-92 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A JOIN JoinB AS B ON A.idx = B.IDX |
INNER JOIN의 ANSI
SQL-89버전은 아래와 같습니다.
--//ANSI
SQL-89 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A, JoinB AS B WHERE A.IDX = B.IDX |
또한 꼭 조건이 = 이
아니라도 가능합니다!
--//ANSI
SQL-92 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A INNER JOIN JoinB AS B ON A.IDX < B.IDX
|
세 번째, OUTER
JOIN(외부 조인)
OUTER
JOIN 의 종류는 3가지(LEFT, RIGHT, FULL)가 있습니다.
1. LEFT OUTER JOIN
LEFT OUTER JOIN 예제를 살펴보도록 하겠습니다.
--//ANSI
SQL-92 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A LEFT OUTER JOIN JoinB AS B ON A.IDX = B.IDX
|
A 집합에 해당하는 TableA에 있는 1,2,3과 대칭이 되는 JoinB와 매칭되어 나오게 됩니다.
매칭이 되지 않은 값(없는 값)에 대해서는 NULL의 데이터를 가지고 나오게 됩니다.
위의 예제에서는.. JoinB에는..
IDX 값이 2, 3이 없기 때문에 NULL을
반환하게 됩니다.
2. RIGHT OUTER JOIN
RIGHT OUTER JOIN 은.. 단지 기준이 되는 테이블의 위치가 변경 된 것을 말합니다.
예제를 살펴보도록 하겠습니다.
--//ANSI
SQL-92 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A RIGHT OUTER JOIN JoinB AS B ON A.IDX = B.IDX
|
이제 좀 이해가 가시나요? 위의 결과는 아래와도 같겠죠~!
--//ANSI
SQL-92 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinB AS B LEFT OUTER JOIN JoinA AS A ON A.IDX = B.IDX |
3. FULL OUTER JOIN
FULL OUTER JOIN은 두 개의 테이블에 조합이 가능한 모든
키를 매칭해서 보여줍니다.
예제를 살펴보도록 하겠습니다.
--//ANSI
SQL-92 SELECT A.IDX AS AIDX , B.IDX AS BIDX FROM JoinA AS A RIGHT OUTER JOIN JoinB AS B ON A.IDX = B.IDX
|
JoinA 테이블과 JoinB 테이블간의 조인 key 가 되는 IDX가 조합이 가능한 모든 조합이 추출이 됩니다.
각 키값에 매칭이 되지 않는 데이터는 NULL을 반환하게
됩니다.
이로서 간단한 조인에 방식에 대해서 살펴봤습니다.
감사합니다.
[출처] SQLER.COM http://www.sqler.com/390108
SQL2011(코드명 Denali) 시리즈 강좌
리스트
[SQL2011강좌] 1. 코드명
Denali 설치 방법
[SQL2011강좌] 2.
SSMS 접속 및 간단한 쿼리 실행
[SQL2011강좌] 3. SQL Server 의 MDF, LDF 그리고 데이터베이스 생성하기
[SQL2011강좌] 4. DDL 1탄: 테이블 생성
[SQL2011강좌] 5. DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가
및 삭제
[SQL2011강좌] 6. Primary
key와 Unique 제약조건
[SQL2011강좌]
7. DML 1탄 INSERT
[SQL2011강좌]
8. DML 1탄 INSERT(identity 속성)
[SQL2011강좌] 9. Sequence
[SQL2011강좌] 10. pubs, northwind Database 예제 설치
[SQL2011강좌] 11. SELECT(단일 테이블)
[SQL2011강좌] 12. SELECT(JOIN)
[SQL2011강좌] 13. UPDATE, DELETE
절
[SQL2011강좌] 14. DISTINCT,
UNION, UNION ALL 키워드
[SQL2011강좌] 15. ORDER BY, GROUP BY, HAVING
[SQL2011강좌] 16. SubQuery(서브쿼리)
[SQL2011강좌] 17. 뷰에 대한 이해 및 생성, 수정,
삭제
[SQL2011강좌] 18. 저장 프로시저에 대한
이해, 생성, 수정, 삭제
[SQL2011강좌] 19.
인덱스에 대한 이해
[SQL2011강좌] 20.
클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011강좌] 21. 트랜잭션에 대한이해
[SQL2011강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011강좌] 23. 잠금에 대한 이해
[SQL2011강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그 백업)
[SQL2011강좌] 25. 백업과 복구 전략
[SQL2011강좌] 26. 커서란?
SQL2011(코드명 Denali) 시리즈
동영상 강좌 리스트
[SQL2011 동영상 강좌] 1. 코드명 Denali 설치 방법
[SQL2011 동영상 강좌] 2.
SSMS 접속 및 간단한 쿼리 실행
[SQL2011 동영상 강좌] 3. SQL Server 의 MDF, LDF 그리고 데이터베이스
생성하기
[SQL2011 동영상 강좌] 4. DDL 1탄: 테이블 생성
[SQL2011 동영상 강좌] 5.
DDL 2탄: 쿼리를 이용한 테이블 컬럼 추가 및 삭제
[SQL2011 동영상 강좌] 6. Primary key와 Unique
제약조건
[SQL2011 동영상 강좌] 7. DML 1탄 INSERT
[SQL2011 동영상 강좌] 8.
DML 1탄 INSERT(identity 속성)
[SQL2011 동영상 강좌] 9. Sequence
[SQL2011 동영상 강좌] 10.
pubs, northwind Database 예제 설치
[SQL2011 동영상 강좌] 11. SELECT(단일 테이블)
[SQL2011 동영상 강좌] 12.
SELECT(JOIN)
[SQL2011 동영상 강좌] 13. UPDATE, DELETE 절
[SQL2011 동영상 강좌] 14.
DISTINCT, UNION, UNION ALL 키워드
[SQL2011 동영상 강좌] 15. ORDER BY, GROUP BY,
HAVING
[SQL2011 동영상 강좌] 16. SubQuery(서브쿼리)
[SQL2011 동영상 강좌] 17.
뷰에 대한 이해 및 생성, 수정, 삭제
[SQL2011 동영상 강좌] 18. 저장 프로시저에 대한 이해, 생성, 수정, 삭제
[SQL2011 동영상 강좌] 19.
인덱스에 대한 이해
[SQL2011 동영상 강좌] 20. 클러스터드 인덱스와 넌 클러스터드 인덱스
[SQL2011 동영상 강좌] 21.
트랜잭션에 대한이해
[SQL2011 동영상 강좌] 22. 트랜잭션의 격리수준 4가지
[SQL2011 동영상 강좌] 23.
잠금에 대한 이해
[SQL2011 동영상 강좌] 24. 백업과 복구에 대한 이해(풀백업, 차등백업, 트랜잭션 로그
백업)
[SQL2011
동영상 강좌] 25. 백업과 복구 전략
[SQL2011 동영상 강좌] 26. 커서란?
'프로그램&DB > MS-SQL' 카테고리의 다른 글
[MS-SQL2011강좌] 14. DISTINCT, UNION, UNION ALL 키워드 by 강동운님 (0) | 2011.08.23 |
---|---|
[MS-SQL2011강좌] 13. UPDATE, DELETE 절 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 11. SELECT(단일 테이블) by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 10. pubs, northwind Database 예제 설치 by 강동운님 (0) | 2011.08.23 |
[MS-SQL2011강좌] 9. Sequence by 강동운님 (0) | 2011.08.23 |