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
onon 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之间的关系,则得到笛卡尔连接。那么它对此行执行笛卡尔乘积?那么它对此行执行笛卡尔乘积?