PostIT

[DB/MariaDB] SQL 예제를 통한 JOIN의 종류 파악 본문

DB/MariaDB

[DB/MariaDB] SQL 예제를 통한 JOIN의 종류 파악

shun10114 2017. 4. 13. 18:12

# DB, JOIN의 종류와 SQL를 통한 JOIN 파악 [MariaDB]


- 최근 수정일 : 2017.04.13

- IDE : Spring Tool Suite

- OS : OSX Sierra (10.12.3)

- DB : MariaDB(Ver 15.1 Distrib 10.1.17-MariaDB)


##1. 배경


DB를 사용하면 할 수록 성능최적화가 요구된다. 특히, 최근에 읽은 JPA책에서도 조인의 종류를 잘 써야하며, JOIN의 따라 성능이 달라질 수 있다는 문구를 봤다. 그러한 글을 보고 JOIN에 대해 직접 정리하면서 자세히 알아봐야겠다는 생각을 하게 되었다.



##2. 목표

    • 조인의 종류와 각각의 용도와 차이점을 이해한다.
    • 각 조인 별 SQL문법의 차이를 이해한다.

- 예제 SQL파일 

example_SQL.sql


* SQL의 조건 및 설정

1) 20개의 블로그 데이터
2) 10개의 파일 데이터(1~10개의 블로그와 참조 - 11 ~ 20은 참조되지 않았다.)



##3. 내용 - 조인의 종류와 SQL 예제



* Mysql을 기반으로하는 MariaDB는 Full Join이 지원되지 않습니다. 만약 값을 모두 조인된 것을 가져오고 싶으면 UNION을 사용 할 수 있습니다. FULL JOIN 대신 UNION으로 대체하겠습니다.



* 조인 시 고려사항
1) 조인은 하나의 쿼리에서 여러 테이블이 참조되기 때문에 모든 열 참조는 명확해야 한다. (테이블이름.컬럼이름)
2) 조인조건은 FROM절이나 WHERE 절에 지정할 수 있으며 FROM 절에 지정하는 것이 좋다.
3) WHERE절과 HAVING 절에는 조인 조건에서 선택된 행을 자세히 필터링하는 검색 조건이 포함될 수 있다.


###1. JOIN

둘 이상의 테이블 간의 논리적 관계를 기준으로 데이터를 검색하여 결과 집합을 만든다. 


SELECT

B.`BLOG_ID`,

B.`BLOG_CONTENT`,

F.`FILE_BLOG_ID`,

F.`FILE_ID`,

F.`FILE_ORIGIN_NAME`

FROM 

TB_BLOG B

JOIN 

TB_FILE_DATA F


GROUP BY

B.`BLOG_ID`

HAVING 

B.`BLOG_ID`=1

설명 :

      • INNER를 입력하지 않으면, JOIN의 기본 JOIN은 INNER JOIN이 적용된다.
      • 조인을 통해 하나의 Row에 다른 Table의 Row가 조인된다. 즉, 열 참조가 명시되지 않아 BLOG 값 1개에 FILE 열이 10개씩 참조된다.(GROUP BY와 HAVING 제외 시)
      • GROUP BY를 통해 해당 조인의 그룹의 기준 Column을 정한다. 
      • HAVING, WHERE과 비슷하며, 해당 Column을 가지고 있을 시 해당 값을 가져온다.



###2. INNER JOIN

결합된 테이블에 조건의 내용이 공통으로 들어가 있는 값을 결과 집합으로 만들어준다. ON 다음에 들어가는 조건에 맞는 내용들만 보여주게 된다.


SELECT

B.`BLOG_ID`,

B.`BLOG_CONTENT`,

F.`FILE_BLOG_ID`,

F.`FILE_ID`,

F.`FILE_ORIGIN_NAME`

FROM 

TB_BLOG B

INNER JOIN 

TB_FILE_DATA F

ON 

B.BLOG_ID = F.FILE_BLOG_ID


WHERE 

필요 조건 입력

ORDER BY

B.`BLOG_ID` ASC|DESC

설명 : 

      • INNER를 입력하지 않으면, JOIN의 기본 JOIN은 INNER JOIN이 적용된다.
      • ON을 통해 참조된 값을 찾아올 때 쓰인다. FK키로 직접 참조되지 않아도, 같은 값을 갖고 있고, 의미하는게 같다면 조인되어 가져올 수 있다.
      • WHERE은 추가 조건에 해당되는 값을 찾을 때 쓰이며, ORDER BY는 해당 Column값을 기준으로 오름차순, 내림차순을 정할 수 있다.
      • ON을 통해 가져오는 값에서 FK키를 쓰지 않으면 데이터의 참조 무결성에 문제가 발생되지만, 요구사항이 자주 변화하여 가끔 테이블끼리 참조되지 않고, 값만 가지고 쓰는 경우를 보게 된다. 그래도 RDBMS의 정석은 FK키를 쓰는 것이다.)



