데이터베이스를 관리하려면 필연적으로 두개 이상의 테이블을 함께 사용해야 될 때가 있다. MySQL에서는 일반적으로 JOIN 키워드와 서브쿼리 방식을 이용해 문제를 해결한다. 그 중 JOIN에 대해 내가 배운 내용을 적어본다.
JOIN(조인)은 여러 개의 테이블을 결합하여 데이터를 가져오는 방식이다. 두 개 이상의 테이블에서 데이터를 가져와 하나의 집합으로 만들어 표현한다. 테이블을 결합하여 새로운 의미를 가지는 테이블을 만들어 낼 수 있다.
students
+------+-------+-----+
| id | name | age | create TABLE students (
+------+-------+-----+ id INT PRIMARY KEY,
| 1 | John | 20 | name VARCHAR(10),
| 2 | Jane | 21 | age INT,
| 3 | Peter | 22 | );
+------+-------+-----+
grades
+------+-------+ create TABLE grades (
| id | grade | id INT PRIMARY KEY,
+------+-------+ grade INT
| 1 | 90 | );
| 2 | 85 |
| 3 | 95 |
+------+-------+
여기 아무개학교의 학생들의 인적사항(students)과 성적(grades)이 담긴 테이블이 있다고 가정하자. JOIN 키워드를 사용하여 두 테이블을 합치는 것을 다음과 같이 나타낼 수 있다.
SELECT * FROM students JOIN grades
위의 명령어를 입력하면 다음과 같은 결과가 나오게 된다
+----+-------+------+----+-------+
| id | name | age | id | grade |
+----+-------+------+----+-------+
| 3 | Peter | 22 | 1 | 90 |
| 2 | Jane | 21 | 1 | 90 |
| 1 | John | 20 | 1 | 90 |
| 3 | Peter | 22 | 2 | 85 |
| 2 | Jane | 21 | 2 | 85 |
| 1 | John | 20 | 2 | 85 |
| 3 | Peter | 22 | 3 | 95 |
| 2 | Jane | 21 | 3 | 95 |
| 1 | John | 20 | 3 | 95 |
+----+-------+------+----+-------+
Cartesian Product(카르테시안 프로덕트, 카테시안 곱)는 두 테이블의 모든 행을 서로 결합하여 생성된 결과 테이블이다. 하나의 테이블에서 가져온 각 행이 다른 테이블의 모든 행과 결합되서 곱하기의 형태로 나타나기 때문에 '곱집합' 으로도 불린다.
첫 번째 테이블이 m개의 행을, 두 번째 테이블이 n개의 행을 가진다면, 결과 테이블은 m * n개의 행을 갖게 된다. 따라서 students와 grades 모두 각각 3개의 행을 지니고 있으므로 3 * 3 = 9개 의 행을 가진 테이블을 만들게 된 것이다.

만약 4개의 행을 가진 'gender' 테이블을 JOIN 한다면? 3 * 3 * 4 = 36개의 행을 가진 테이블을 출력하게 된다.
'SELECT * FROM students JOIN grades' 로 만들어진 테이블은 카테시안 곱으로써 데이터를 뭉탱이로 나열해 놓았을 뿐, 테이블로써 자체의 유의미한 속성을 갖고 있지 않다.
ON 절을 사용해 쿼리문에 조건을 걸어 특정 행간만 출력하게 만들어 보자.
SELECT * FROM students JOIN grades
ON students.id = grades.id;
위의 코드에서 ON절을 이용해 students 테이블의 id와 grades 테이블의 id가 같은 항목 '만' 뽑아내게 되고
+----+-------+------+----+-------+
| id | name | age | id | grade |
+----+-------+------+----+-------+
| 1 | John | 20 | 1 | 90 |
| 2 | Jane | 21 | 2 | 85 |
| 3 | Peter | 22 | 3 | 95 |
+----+-------+------+----+-------+
두 테이블을 합쳐서 '특정 학생의 정보를 확인하는 테이블'을 만들어 냈다.