2015-06-20 41 views
3

我無法理解笛卡爾積如何工作。考慮簡單的模式:瞭解SQL中的笛卡爾積

mysql> select * from account; 
+----------------+-------------+---------+ 
| account_number | branch_name | balance | 
+----------------+-------------+---------+ 
| A101   | Downtown |  500 | 
| A102   | Perryridge |  400 | 
| A201   | Brighton |  900 | 
| A215   | Mianus  |  700 | 
| A217   | Brighton |  750 | 
| A222   | Redwood  |  700 | 
| A305   | Round Hill |  350 | 
+----------------+-------------+---------+ 
7 rows in set (0.00 sec) 

現在,當我提出查詢

select a.balance from account a, account b where a.balance<b.balance; 

我得到一系列的值除然後使用not in操作我確定最大值的最大值900。在此之前,在上述查詢中,當根據條件a.balance<b.balance進行連接時,關係中的第一個元組必須爲500。從理論上說,前5個值必須是:

500 
500 
500 
500 
400 

,但我得到:

+---------+ 
| balance | 
+---------+ 
|  400 | 
|  350 | 
|  350 | 
|  500 | 
|  400 | 

它是如何工作的?我正在使用MySQL數據庫。

+0

笛卡爾積是如此命名,以至於讓你誤以爲它是線性的而不是指數的。也就是說,這是一個很棒的流行詞,它會嚇跑初級程序員 – Drew

回答

3

笛卡爾連接將第一個表中的每條記錄與第二個表中的每條記錄相連,因此,由於您的表有7行,並且它與自身相連,所以如果您沒有where子句,它應該返回49條記錄。您的where子句只允許記錄a的餘額小於b的餘額。正如你所說,由於900是表格中的最大平衡,它永遠不會比任何其他平衡小,因此它永遠不會被退回。

對於前五行,SQL的正常規則也適用於連接。由於SQL表沒有固有順序,除非您明確聲明order by子句中的順序,否則完全由數據庫決定如何返回它們。列出的值是您希望查詢返回的完全有效值。

+0

因此不同的數據庫會返回不同的值順序?我怎麼知道數據庫用什麼順序來返回結果? –

+0

@JavaEnthusiast不僅僅是不同的數據庫,相同的數據庫實例可能很好地根據各種內部條件以不同的順序返回行。確定行將返回的順序的唯一方法是使用'order by'子句顯式設置它。 – Mureinik