Join

為什麼 FROM 多個表預設為笛卡爾積?

  • May 2, 2021

當我進行如下查詢時,做笛卡爾積(交叉連接)背後的想法是什麼 -

SELECT * FROM agents, orders

我認為它們會連接(如pandas)。添加表格而不是相乘感覺更自然。

只是好奇,並沒有在網際網路上找到預設笛卡爾積背後的理由。我假設FROM table1, table2根據 SQL 的語法對於交叉連接可能會更正確,但為什麼呢?

逗號樣式連接 (SQL-89) 與使用JOIN關鍵字 (SQL-92) 的語法不是重點。您應該使用更現代的語法,但它沒有解決如果您不指定條件,為什麼預設會是笛卡爾積的問題。

答案是它使關係代數起作用。

笛卡爾積是兩組元素的所有組合的集合。第一組的每個元素都與第二組的每個元素配對。

關係是笛卡爾積的子集。這是一個笛卡爾積,加上一個測試任何給定元素對是否屬於該關係的條件。

但是預設條件是一個固定true值,所以每個配對都通過了測試。所以預設關係最終是笛卡爾積。

我想另一種選擇是將預設條件設為固定false值,因此預設關係將是空關係。

這會使某些場景變得更容易,例如,如果您執行 aDELETE但不小心忘記了該WHERE子句,它將避免您刪除整個表。

WHERE但是隨後我們會收到來自不同人的關於 Stack Overflow 的問題,他們問為什麼預設連接是一個空集,因為當他們忘記查詢子句SELECT並且他們的數據庫似乎是空的時,這會讓他們心跳加速。

引用自:https://dba.stackexchange.com/questions/290833