티스토리 뷰

반응형

https://ko.khanacademy.org/computing/computer-programming/sql/relational-queries-in-sql/a/splitting-data-into-related-tables

 

테이블에서 정보를 바꿀 때, 학생의 이메일 주소가 바뀌었을 수 있다.

그런데 그런 이메일 주소가 들어 있는 테이블이 엄청 많다면? 그러면 그 학생에 대한 정보가 있는 모든 행을 찾아야 하고 똑같이 이메일을 변경해야 한다.

 

따라서 특정한 데이터 열은 한 개의 장소에만 저장하여 업데이트할 부분을 줄이고, 데이터의 다른 장소에 저장되는 것을 방지하는 게 일반적이다.

이렇게 하려면 테이블 사이에서 데이터를 관계해줘야 한다.

 

학생을 구분하기 위해서는 하나의 이름에만 의존할 수 없다.

테이블에서 고유한 어떤 걸 구분하기 위해서는 절대로 이름 같은 걸 사용하지 않는다.

 

가장 좋은 방법은 고유의 번호를 부여하는 것. 즉, 식별자를 넣는 것이다.

student_id	test	grade
1	Nutrition	95
2	Nutrition	92
1	Chemistry	85
2	Chemistry	95

 

하나의 테이블 안에서, 테이블을 여러 개의 관계되는 테이블로 나누었다.

이럴 때의 강점은 속성이 문자일 떄 강하게 드러난다.

student_id	book_title	book_author
1	The Tale of Mrs. Tiggy-Winkle	Beatrix Potter
1	Jabberwocky	Lewis Carroll
2	The Hunting of the Snark	Lewis Carroll
2	Jabberwocky	Lewis Carroll

위와 같은 것에서, book_title이 중복되지 않게 찾아본다고 하자.

id	book_title	book_author
1	The Tale of Mrs. Tiggy-Winkle	Beatrix Potter
2	Jabberwocky	Lewis Carroll
3	The Hunting of the Snark	Lewis Carroll

그러면 이렇게 테이블을 바꿀 수 있기 때문에, 테이블을 나누는 건 중요하다.

 

그러면 이제 student id와 연계시키면?

student_id	book_id
1		1
1		2
2		3
2		2

 

이렇게 되면 테이블을 유지하기 쉽고 버그가 적은 방법이 된다.

 

정보를 여러 개의 관계형 테이블로 나누면, 불필요한 데이터를 최소화하고 업데이트할 부분을 최소화 할 수 있는 것이다.

 

JOIN

가장 간단한 것은 CROSS JOIN

그냥 FROM 옆 테이블 두 개를 넣으면 된다.

 

첫번째 테이블의 각 행들에 대해서 두번째 테이블에 대한 행을 만든다.

 

id	first_name	last_name	email	phone	birthdate
1	Peter	Rabbit	peter@rabbit.com	555-6666	2002-06-24
2	Alice	Wonderland	alice@wonderland.com	555-4444	2002-07-04

 

peter 라는 id에 대해서, 두번째 테이블의 id 1,2,3,4를 반복해서 넣어준다. 즉, 합집합이다.

1	Peter	Rabbit	peter@rabbit.com	555-6666	2002-06-24	1	1	Nutrition	95
1	Peter	Rabbit	peter@rabbit.com	555-6666	2002-06-24	2	2	Nutrition	92
1	Peter	Rabbit	peter@rabbit.com	555-6666	2002-06-24	3	1	Chemistry	85
1	Peter	Rabbit	peter@rabbit.com	555-6666	2002-06-24	4	2	Chemistry	95

 

크로스 조인은 가장 간단하지만 가장 적게 사용된다.

모든 행이 다른 행들과 연동되는 건 원치 않기 때문이다.

 

INNER JOIN

 

속성은 .으로 표시해줄 수 있다.

그걸 이용해서, CROSS JOIN에서 WHERE을 사용하여 교집합을 해줄 수 있다.

SELECT * FROM table1,table2 WHERE table1.student_id = table2.id

 

이는 사실상 테이블 자체가 table2의 id와 table1의 student_id와 동일할 때 가능한 것이다.

암시적 이너 조인이라 불린다.

 

가능은 하지만, 명시적 이너 조인을 사용하는 게 좋다.

SELECT * FROM student
    JOIN student_grades
    ON students.id = students_grade.students_id;

student와 student_grades를 join 하는데, ON을 WHERE 대신 사용한다.

 

가장 좋은 점은 WHERE를 ON 뒤에 또 사용할 수 있다는 것.

 

만약에 테이블들이 같은 이름이지만 다른 의미의 열을 가지고 있다면 어떻게 될까??

 

student_grades 테이블에 grade 열이 있는데 students 테이블에도 수업 전반적인 점수를 의미하는 grade 열이 있다.

 

그 말은 이너조인을 한 테이블에서, grade라 명시했을 때, 어느 테이블로부터 정보를 가져올지 알 수 없다.

양쪽에 있어서

 

따라서 안전하기 위이해서는 해당 열에 열이 속해있는 테이블의 이름을 접두사로 붙이는데, 예를 들면 students.grade. 이런 식이다.

 

 

반응형