2013-09-25 79 views
-2
Table a Table b result 
id name id name id name 
1 a1  1 b1  1 b1 
2 a2  2 b2  2 b2 
3 a3    1 b1 
4 a4    2 b2 
        1 b1 
        2 b2 
        1 b1 
        2 b2 

我有两个表A和B,当我进行这样的查询为什么在mysql中产生笛卡尔积?

的选择B,* FROM一个为A,B为B

,它具有笛卡儿的产品,但我不明白,从这个表语句select数据仅b偏偏

A作为

改变最终的结果?IMO表无关,结果,这是meanningless

+4

因为您正在从两个表中进行选择。你会期望什么结果? –

+1

因为您正在创建两个表之间的连接。表B中的行对于表A中的每个有效行都是重复的,在您的情况下,这些行是来自表A的所有行,因为您没有指定条件。阅读连接文档 – AdrianBR

回答

2

如果不指定从表a任何列,这是预期的行为...

SELECT a.*, b.* FROM a As a,b AS b 

或者简单:

SELECT * FROM a,b 

是你可能想要的东西,如果你寻求一个笛卡尔乘积。

编辑 It defaults to select all columns from table a if I don't write a.*?It is by default?

号您使用SELECT b.* FROM,这意味着:给我从表b未来所有列。 SELECT a.*, b.*表示给我所有来自表ab的列。 SELECT * FROM表示给我所有列,不管它们来自哪里...

+0

它默认选择表a中的所有列,如果我不写a。*?它是默认的? – user2556058

+0

如果我没有从表a中指定任何列,如SELECT b。* FROM AS a,b AS b,它会导致表b中的值根据表a复制,但所有数据都来自表b,I想知道为什么table a导致重复的数据时,没有数据来自? – user2556058

2

因为您没有指定链接两个表的列。你期望得到什么?如果你不想有一个笛卡儿的结果建立类似的查询,

SELECT b.* 
FROM a As a, b AS b 
WHERE a.columnname = b.columnName 
2

使用别名不起作用。也就是说,这两个查询是相同的:

SELECT b.* FROM a AS a, b AS b 
SELECT b.* FROM a, b 

现在是出的方式,查询被表现为预期:B的行是针对的每一行输出一次 - 即你已经编写了一个笛卡尔积。

没有什么关于您的查询的神秘。

2

select子句不过滤行。这仅仅是一个值的projection。这些行在where子句中进行了过滤,或者在join子句的on部分进行了过滤。

你刚才说的是:

  1. 获取表中的每一行和表B中的每一行(from条款,产生笛卡尔集)根据谓词
  2. (不存在的)过滤那些行(whereon子句)
  3. 在这些结果行之外,只显示来自b表的字段。 (select子句)