JOIN
은 여러 테이블 내에서 조건에 맞는 레코드들을 모아 테이블의 형태처럼 만들어 보여주는 것입니다. 보통 JOIN
구문은 SELECT명령과 함께 조합되어서 이용됩니다. 또한 JOIN
을 위해서 테이블에 외래키가 존재해야합니다.
실습을 위해서 다음과 같은 (교수-학생)테이블을 만들었습니다. 두 테이블의 Primary Key는 모두 id로 이 id 컬럼이 외래키가 됩니다.
JOIN 구문은 여러 종류가 있는데 4가지를 알아보겠습니다.
INNER JOIN
은 가장 기본적인 JOIN의 형태입니다. 그래서 MySQL에서는 INNER JOIN
을 JOIN으로 축약해서 사용하도록 만들어져 있습니다. INNER JOIN
의 동작은 조건에 만족하는 데이터만을 가져오는 동작을 합니다.
INNER JOIN
구문의 사용법은 다음과 같습니다. SELECT 구문의 FROM 구문 뒤에 첫 번째로 사용할 테이블 이름을 넣고 JOIN(또는 INNER JOIN) 구문 뒤에 두 번째 테이블 이름을 넣습니다. 그리고 ON구문 뒤에 조건을 넣으면 됩니다. 여기에 추가로 ON 구문 이후에 WHERE 구문을 삽입할 수도 있습니다.
SELECT 컬럼 FROM 테이블_1
JOIN 테이블_2
ON 조건;
다음 예제는 두 개의 테이블에서 department(학과)가 동일한 레코드끼리 묶어서 보여주는 예제입니다.
컴퓨터 공학의 Alice와 동일한 학과를 가진 Hillah, Schet, Lachet이 묶여져서 나왔으므로, 같은 레코드들이 중복되어 나타나게 된 것 입니다.
SELECT * FROM professor_info.professors
JOIN student_info.students
ON professors.department = students.department;
이 구문은 MySQL에서 더 간단한 구문으로 줄여쓰도록 지원하고 있습니다. SELECT 구문만을 이용해서 완전히 같은 결과를 나타낼 수도 있습니다. 아래 코드는 위에서 사용한 JOIN 구문과 완전히 동일한 동작을 합니다.
SELECT * FROM professor_info.professors, student_info.students
WHERE professors.department = students.department;
INNER JOIN은 결합 대상 테이블에서 공통 컬럼을 기반으로 결과를 표시했습니다. 반면 OUTER JOIN
은 결합 대상 테이블에서 특정 테이블의 데이터를 모두 필요로 하는 경우에 사용하는 구문입니다.
OUTER JOIN
은 또 다시 LEFT/RIGHT OUTER JOIN
으로 나뉘어 집니다.
LEFT OUTER JOIN
는 테이블1(FROM 구문 바로 뒤에 오는 테이블)을 기준으로 두 번째 테이블을 결합합니다. 즉, 첫 번째 테이블의 모든 데이터와 두 번째 테이블의 일부 데이터를 이용하는 결합입니다. 두 번째 테이블에서 결합해올 값이 없는 경우에 LEFT OUTER JOIN을 사용하게 됩니다.
RIGHT OUTER JOIN
은 LEFT OUTER와 반대로 동작합니다. 두 번째 테이블을 기준으로 첫 번째 테이블의 내용을 결합합니다.
SELECT 컬럼 FROM 테이블_1
LEFT OUTER JOIN 테이블_2 (또는) RIGHT OUTER JOIN 테이블_2
ON 조건;
CROSS JOIN
은 두 테이블을 모두 연결합니다. 특징으로는 ON 구문이 오지 않는다는 점이 있습니다. 예제 사진을 보시면 첫 번째 테이블을 기준으로 두 번째 테이블의 내용들이 모두 연결되었음을 알 수 있습니다.
SELECT 컬럼 FROM 1번_테이블
CROSS JOIN 2번_테이블;
SELF JOIN
은 하나의 테이블에서 같은 데이터가 다른 의미로 존재할 때 이용합니다. 다시말해 스스로 결합을 한다는 것은 하나의 테이블 내에서 JOIN을 통해 또 다른 자료를 얻기 위해 사용합니다.
SELF JOIN
을 사용하기 위해서는 하나의 테이블에 대해 두 개의 다른 별칭을 붙여서 마치 다른 테이블인 것 처럼 이용합니다.
SELECT 컬럼 FROM 테이블명 AS 별칭1
JOIN 테이블명 AS 별칭2
ON 조건;