반응형

데이터베이스를 사용하다보면 여러 테이블이 나눠진 상황에서 2개 이상의 테이블을 조합하여 원하는 결과를 도출해야되는 경우가 있다. 이를 위해서 JOIN을 사용할 수 있는데 MYSQL의 JOIN에 대해 자세히 들여다보자.


JOIN을 실습하기 위해 Mysql과 PhpMyAdmin을 이용해 다음과 같이 테이블을 구성하였다.

 

TABLE A - test_information

문제이름(Mission) 출제자(Maker)
국어문제 김선생
영어문제 이선생
수학문제 조선생
과학문제 구선생
일본어문제 나가사끼선생

TABLE B - test_result

문제이름(Mission) 푼인원수(Solver)
국어문제 30
영어문제 25
수학문제 16
과학문제 10
중국어문제 3

한테이블엔 문제이름과 출제자가 적혀있고, 나머지 한테이블엔 문제이름과 푼 인원수가 적혀있다.

본인은 두 테이블에 들어있는 정보를 이용하여 하나의 출력결과를 만들어 내고 싶다.

이를 위해 JOIN을 하나씩 사용해보자.

 

0. (INNER) JOIN

> 두개 이상의 관련 키가 존재하는 테이블에서 컬럼값을 비교하여 조건에 맞는 행을 검색

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

INNER JOIN test_result : 테이블 B로 JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과

 

1. OUTER JOIN

> LEFT 또는 RIGHT, FULL OUTER JOIN이 존재하며, 두 테이블에서 지정된 쪽인 LEFT 또는 RIGHT 방향의 모든 결과를 보여준 후 반대쪽에 대해는 매칭값이 없어도 표시

1-1. LEFT OUTER JOIN

> JOIN문의 LEFT에 있는 테이블 결과를 모두 가져온 후 RIGHT에 있는 테이블 데이터를 매칭하여 매칭되는 데이터가 없을땐 NULL을 표시

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

LEFT JOIN test_result : 테이블 B로 LEFT JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과 : A엔 나가사끼선생(일본어문제)이 있지만,  B엔 일본어문제가 존재하지않는다. 그래도 NULL로 넣어 출력한다.

1-2. RIGHT OUTER JOIN

> JOIN문의 RIGHT에 있는 테이블 결과를 모두 가져온 후 LEFT에 있는 테이블 데이터를 매칭하여 매칭되는 데이터가 없을땐 NULL을 표시

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

RIGHT JOIN test_result : 테이블 B로 RIGHT JOIN(문제이름, 푼 사람수)

ON test_information.Mission = test_result.Mission : 조건은 A의 문제이름과 B의 문제이름이 같은 행만

 

> 결과 : B엔 3명(중국어문제) 행이 있지만, A엔 중국어문제가 존재하지않는다. 그래도 NULL로 넣어 출력한다.

2. CARTESIAN(CROSS) JOIN

> 연관 테이블(두개 이상)에서 가능한 모든 조합을 찾음

> 입력 예제

SELECT test_information.Maker, test_result.Solver : 출제자와 푼 사람수를 출력

FROM test_information : 테이블 A 기준(문제이름, 출제자)

CROSS JOIN test_result : 테이블 B로 CROSS JOIN(문제이름, 푼 사람수)

 

> 결과 : 출제자와 푼 사람의 수의 모든 조합 경우의 수를 보여준다 행의 갯수는 A x B개이다.

3. SELF JOIN

> 자기 자신과 JOIN

> 입력 예제

SELECT info1.Mission, info2.Maker : 문제이름과 출제자를 출력

FROM test_information info1 : 테이블 A 기준(문제이름, 출제자)

JOIN test_information info2 : 테이블 A로 JOIN(본인에게)

ON info1.Mission = info2.Mission : 문제 이름이 같은경우

 

> 결과 : 당연히 같은 테이블에서 문제이름끼리 비교하면 모두 같으므로, 문제이름과 출제자의 모든 결과를 출력한다.


여기까지 JOIN 공부를 마쳤다. 소스코드 삽입부터 계속해서 포스팅을 수정해나갈 예정이다.

반응형

+ Recent posts