交叉连接
AThe CROSS JOIN 用于生成笛卡尔积。
笛卡尔积采用两组 A 和 B,并从两组给定数据生成对记录的所有可能排列。
例如,假设您有以下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 不返回两个连接数据集的笛卡尔积。
相反,INNER JOIN 从左侧表中获取所有元素并将它们与右侧表中的记录进行匹配,以便:
- 如果右侧表没有匹配到记录,则从结果集中过滤掉左侧行
- 对于右侧表中的任何匹配记录,左侧行会重复,就好像该记录与右侧表上所有关联的子记录之间存在笛卡尔积一样。
例如,假设父表 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,其中仅将匹配的记录保留在最终结果集中。