CROSS JOIN
この記事で説明したように、CROSS JOINはデカルト積を生成するためのものです。
デカルト積は、2つのセットAとBを取り、2つの与えられたデータセットからペアレコードの可能なすべての順列を生成します。
たとえば、次のデータベーステーブルがあるranks
としsuits
ます。
そして、ranks
次の行があります:
| name | symbol | rank_value |
|-------|--------|------------|
| Ace | A | 14 |
| King | K | 13 |
| Queen | Q | 12 |
| Jack | J | 11 |
| Ten | 10 | 10 |
| Nine | 9 | 9 |
一方でsuits
テーブルには、次のレコードが含まれています。
| name | symbol |
|---------|--------|
| Club | ♣ |
| Diamond | ♦ |
| Heart | ♥ |
| Spade | ♠ |
次のようなCROSS JOINクエリとして:
SELECT
r.symbol AS card_rank,
s.symbol AS card_suit
FROM
ranks r
CROSS JOIN
suits s
ranks
とsuites
ペアのすべての可能な順列を生成します:
| card_rank | card_suit |
|-----------|-----------|
| A | ♣ |
| A | ♦ |
| A | ♥ |
| A | ♠ |
| K | ♣ |
| K | ♦ |
| K | ♥ |
| K | ♠ |
| Q | ♣ |
| Q | ♦ |
| Q | ♥ |
| Q | ♠ |
| J | ♣ |
| J | ♦ |
| J | ♥ |
| J | ♠ |
| 10 | ♣ |
| 10 | ♦ |
| 10 | ♥ |
| 10 | ♠ |
| 9 | ♣ |
| 9 | ♦ |
| 9 | ♥ |
| 9 | ♠ |
内部結合
一方、INNER JOINは、2つの結合データセットのデカルト積を返しません。
代わりに、INNER JOINは左側のテーブルからすべての要素を取得し、右側のテーブルのレコードと照合して、次のようにします。
- 右側のテーブルで一致するレコードがない場合、左側の行は結果セットから除外されます
- 右側のテーブルの一致するレコードの場合、左側の行は、そのレコードと右側のテーブルの関連するすべての子レコードの間にデカルト積があったかのように繰り返されます。
たとえば、次のような親テーブルと子テーブルの間に1対多のテーブル関係があると仮定します。post
post_comment
ここで、post
テーブルに次のレコードがあるとします。
| id | title |
|----|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
そしてpost_comments
表には、これらの行があります。
| id | review | post_id |
|----|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
次のようなINNER JOINクエリ:
SELECT
p.id AS post_id,
p.title AS post_title,
pc.review AS review
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id
post
関連するすべてのレコードとともにすべてのレコードを含めますpost_comments
。
| post_id | post_title | review |
|---------|------------|-----------|
| 1 | Java | Good |
| 1 | Java | Excellent |
| 2 | Hibernate | Awesome |
基本的に、INNER JOINは、一致するレコードのみが最終結果セットに保持されるフィルター済みCROSS JOINと考えることができます。
INNER JOINの仕組みの詳細については、こちらの記事もご覧ください。
CROSS JOIN
テーブルのすべての可能な組み合わせになります。たとえば、100行のTable1と100行のTable2は、10000レコードになります。