[포스코 x 코딩온] 스마트팩토리 개발자 과정 11주차 회고 | JOIN

배돌·2023년 3월 17일

데이터베이스를 관리하려면 필연적으로 두개 이상의 테이블을 함께 사용해야 될 때가 있다. MySQL에서는 일반적으로 JOIN 키워드와 서브쿼리 방식을 이용해 문제를 해결한다. 그 중 JOIN에 대해 내가 배운 내용을 적어본다.

1. 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 |
+----+-------+------+----+-------+

2. Cartesian Product

Cartesian Product(카르테시안 프로덕트, 카테시안 곱)는 두 테이블의 모든 행을 서로 결합하여 생성된 결과 테이블이다. 하나의 테이블에서 가져온 각 행이 다른 테이블의 모든 행과 결합되서 곱하기의 형태로 나타나기 때문에 '곱집합' 으로도 불린다.

첫 번째 테이블이 m개의 행을, 두 번째 테이블이 n개의 행을 가진다면, 결과 테이블은 m * n개의 행을 갖게 된다. 따라서 students와 grades 모두 각각 3개의 행을 지니고 있으므로 3 * 3 = 9개 의 행을 가진 테이블을 만들게 된 것이다.

만약 4개의 행을 가진 'gender' 테이블을 JOIN 한다면? 3 * 3 * 4 = 36개의 행을 가진 테이블을 출력하게 된다.

3. ON students.id = grades.id

'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 |
+----+-------+------+----+-------+

두 테이블을 합쳐서 '특정 학생의 정보를 확인하는 테이블'을 만들어 냈다.

profile
스마트팩토리 지향 누-비

0개의 댓글