데이터베이스를 사용하다보면 여러 테이블이 나눠진 상황에서 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 공부를 마쳤다. 소스코드 삽입부터 계속해서 포스팅을 수정해나갈 예정이다.
'My > Study' 카테고리의 다른 글
Clean Code - 1 (1) | 2021.07.12 |
---|---|
[Forensic] NTFS 파일 시스템에서 파일 복구해보기 (2) | 2020.10.16 |
[Network] WPA2 Cracking with Hashcat (0) | 2020.10.14 |
[네트워크] Suricata(수리카타) 공부 (0) | 2020.07.23 |
[Analysis] PE(Portable Executable) 파일 포맷 공부 (2) | 2020.06.13 |