[MSSQL 강좌 - 8] JOIN (조인)


Study/Database  2013. 3. 15. 09:00

안녕하세요. 명월입니다.


이번 포스트는 MSSQL의 기초 Join에 대해 공부하겠습니다. 오랜만에 쿼리 공부를 하려니 감이 안 옵니다.

프로그래머는 MSSql 쿼리 공부가 중요합니다. DB 운용관리는 DBA가 해도 사용은 개발자가 하기 때문입니다. 기초적인 공부를 빨리 완성하고 안티SQL쿼리에 대해 공부하고 싶네요.


일단 전 포스트를 확인하니 테이블을 작성(Create)하고 값을 넣고(Insert), 수정(Update)하고 삭제(Delete)하는 것까지 공부했네요.

이제는 검색조건을 공부하는데 그중에서 여러 테이블을 합쳐서 검색하는 Join에 대해 공부하겠습니다.

위 테이블의 예제는 학교와 학년에 대한 테이블과 성적에 관한 테이블입니다.

저는 이 정보를 하나의 테이블로 합쳐서 「홍길동은 노원학교에 1학년, 성적은 국.영.수입니다.」 처럼 결과를 내보내고 싶습니다. 그러기 위해서는 두 테이블의 공통컬럼(키)을 결정하는데 저는 인덱스(idx)를 키로 설정, 즉 학교, 학년 정보 테이블의 idx 1은 성적 테이블의 idx 1과 같은 정보라는 설정을 하는 것입니다.

SELECT 
  a.Name,				-- 학교, 학년 테이블의 Name 컬럼
  a.학교,				-- 학교, 학년 테이블의 학교 컬럼
  a.학년,				-- 학교, 학년 테이블의 학년 컬럼
  b.국어,				-- 성적 테이블의 국어 컬럼
  b.영어,				-- 성적 테이블의 영어 컬럼
  b.수학				-- 성적 테이블의 수학 컬럼
FROM 
  Test_table a		-- 학교, 학년 테이블 a로 치환
  INNER JOIN			-- 조인
  성적 b				-- 성적 테이블을 b로 치환
  ON a.idx = b.idx	-- 키 조인

결과를 보니 두 테이블이 하나로 합쳐져서 홍길동의 학교는 노원, 학년은 1학년, 성적은 국.영.수가 나왔네요.


다시 정리해서 JOIN SQL를 정리하겠습니다.

SELECT <열목록> FROM <테이블 1> INNER JOIN <테이블 2> ON <검색될 조건> WHERE <검색조건>

INNER JOIN의 경우는 JOIN 테이블의 공통점을 엮어서 출력하는 JOIN 문입니다. 다시 말해, A 테이블에는 있으나 B테이블에 데이터가 없으면 출력되질 않는다는 의미입니다.
예를 들어, 중간에 신입생이 왔는데 아직 성적을 만들어지지 않았습니다. 그럴 경우는 그 신입생은 JOIN에서 검색되질 않습니다.


다른 조건의 예제를 만들어 보겠습니다.

SELECT 
  a.Name,				-- 학교, 학년 테이블의 Name 컬럼
  a.학교,				-- 학교, 학년 테이블의 학교 컬럼
  a.학년,				-- 학교, 학년 테이블의 학년 컬럼
  b.국어,				-- 성적 테이블의 국어 컬럼
  b.영어,				-- 성적 테이블의 영어 컬럼
  b.수학,				-- 성적 테이블의 수학 컬럼
  c.돈					-- 용돈 테이블의 돈
FROM
  Test_table a		-- 학교, 학년 테이블 a로 치환
  INNER JOIN			-- 조인
  성적 b				-- 성적 테이블을 b로 치환
  ON a.idx = b.idx	-- 키 조인
  INNER JOIN
  용돈 c				-- 용돈 테이블을 c로 치환
  ON a.idx = c.idx	-- 키 조인

학교, 학년 테이블과 성적 테이블을 조인하는 것은 위 결과를 봤을 때 약 10개의 결과가 나왔습니다.

그 결과에 용돈 테이블을 조인하겠습니다. 용돈 테이블의 경우는 데이터가 두 개 밖에 없네요.

결과를 보면 용돈 테이블의 데이터가 없는 것은 JOIN이 되지 않아서 출력되지 않앗습니다. 그러나 우리는 용돈을 받지 않는 데이터도 필요할 때가 있습니다.

그럴 때는 OUTER JOIN을 이용해서 용돈 테이블에 데이터가 없어도 출력을 하라고 쿼리를 만들 수 있습니다.

SELECT 
  a.Name,				-- 학교, 학년 테이블의 Name 컬럼
  a.학교,				-- 학교, 학년 테이블의 학교 컬럼
  a.학년,				-- 학교, 학년 테이블의 학년 컬럼
  b.국어,				-- 성적 테이블의 국어 컬럼
  b.영어,				-- 성적 테이블의 영어 컬럼
  b.수학,				-- 성적 테이블의 수학 컬럼
  c.돈					-- 용돈 테이블의 돈
FROM
  Test_table a		-- 학교, 학년 테이블 a로 치환
  INNER JOIN			-- 조인
  성적 b				-- 성적 테이블을 b로 치환
  ON a.idx = b.idx	-- 키 조인
  LEFT OUTER JOIN
  용돈 c				-- 용돈 테이블을 c로 치환
  ON a.idx = c.idx	-- 키 조인

여기까지 나온 데이터를 가지고 조건을 걸어보겠습니다.

SELECT 
  a.Name,				-- 학교, 학년 테이블의 Name 컬럼
  a.학교,				-- 학교, 학년 테이블의 학교 컬럼
  a.학년,				-- 학교, 학년 테이블의 학년 컬럼
  b.국어,				-- 성적 테이블의 국어 컬럼
  b.영어,				-- 성적 테이블의 영어 컬럼
  b.수학,				-- 성적 테이블의 수학 컬럼
  isnull(c.돈,0) as 돈	-- 용돈 테이블의 돈
FROM
  Test_table a		-- 학교, 학년 테이블 a로 치환
  INNER JOIN			-- 조인
  성적 b				-- 성적 테이블을 b로 치환
  ON a.idx = b.idx	-- 키 조인
  LEFT OUTER JOIN
  용돈 c				-- 용돈 테이블을 c로 치환
  ON a.idx = c.idx	-- 키 조인
WHERE
  a.학교 = '노원' 
AND
  a.학년 = '1'
AND
  b.수학 > 80
AND
  c.용돈 is null
ORDER BY
  영어 DESC

위 예제는 노원학교의 1학년으로 재학 중이고 용돈을 받지 않고도 수학점수가 80점인 학생을 영어성적순으로 나타내라는 의미입니다.

SQLQuery는 이 조인만 잘 알아도 데이터 베이스의 70%는 안다고 합니다. 그만큼 조인은 중요합니다. 이번 포스트에서는 기본적인 JOIN 사용방법에 대해서 공부했지만, 조인을 잘 못 쓰면 데이터베이스가 전체적으로 느려지는 경우도 발생합니다.(안티 쿼리) 기회가 있으면 공부하고 싶네요.