JOIN (조인) [MSSQL]

공부/MSSQL  2013.03.15 09:00

안녕하세요. 명월입니다.
이번 포스트는 MSSQL의 기초 Join에 대해 공부하겠습니다. 오랜만에 쿼리 공부를 하려니 감이 안 옵니다.
프로그래머는 MSSql 쿼리 공부가 중요합니다. DB 운용관리는 DBA가 해도 사용은 개발자가 하기 때문입니다. 기초적인 공부를 빨리 완성하고 안티SQL쿼리에 대해 공부하고 싶네요.


일단 전 포스트를 확인하니 테이블을 작성(Create)하고 값을 넣고(Insert), 수정(Update)하고 삭제(Delete)하는 것까지 공부했네요.
이제는 검색조건을 공부하는데 그중에서 여러 테이블을 합쳐서 검색하는 Join에 대해 공부하겠습니다.


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





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


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



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


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




학교, 학년 테이블과 성적 테이블을 조인하는 것은 위 결과를 봤을 때 약 10개의 결과가 나왔습니다.
그 결과에 용돈 테이블을 조인하겠습니다. 용돈 테이블의 경우는 데이터가 두 개 밖에 없네요.



결과를 보면 용돈 테이블의 데이터가 없는 것은 JOIN이 되지 않아서 출력되지 않앗습니다. 그러나 우리는 용돈을 받지 않는 데이터도 필요할 때가 있습니다.
그럴 때는 OUTER JOIN을 이용해서 용돈 테이블에 데이터가 없어도 출력을 하라고 쿼리를 만들 수 있습니다.



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



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



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


댓글 8개가 달렸습니다.
댓글쓰기
  1. 윤충열
    2013.07.30 18:32 신고 |  수정/삭제  댓글쓰기

    오 탁월하십니다.
    평소 공부할때 예시가 없어 초보인 제가 어떻게 쿼리 작성해야하는지 몰랐는데
    여기에 좋은 예문이 있는 것을 몰랐네요.
    정말 감사드립니다.
    (비번은 010을 제외한 제 핸폰번호로 설정했습니다)
    - 명월님 sql작성한 것 중에 2가지 질문이 있습니다.

    1) 3번째 쿼리의 where조건에서
    where
    a.학교 ='노원' and a.학년 ='1' and c.돈 isnull and b.수학 >80
    order by 영어 desc

    [c.돈 isnull]부분에서 다른 컬럼들은 조건 = 등호가 들어가는데
    isnull 부분만 어떤 형식이 들어가지 않고 에러없이 실행되는 이유가 무엇인가요??

    2) order by에서 b.영어 desc처럼 써야 할 것 같은데 다수의 테이블중에서
    테이블을 특정시키지 않아도 되는 이유는 중복되는 것이 없기 때문에 자동으로
    SQL이 보정해어서 인가요??

    • 明月 v명월v
      2013.07.31 01:04 신고 |  수정/삭제

      먼저 방문 감사드립니다.
      먼저
      1) null은 값이 없는 값이기 때문입니다.
      이건 조금 어려운데 DB도 어차피 파일시스템이기에 모든 것은 하드에 바이너리로 저장됩니다. 그러기에 null 값을 모두 저장하게 되면 자원적 낭비가 있기에, 값이 없는 형태로 저장합니다. 즉 값이 없는 값을 null이라는 값으로 나타내는 것이기 때문입니다. C언어에서 포인터 null 값을 참조하면 에러나는 것과 같은 개념(?)
      초보 이시라고 하면 이 개념을 이해하기엔 어렵습니다. 그냥 null은 is null, is not null 로 외우시고 후에 개념이 이해 되시면 다시 공부하는 것을 추천합니다.

      2) 데이터베이스도 결국에는 파일시스템으로 처리하는 값입니다.
      즉 데이터에 긁히는 시간의 차가 생긴다는 것이지요.
      쉽게 a,b라는 레코드가 있다고 가정하에 이 두 레코드는 입력의 시간차이 분명 존재합니다. order by 를 사용하지 않게 되면 이 입력시간의 순으로 즉 바이너리의 배열순으로 출력이 되겠습니다.
      그러나 order by라는 키워드를 사용함으로 소트를 하여 재 정렬을 실시하는 것입니다.

      ※ 개발을 하시다 보면 느끼겠지만 프로그램은 자동이란 것은 없습니다. 컴퓨터는 깡통이지요. 시키지 않으면 절대 계산하지 않습니다.
      order by를 하지 않았는데도 소트가 되었다고 느끼신다면 분명 그에 대한 인과관계가 있다고 생각됩니다.

  2. 윤충열
    2013.08.16 12:46 신고 |  수정/삭제  댓글쓰기

    명월님.

    해외에서 많이 바쁘실텐데 혹시라도 시간이 허락하신다면 다른 join문의
    예시를 좀 더 게시하여 주시길 부탁드립니다.

    더불어 각 join문의 특징들도 부가적으로 설명해주시면 감사하겠습니다.
    다행이 left outer join문에 대해 조금 공부해 놓은 것이 이해되는데 도움이 되었지만,
    부가적 설명이 있었다면 더 좋을 것 같아요.

    기본폼:

    select <열목록...> from
    <테이블 1> as 1 INNER JOIN <테이블 2> as 2
    ON <검색될 조건...참조되는 컬럼연결>
    where <검색 조건>


    그외 case문, 서브쿼리의 사용이유와 실질적 예문등등 추가적으로 게시되길 기대해봅니다.
    그리고 한국에 오시면 경기도 안산으로 오셔서 식사 한번 하시죠.
    감사합니다.


  3. 2013.08.21 10:04 |  수정/삭제  댓글쓰기

    비밀댓글입니다

  4. 정우성
    2015.02.04 12:36 신고 |  수정/삭제  댓글쓰기

    MSSQL 쿼리문 공부하면서 명월님 게시글이 많은 도움이 되었습니다

    2013년 이후로 업데이트가 안되고 있는것같은데 혹시 업데이트 계획은 따로 없으신지요??

    • 明月 v명월v
      2015.02.08 01:42 신고 |  수정/삭제

      안녕하세요... 블로그 방문 감사합니다...
      도움이 되신다니 다행이네요....
      현재 디비쪽은 크게 생각이 없는데... 나중에 기회되면... 우선순위로 해보겠습니다.

  5. mixMaven
    2016.01.04 18:34 신고 |  수정/삭제  댓글쓰기

    10강을 단번에 봤습니다. 예전글인데 잘 읽히네요~ 이번에 회사에서 MS-SQL을 쓰기때문에 MS-SQL공부를 하고 있는데 기본 DDL,DML 까지는 문법이 거의 똑같네요~ 컬럼 타입만 좀 조심하면 될거같습니다 ㅎ

    • 明月 v명월v
      2016.03.04 10:17 신고 |  수정/삭제

      감사합니다...꽤 예전에 작성한건데...
      이게 원래 목적은 안티 쿼리를 공부하려고 작성한거였는데...
      작성하다가 중간에 중단해 버렸네요... 이 게으름이란....
      시간 나면 처음부터 보강을 좀하고 좋은 정보를 제공하겠습니다.