Database

SQL JOIN

k9e4h 2017. 1. 6. 13:56

[DBGuide.net JOIN]

http://www.dbguide.net/db.db?cmd=view&boardUid=148197&boardConfigUid=9&categoryUid=216&boardIdx=134&boardStep=1

  두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것을 JOIN이라고 하며, JOIN은 관계형 데이터베이스의 가장 큰 장점이면서 대표적인 핵심 기능이라고 할 수 있다. 일반적인 경우 행들은 PRIMARY KEY(PK)나 FOREIGN KEY(FK) 값의 연관에 의해 JOIN이 성립된다. 하지만 어떤 경우에는 이러한 PK, FK의 관계가 없어도 논리적인 값들의 연관만으로 JOIN이 성립 가능하다.

  FROM 절에 여러 테이블이 나열되더라도 SQL에서 데이터를 처리할 때는 단 두 개의 집합 간에만 조인이 일어난다는 것이다. FROM 절에 A, B, C 테이블이 나열되었더라도 특정 2개의 테이블만 먼저 조인 처리되고, 2개의 테이블이 조인되어서 처리된 새로운 데이터 집합과 남은 한 개의 테이블이 다음 차례로 조인되는 것이다. 이순서는 4개 이상의 테이블이 사용되더라도 같은 프로세스를 반복한다. 예를 들어 A, B, C, D 4개의 테이블을 조인하고자 할 경우 옵티마이저는 ( ( (A JOIN D) JOIN C) JOIN B)와 같이 순차적으로 조인을 처리하게 된다. 이때 테이블의 조인 순서는 옵티마이저에 의해서 결정되고 과목3의 주요 튜닝 포인트가 된다.

  EQUI(등가) JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하는 경우에 사용되는 방법으로 대부분 PK ↔ FK의 관계를 기반으로 한다.

  Non EQUI(비등가) JOIN은 두 개의 테이블 간에 칼럼 값들이 서로 정확하게 일치하지 않는 경우에 사용된다. Non EQUI JOIN의 경우에는 “=” 연산자가 아닌 다른(Between, >, >=, <, <= 등) 연산자들을 사용하여 JOIN을 수행하는 것이다.

  JOIN이 필요한 기본적인 이유는 과목1에서 배운 정규화에서부터 출발한다. 정규화란 불필요한 데이터의 정합성을 확보하고 이상현상(Anomaly) 발생을 피하기 위해, 테이블을 분할하여 생성하는 것이다. 사실 데이터웨어하우스 모델처럼 하나의 테이블에 모든 데이터를 집중시켜놓고 그 테이블로부터 필요한 데이터를 조회할 수도 있다. 그러나 이렇게 됐을 경우, 가장 중요한 데이터의 정합성에 더 큰 비용을 지불해야 하며, 데이터를 추가, 삭제, 수정하는 작업 역시 상당한 노력이 요구될 것이다. 성능 측면에서도 간단한 데이터를 조회하는 경우에도 규모가 큰 테이블에서 필요한 데이터를 찾아야 하기 때문에 오히려 검색 속도가 떨어질 수도 있다. 테이블을 정규화하여 데이터를 분할하게 되면 위와 같은 문제는 자연스럽게 해결 된다. 그렇지만 특정 요구조건을 만족하는 데이터들을 분할된 테이블로부터 조회하기 위해서는 테이블 간에 논리적인 연관관계가 필요하고 그런 관계성을 통해서 다양한 데이터들을 출력할 수 있는 것이다. 그리고, 이런 논리적인 관계를 구체적으로 표현하는 것이 바로 SQL 문장의 JOIN 조건인 것이다. 관계형 데이터베이스의 큰 장점이면서, SQL 튜닝의 중요 대상이 되는 JOIN을 잘못 기술하게 되면 시스템 자원 부족이나 과다한 응답시간 지연을 발생시키는 중요 원인이 되므로 JOIN 조건은 신중하게 작성해야 한다.


[다양한 조인(JOIN) 기법]

http://blog.ngelmaum.org/entry/lab-note-sql-join-method

내부 조인(Inner Join)은 둘 이상의 테이블에 존재하는 공통 컬럼(속성)의 값이 같은 것을 결과로 추출.

    - equi join, natural join, cross join

외부 조인(Outer Join)은 대상 테이블에서 특정 테이블의 데이터가 모두 필요한 상황에 사용.


[오라클실습(전문가로가는지름길) 저자 블로그]

http://blog.daum.net/why_i_am/45


[Mysql Join 해부]

http://rapapa.net/?p=311

Left 혹은 right join은 기준 테이블, 즉 반드시 출력되는 테이블을 잡아 줍니다.

 Left Join인 경우 왼쪽 테이블이 기준이 됩니다. 따라서, 왼쪽 테이블의 모든 Row가 결과값에 반드시 한줄 이상 나오는 보장을 받게 됩니다.

[20170217 추가]

http://wkdgusdn3.tistory.com/entry/mysql%EC%97%90%EC%84%9C-full-outer-join-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

* MySql은 Full Outer Join 지원 안함

* 그래서 left outer join, right outer join을 union 해야한다.


http://noritersand.tistory.com/3


[inner join]

 http://kokun.tistory.com/entry/INNER-JOIN-%EB%82%B4%EB%B6%80-%EC%A1%B0%EC%9D%B8


SELECT * FROM buyTbl

INNER JOIN userTbl

ON buyTbl.userid = userTbl.userid

WHERE buyTbl.userid = 'JYP' ;


우선 구매테이블의 userid (buyTbl.userid)인 'JYP'을 추출하게 된다. 그리고 'JYP'와 같은 값을 회원 테이블의 userid (userTbl.userid)열에서

검색한 후, 'JYP'라는 아이디를 찾게 되면 구매 테이블과 회원 테이블의 두 행을 결합(JOIN)한다.



반응형

'Database' 카테고리의 다른 글

SQL 특정 기간 중복 조회하기  (0) 2017.02.07
mybatis selectkey  (0) 2017.02.02
SQL CHAR와 VARCHAR의 차이  (0) 2017.01.04
[Mybatis] resultType & resultMap  (0) 2016.11.30
<![CDATA[<=]]>  (0) 2016.11.24