Mysql 不确定此右外部联接的结果是什么

Mysql 不确定此右外部联接的结果是什么,mysql,sql,join,outer-join,Mysql,Sql,Join,Outer Join,右外连接类似于维恩图的一个联,对吗? 我的意思是对于A右外连接B我们应该得到B的所有行以及A中的任何匹配行 出于某种原因,我对以下内容感到困惑: 假设表订单: mysql> select * from orders; +------------+------------+---------+----------+---------+ | orderedon | name | partnum | quantity | remarks | +------------+

右外连接类似于维恩图的一个
,对吗?
我的意思是对于
A右外连接B
我们应该得到
B
的所有行以及
A
中的任何匹配行
出于某种原因,我对以下内容感到困惑:
假设表
订单

mysql> select * from orders;  
+------------+------------+---------+----------+---------+  
| orderedon  | name       | partnum | quantity | remarks |  
+------------+------------+---------+----------+---------+  
| 1996-05-19 | TRUE-WHEEL |      76 |        3 | PAID    |  
| 1996-09-02 | TRUE-WHEEL |      10 |        1 | PAID    |   
| 1996-06-30 | TRUE-WHEEL |      42 |        8 | PAID    |   
| 1996-06-30 | BIKE SPEC  |      54 |       10 | PAID    |  
| 1996-05-30 | BIKE SPEC  |      23 |        8 | PAID    |   
| 1996-01-17 | BIKE SPEC  |      76 |       11 | PAID    |  
| 1996-01-17 | LE SHOPPE  |      76 |        5 | PAID    |  
| 1996-06-01 | LE SHOPPE  |      10 |        3 | PAID    |  
| 1996-06-01 | AAA BIKE   |      10 |        1 | PAID    |   
| 1996-07-01 | AAA BIKE   |      76 |        4 | PAID    |  
| 1996-07-01 | AAA BIKE   |      46 |       14 | PAID    |   
| 1996-07-11 | JACKS BIKE |      76 |       14 | PAID    |  
| 1996-05-15 | TRUE-WHEEL |      23 |        6 | PAID    |  
| 1996-05-30 | BIKE SPEC  |      20 |        2 | PAID    |   
+------------+------------+---------+----------+---------+   
14 rows in set (0.00 sec)
和表
部分

mysql> select * from part;  
+---------+---------------+---------+  
| partnum | description   | price   |  
+---------+---------------+---------+  
|      54 | PEDALS        |   54.25 |  
|      42 | SEATS         |   24.50 |  
|      46 | TIRES         |   15.25 |  
|      23 | MOUNTAIN BIKE |  350.45 |  
|      76 | ROAD BIKE     |  530.00 |  
|      10 | TANDEM        | 1200.00 |  
+---------+---------------+---------+  
6 rows in set (0.00 sec)  
我期待以下查询:
选择p.partnum p_partnum、p.description p_desc、p.price p_price、o.name o_name、o.partnum o_partnum从p部分右侧外部联接订单o on o.partnum=54
将给我所有的
订单行
,以及只有
part
partnum=54的行

但我明白了:

mysql> select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name   o_name,o.partnum o_partnum from part p right outer join orders o on o.partnum=54;   
+-----------+---------------+---------+------------+-----------+  
| p_partnum | p_desc        | p_price | o_name     | o_partnum |  
+-----------+---------------+---------+------------+-----------+  
|      NULL | NULL          |    NULL | TRUE-WHEEL |        76 |  
|      NULL | NULL          |    NULL | TRUE-WHEEL |        10 |   
|      NULL | NULL          |    NULL | TRUE-WHEEL |        42 |   
|        54 | PEDALS        |   54.25 | BIKE SPEC  |        54 |   
|        42 | SEATS         |   24.50 | BIKE SPEC  |        54 |   
|        46 | TIRES         |   15.25 | BIKE SPEC  |        54 |   
|        23 | MOUNTAIN BIKE |  350.45 | BIKE SPEC  |        54 |    
|        76 | ROAD BIKE     |  530.00 | BIKE SPEC  |        54 |   
|        10 | TANDEM        | 1200.00 | BIKE SPEC  |        54 |   
|      NULL | NULL          |    NULL | BIKE SPEC  |        23 |    
|      NULL | NULL          |    NULL | BIKE SPEC  |        76 |    
|      NULL | NULL          |    NULL | LE SHOPPE  |        76 |    
|      NULL | NULL          |    NULL | LE SHOPPE  |        10 |    
|      NULL | NULL          |    NULL | AAA BIKE   |        10 |    
|      NULL | NULL          |    NULL | AAA BIKE   |        76 |    
|      NULL | NULL          |    NULL | AAA BIKE   |        46 |    
|      NULL | NULL          |    NULL | JACKS BIKE |        76 |   
|      NULL | NULL          |    NULL | TRUE-WHEEL |        23 |    
|      NULL | NULL          |    NULL | BIKE SPEC  |        20 |    
+-----------+---------------+---------+------------+-----------+   
19 rows in set (0.00 sec)   

