[MySQL] 데이터 조작문 DML - JOIN

Bam·2022년 3월 5일
0

Database

목록 보기
9/19
post-thumbnail

JOIN

JOIN은 여러 테이블 내에서 조건에 맞는 레코드들을 모아 테이블의 형태처럼 만들어 보여주는 것입니다. 보통 JOIN 구문은 SELECT명령과 함께 조합되어서 이용됩니다. 또한 JOIN을 위해서 테이블에 외래키가 존재해야합니다.

실습을 위해서 다음과 같은 (교수-학생)테이블을 만들었습니다. 두 테이블의 Primary Key는 모두 id로 이 id 컬럼이 외래키가 됩니다.
JOIN 구문은 여러 종류가 있는데 4가지를 알아보겠습니다.

INNER JOIN

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;

OUTER JOIN

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

CROSS JOIN은 두 테이블을 모두 연결합니다. 특징으로는 ON 구문이 오지 않는다는 점이 있습니다. 예제 사진을 보시면 첫 번째 테이블을 기준으로 두 번째 테이블의 내용들이 모두 연결되었음을 알 수 있습니다.

SELECT 컬럼 FROM 1번_테이블
CROSS JOIN 2번_테이블;

SELF JOIN

SELF JOIN은 하나의 테이블에서 같은 데이터가 다른 의미로 존재할 때 이용합니다. 다시말해 스스로 결합을 한다는 것은 하나의 테이블 내에서 JOIN을 통해 또 다른 자료를 얻기 위해 사용합니다.

SELF JOIN을 사용하기 위해서는 하나의 테이블에 대해 두 개의 다른 별칭을 붙여서 마치 다른 테이블인 것 처럼 이용합니다.

SELECT 컬럼 FROM 테이블명 AS 별칭1
JOIN 테이블명 AS 별칭2
ON 조건;

0개의 댓글