2013-09-25 28 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子句)