为什么我要多排?为什么它会将
Order
partnum=54
的行组合到
part的所有行?

因为你有
orders
的右连接
和连接条件
partnum=54
partnum=54
时,你会从
orders
中得到所有与
parts
连接的行。您有一行
partnum=54
,该行与
parts
中的所有行(交叉连接)连接,因为您有
右连接
订单
的连接条件
partnum=54
partnum=54
时,您将获得
订单
中与
零件
连接的所有行。您有一行
partnum=54
,该行与
parts
中的所有行(交叉连接)连接在一起

FROM part p 
RIGHT OUTER JOIN orders o 
  ON o.partnum=54

…只有顺序上的条件,需要添加的条件是该部分也对应于该顺序,或者数据库将考虑任何部分匹配;

FROM part p 
RIGHT OUTER JOIN orders o 
  ON o.partnum=54
 AND o.partnum = p.partnum
当然,如果只想显示partnum=54的行,最好将
o.partnum=54
移动到
where
条件<代码>连接
条件通常用于连接表,
其中
通常用于过滤

…只有顺序上的条件,需要添加的条件是该部分也对应于该顺序,或者数据库将考虑任何部分匹配;

FROM part p 
RIGHT OUTER JOIN orders o 
  ON o.partnum=54
 AND o.partnum = p.partnum

当然,如果只想显示partnum=54的行,最好将
o.partnum=54
移动到
where
条件
JOIN
条件通常用于连接表,
WHERE
通常用于过滤。

您在
on条件下使用
o.partnum=54
,这就是为什么会得到额外的行 在你的结果中

您需要将条件
o.partnum=54
放在where子句上

这个怎么样

select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name o_name,o.partnum  o_partnum 
from part p right outer join orders o 
on o.partnum = p.partnum
where o.partnum=54;
编辑:您可以参考以下内容,了解当您
在on子句和Where上放置条件。

您正在使用
o.partnum=54
on
on condition
,这就是为什么您会得到额外的行 在你的结果中

您需要将条件
o.partnum=54
放在where子句上

这个怎么样

select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name o_name,o.partnum  o_partnum 
from part p right outer join orders o 
on o.partnum = p.partnum
where o.partnum=54;
编辑:您可以参考以下内容,了解当您 在子句和何处添加条件。

你的问题是

select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name   o_name,o.partnum o_partnum 
from part p right outer join orders o on o.partnum=54;  
您选择的是右连接,因此即使右侧的连接表中没有匹配项,它也会显示记录,并且在本例查询中就是这样

左侧连接也是一样,左侧表的所有记录都将显示,即使它们不匹配

提及

请详细解释

希望这有帮助

你的问题是

select p.partnum p_partnum,p.description p_desc,p.price p_price,o.name   o_name,o.partnum o_partnum 
from part p right outer join orders o on o.partnum=54;  
您选择的是右连接,因此即使右侧的连接表中没有匹配项,它也会显示记录,并且在本例查询中就是这样

左侧连接也是一样,左侧表的所有记录都将显示,即使它们不匹配

提及

请详细解释


希望这有帮助

所以当它有一行partnum 54的订单时,它会像笛卡尔乘积一样吗?是的,如果你没有任何连接条件来指定o和p之间的关系,你会得到笛卡尔连接。所以当它有一行partnum 54的订单时,它会像笛卡尔乘积一样吗?是的,如果没有任何连接条件指定o和p之间的关系,则得到笛卡尔连接。那么它对此行执行笛卡尔乘积?那么它对此行执行笛卡尔乘积?