티스토리 뷰
테이블에서 정보를 바꿀 때, 학생의 이메일 주소가 바뀌었을 수 있다.
그런데 그런 이메일 주소가 들어 있는 테이블이 엄청 많다면? 그러면 그 학생에 대한 정보가 있는 모든 행을 찾아야 하고 똑같이 이메일을 변경해야 한다.
따라서 특정한 데이터 열은 한 개의 장소에만 저장하여 업데이트할 부분을 줄이고, 데이터의 다른 장소에 저장되는 것을 방지하는 게 일반적이다.
이렇게 하려면 테이블 사이에서 데이터를 관계해줘야 한다.
학생을 구분하기 위해서는 하나의 이름에만 의존할 수 없다.
테이블에서 고유한 어떤 걸 구분하기 위해서는 절대로 이름 같은 걸 사용하지 않는다.
가장 좋은 방법은 고유의 번호를 부여하는 것. 즉, 식별자를 넣는 것이다.
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. 이런 식이다.