交叉加入
正如我在本文中所解释的,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,其中仅将匹配记录保留在最终结果集中。
有关INNER JOIN工作原理的更多详细信息,请查看 本文。
CROSS JOIN
将导致表格的所有可能组合。例如,具有100行的Table1和具有100行的Table2将产生10000条记录。