안녕하세요. SQL 기본 시리즈 중 1편입니다. 이번 시간에는 from 절과 카티션 곱에 대해 알아보도록 하겠습니다.
- from 절과 카티션 곱에 대해 알아봅시다. [현재글]
- order by 절에 대해 알아봅시다. 링크
- group by 절에 대해 알아봅시다. 링크
- having에 대해 알아보고 where 절과의 차이점을 알아봅시다. 링크
- select 절과 as에 대해 알아봅시다. 링크
먼저 엔티티를 보겠습니다. user와 book 테이블 2개가 있습니다. author_id가 user의 id를 참조하는 형태입니다.
user 테이블에 있는 데이터입니다. cho, ga 이렇게 2명의 유저가 있습니다.
다음에, book에 있는 책 데이터들입니다. 이름이 com인 것과, math인 것은 id가 1인 cho가 썼습니다. 그리고, pu라는 이름을 가진 책은 id가 2인 ga가 썼습니다.
SQL from 절
from 절은 어느 테이블에서 데이터를 가지고 올지를 알려줍니다. 예를 들어 from user는 user 테이블에서 데이터를 가져옵니다. from book은 book이라는 이름을 가진 테이블에서 가져옵니다. 자, 그런데, 여러 테이블로부터 정보를 가져오고 싶은 경우도 있을 겁니다. 이 때에는 from 절 뒤에 테이블 이름들을 ,로 구분하면 됩니다.
예를 들어, user와 book 테이블로부터 데이터를 가지고 오고 싶으면 from 절에 user, book을 입력해 주면 됩니다.
user와 book으로부터 데이터를 가져오기 위해, from 절에 public.user, public.book을 작성하였습니다. 그랬더니, 6개의 결과가 나오게 되었습니다. 카티션곱이 된 것인데요. 카티션곱의 정의는 아래와 같습니다.
- 두 집합 A, B가 있을 때
- 집합 A에 속하는 a
- 집합 B에 속하는 b가 있을 때
- 모든 순서쌍 (a, b)의 집합을 의미합니다.
집합 3개에서의 카티션 곱은 다음과 같이 정의되겠지요?
- 세 집합 A, B, C가 있을 때
- 집합 A에 속하는 a
- 집합 B에 속하는 b
- 집합 C에 속하는 c가 있을 때
- 모든 순서쌍 (a, b, c)의 집합을 의미합니다.
SQL 카티션곱
user에 속한 원소는 노란색으로, book에 속한 원소는 군청색으로 표시했어요.
단순히 from user, book을 하는 경우, user와 book을 카티션 곱 한다고 했는데요. 먼저, (user에 속하는 1번 원소, book에 속하는 원소들) 로만 쌍을 만들어 봅시다. 그러면, 위 그림과 같이 나옵니다.
그런데, user는 한 명만 있는 것이 아닙니다. “ga”라는 이름을 가진 유저 이름도 있지요. 따라서 (user에 속하는 2번 원소, book에 속하는 원소들) 로도 쌍을 만들 수 있습니다. 이렇게 만들어진 순서쌍의 개수는 총 6개입니다.
이는, user에 속한 원소의 개수에, book이 속한 원소의 개수를 곱한 것과 같습니다.
우리는, 유저와 해당 유저가 쓴 책에 대한 정보를 얻어오고 싶어요.
- user에는 유저 이름과 id에 대한 정보가 있습니다.
- book에는 책 이름과 유저 id에 대한 정보가 있습니다.
user나 book만 참조해서는 원하는 결과를 얻을 수 없겠지요? 그래서 from 절에 user와 book이 들어갑니다. 그런데, 전체 결과 중에서 어떤 것만 의미가 있나요?
- user의 id
- book의 author_id
이 두 값이 같은 것만 의미가 있겠지요? 따라서, 이 조건을 where 절에 걸어주면 됩니다.
해당 부분은 노란색과 군청색으로 표시한 부분입니다.
- cho라는 이름을 가진 사람은 com, math라는 이름을 가진 책을 썼습니다.
- ga라는 이름을 가진 사람은 pu라는 이름을 가진 책을 썼습니다.
고로, 쿼리는 아래와 같이 작성할 수 있습니다.
user와 book에서 데이터를 가져오는데, 유저의 id와 책의 author_id가 같은 결과만 취한다는 의미입니다. 유저의 id와 author_id가 다른 데이터는 의미가 없기 때문에, 필터링 조건에서 거르면 됩니다.