Join
為什麼 FROM 多個表預設為笛卡爾積?
當我進行如下查詢時,做笛卡爾積(交叉連接)背後的想法是什麼 -
SELECT * FROM agents, orders
我認為它們會連接(如pandas)。添加表格而不是相乘感覺更自然。
只是好奇,並沒有在網際網路上找到預設笛卡爾積背後的理由。我假設
FROM table1, table2
根據 SQL 的語法對於交叉連接可能會更正確,但為什麼呢?
逗號樣式連接 (SQL-89) 與使用
JOIN
關鍵字 (SQL-92) 的語法不是重點。您應該使用更現代的語法,但它沒有解決如果您不指定條件,為什麼預設會是笛卡爾積的問題。答案是它使關係代數起作用。
笛卡爾積是兩組元素的所有組合的集合。第一組的每個元素都與第二組的每個元素配對。
關係是笛卡爾積的子集。這是一個笛卡爾積,加上一個測試任何給定元素對是否屬於該關係的條件。
但是預設條件是一個固定
true
值,所以每個配對都通過了測試。所以預設關係最終是笛卡爾積。我想另一種選擇是將預設條件設為固定
false
值,因此預設關係將是空關係。這會使某些場景變得更容易,例如,如果您執行 a
DELETE
但不小心忘記了該WHERE
子句,它將避免您刪除整個表。
WHERE
但是隨後我們會收到來自不同人的關於 Stack Overflow 的問題,他們問為什麼預設連接是一個空集,因為當他們忘記查詢子句SELECT
並且他們的數據庫似乎是空的時,這會讓他們心跳加速。