###3. OUTER JOIN(LEFT, RIGHT)
INNER JOIN 문을 포함하고 한쪽에만 내용이 있더라도 지정한 기준 테이블에 있는 모든 데이터를 가져오는 조인방식


SELECT

B.`BLOG_ID`,

B.`BLOG_CONTENT`,

F.`FILE_BLOG_ID`,

F.`FILE_ID`,

F.`FILE_ORIGIN_NAME`

FROM 

TB_BLOG B

LEFT | RIGHT OUTER JOIN 

TB_FILE_DATA F

ON 

B.BLOG_ID = F.FILE_BLOG_ID

WHERE 

필요 조건 입력

ORDER BY

B.`BLOG_ID` ASC|DESC


설명 : 

    • FROM에 입력되는 테이블이 LEFT TABLE로 생각하며, LEFT OUTER JOIN 시 LEFT TABLE의 기준으로  BLOG의 20개 데이터와 File 10개의 데이터 10개의 널 데이터를 모두 가져온다. (총 20 Row)
    • FROM에 입력되지 않은 테이블이 RIGHT TABLE로 생각하며, RIGHT OUTER JOIN 시 RIGHT TABLE의 기준으로 BLOG 10개의 데이터와 FILE 10개의 데이터만 가져온다. (총 10 Row)
    • ON을 통해 참조된 값을 찾아올 때 쓰인다. FK키로 직접 참조되지 않아도, 같은 값을 갖고 있고, 의미하는게 같다면 조인되어 가져올 수 있다.
    • WHERE은 추가 조건에 해당되는 값을 찾을 때 쓰이며, ORDER BY는 해당 Column값을 기준으로 오름차순, 내림차순을 정할 수 있다.

 


###4. CROSS JOIN

결과값이 한쪽 테이블의 모든행들과 다른쪽 테이블의 모든 행을 조인시킨다.

결과 집합은 두 테이블의 개수를 곱한 값만큼 생성되며, 조인되는 테이블에 공통되는 행이 없어도 되며 조건절인 ON 키워드가 사용되지 않는다.

SELECT

B.`BLOG_ID`,

B.`BLOG_CONTENT`,

F.`FILE_BLOG_ID`,

F.`FILE_ID`,

F.`FILE_ORIGIN_NAME`

FROM 

TB_FILE_DATA F

CROSS JOIN 

TB_BLOG B

설명 : 

      • ON을 입력하지 않은 JOIN과 같은 결과가 나오지만, CROSS JOIN의 개념은 두개의 테이블의 행을 모두 연결하는 것과 같다.
      • 즉, CROSS JOIN은 첫 번째 테이블의 각 행과 두 번째 테이블의 각 행을 결합하는 행을 생성하는 것이다.
      • 반대로, JOIN의 결과는 테이블의 모든 레코드의 카디 전 곱 (또는 CROSS JOIN)을 후 (테이블 A의 모든 레코드와 테이블 B의 모든 레코드를 결합한) 결과로 정의 할 수 있습니다 



###5. SELF JOIN

하나의 테이블에 같은 데이터가 존재하는데 그 의미가 다르게 존재하는 경우. 즉, 같은 데이터이지만 다른 열에 있는 경우에는 두 테이블을 서로 SELF JOIN 문으로 확인가능


SELECT 

B.`BLOG_ID` AS BLOG_INDEX,

F.`BLOG_ID` AS BLOG_KEY

FROM 

TB_BLOG F, TB_BLOG B

설명 : 

      • 같은 테이블의 같은 값을 가져왔지만, AS로서 명칭을 다르게 가져와 사용할 수 있다.

###6. UNION

한쪽의 테이블과 다른 쪽의 테이블의 결과값을 1개의 결과값으로 가져오는 JOIN을 말한다.


SELECT 

`FILE_ORIGIN_NAME`,`FILE_ID`

FROM 

TB_FILE_DATA

UNION

SELECT

`BLOG_ID`,`BLOG_CONTENT`

FROM

TB_BLOG


설명 : 

      • 각각의 테이블의 결과 값을 1개의 결과 값으로 가져오기 위한 것.


##4. 결론

      • 필요한 데이터들을 조회하고 사용하기 위해서는 조인의 용도와 목적에 대해서 이해해야한다.
      • NULL 값을 고려하여, 각각의 조인을 사용해야 하며, 특히, 각 사이트의 모든 검색물에 대한 검색기능을 제공할 때 조인의 기본적인 지식을 알고 있어야 한다.
      • 조인 시 조인되는 조인하는 Table의 기준점을 알아야하며, 각 SQL문법에 따라 기준점을 파악하고 의미를 파악해야 한다.


## * 참조 사이트

- http://enspring.tistory.com/m/581

https://www.w3schools.com/sql/sql_join.asp

- http://www.w3resource.com/mysql/mysql-union.php

Comments