为什么SELECT * FROM pokemon,football_team的行为会导致每个排列?
pokemon_name|team_name
______________________
Pikachu | Denver Broncos
Pikachu | Cincinnati Bengals
Pikachu | Dallas Cowboys
Bulbasaur | Denver Broncos
Bulbasaur | Cincinnati Bengals
Bulbasaur | Dallas Cowboys
Squirtle | Denver Broncos
Squirtle | Cincinnati Bengals
Squirtle | Dallas Cowboys我认为默认行为应该是这样的:
pokemon_name|team_name
______________________
Pikachu | NULL
Bulbasaur | NULL
Squirtle | NULL
NULL | Denver Broncos
NULL | Cincinnati Bengals
NULL | Dallas Cowboys发布于 2015-10-15 04:49:46
默认情况下,您的查询在两个表之间应用普通(内部)连接(在您的查询中,第一个表的每一行都与第二个表的每一行连接在一起。
对于预期的输出,您需要使用完整的外连接,如下所示
--
select * from pokemon full outer join football_team /* add your joining condtion here using ON clause */;注意: MySQL中未实现 FULL OUTER JOIN子句
对于MySQL,同样的行为可以使用LEFT,RIGHT OUTER JOIN和UNION ALL来实现(例如。如下所示)
SELECT TableA.*, TableB.*
FROM
TableA LEFT OUTER JOIN TableB
ON TableA.id= TableB.id
UNION ALL
SELECT TableA.*, TableB.*
FROM
TableA RIGHT OUTER JOIN TableB
ON TableA.id= TableB.id发布于 2015-10-15 05:03:06
那将是..。
SELECT pokemon_name
, NULL team_name
FROM pokemon
UNION
ALL
SELECT NULL
, team_name
FROM football_team |
发布于 2015-10-15 06:05:07
人们误解了我的问题-他们认为我试图生成一个完整的外部连接。这正是我在将joins引入等式之前所期望的MySQL的默认行为。令我惊讶的是,默认行为是笛卡尔乘积。我想知道为什么返回笛卡尔产品是有用的。
@xQbert帮助我回答了我的问题:当从许多没有连接的表中进行选择时,工程师为什么要开发一个RDBMS来默认返回笛卡尔产品?
现在我更清楚了-这允许“join”和"ons“充当过滤器来过滤SELECT语句的结果。
https://stackoverflow.com/questions/33135243
复制相似问题