테이블 결합
실제 서비스에서 DB는 데이터를 정규화하여 여러 개의 테이블로 나누어 저장합니다.
웹서비스에서 필요로 하는 다양하고 복잡한 데이터를 보여주기 위해서는 복수의 테이블을 결합한 데이터 검색이 필요합니다.
곱집합
집합의 연산방법 중 하나로, 두 개의 집합을 곱하는 연산입니다.
곱집합은 교차결합(Cross Join)을 사용하여 곱집합을 계산할 수 있습니다.
교차집합(Cross Join)
SELECT 문의 FROM절에 복수의 테이블을 콤마로 구분지어 지정하면 테이블간 교차결합된 결과를 얻을 수 있습니다
`mysql > SELECT posts.id, posts.title, posts.user_id, posts.content, users.id, users.name FROM posts, users;`
교차결합은 필요한 경우가 거의 없고 비용이 매우 많이 드는 연산이기 때문에 실무에서는 거의 사용하지 않습니다. 그러나 교차결합은 내부 결합(Inner Join)과 외부 결합(Outer Join)의 근간이 됩니다.
내부 결합(Inner Join)
기준이 되는 테이블(left table)과 join이 걸리는 테이블(right table) 양쪽 모두에 결합조건이 매칭되는 row(데이터)만 검색하는 방법
user_id를 결합조건으로 사용하여 목표한 테이블을 얻어낼 수 있습니다mysql> SELECT
posts.id,
posts.title,
posts.content,
users.id,
users.name
FROM posts, users
WHERE posts.user_id=users_id;// SELECT STATEMENT
mysql> SELECT *
FROM table_1
INNER JOIN table_2 ON 결합조건
WHERE where_conditionmysql> SELECT
posts.id,
posts.title,
posts.user_id,
posts.content,
users.id,
users.name
FROM posts
INNER JOIN users ON posts.user_id=user.id// SELECT STATEMENT
SELECT
[FROM table_references]
[WHERE where_condition]
[GROUP BY {col_name | expr | postion}, ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset, ] row_count | row_count OFFSET offset}]
// JOIN Clause
table_references:
escaped_table_references [, escaped_table_reference] ...
escaped_table_reference: {
table_reference
| { OJ table_reference }
}
table_reference: {
table_factor
| joined_table
}
joined_table: {
table_reference {[INNER | CROSS] JOIN table_reference join_specification
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
| table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}
join_specification: {
ON search_condition
| USING (join_column_list)
}d. 외부 결합(Outer Join)
여러 개의 테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽의 테이블을 기준으로 모두 출력하는 결합 방법입니다.
LEFT / RIGHT / FULL OUTER JOIN 이 있습니다.