2009-10-22 44 views
0

是什麼bettweenMysql使用JOIN和WHERE語句。這是什麼區別?

SELECT a.AccountId FROM Accounts AS a JOIN domain as d; 

SELECT a.AccountId 
FROM Accounts AS a JOIN domain as d WHERE a.AccountId=d.AccountId; 

的區別我想聯接是內部聯接只有當左ACCOUNTID的==向右的AccountID匹配。上述不會完全一樣嗎?將它輸入MySQL(命令行)時,我得到了不同的結果。

+0

當你使用沒有'ON'子句的'JOIN'時,MySQL是少數幾個不會嘲笑你的數據庫之一。 – Powerlord 2010-07-09 15:35:14

回答

4

你先聲明不指定所有任何連接的標準,使之等同則需要將其更改爲:

SELECT a.AccountId FROM Accounts AS a 
JOIN domain as d on a.accountid = d.accountid; 

我想你問,但不知道是什麼區別歲之間的風格加入

SELECT a.AccountId FROM Accounts AS a, domain as d 
where a.accountid = d.accountid; 

而ANSI連接是

SELECT a.AccountId FROM Accounts AS a 
    JOIN domain as d on a.accountid = d.accountid; 

並且這些都是等價的

+0

@txyoji這個鏈接是爲了告訴我什麼? – Gratzy 2009-10-22 15:52:09

+0

哎呀,我知道我忘了一些東西。我打算在原始示例程序中使用a.accountid = d.accountid。 – 2009-10-22 16:17:13

1

在第一個示例中,在連接中沒有條件,因此A中的所有行將與D中形成'A x D'行的所有行相關聯,即所謂的'Cartesian join'。

在第二個例子中,只列出A和D中具有相同AccountId的行。

1

我不完全確定MySql如何處理未限定的連接,但我加入猜測它只是做了一個外部連接,給你第一個結果噸。第二個合格加入並給了你你想要的。

在SQL Server中,你可以使用一個「上」限定...

Select a.AccountID from Accounts a join Domain d on a.AccountID = d.AccountID 

這限制了參與併爲一個更好的查詢。 MySql應該有非常相似的東西。

2

沒有任何JOIN條件的第一個查詢將返回與CROSS JOIN相同的結果。這意味着它會將表Accounts的每一行與表Domain中的每一行加入。所以如果你在第一個表格中有4行,而在另一個表格中有8行,你將得到32個結果。如果您只想使用a.AccountId,它將會在domain表中重複多次。實際上我沒有看到第一個查詢的要點。您應該只是這樣做:

SELECT a.AccountId FROM Accounts 

第二個查詢的行爲就像第一與此不同,它僅返回符合條件a.AccountId=d.AccountId的行。但是,您應該將此查詢重寫爲:

SELECT a.AccountId 
FROM Accounts AS a 
JOIN domain as d 
ON a.AccountId=d.AccountId; 

ON之後指定JOIN條件。

+0

我完全忘了。我以爲我擁有它。難怪爲什麼我的結果很奇怪! – 2009-10-22 16:18:15

0

免責聲明:沒有MySQL的方便,所以我只是通過我所記得的。

既然你不指定在第一種情況下連接條件,我相信你的第一行是相當於

SELECT a.AccountID FROM Accounts a, Domain d; 

將返回a * d行笛卡兒產品。

您的第二行指定表Accounts中的行應匹配Domain中的對應行,以便查詢將返回更少的行。

0

「我認爲JOIN是一個內部連接,只有在左側AccountId爲==時才與正確的AccountId匹配,上述內容不會完全相同嗎?」

稱爲「NATURAL JOIN」的代數運算符表現如此。

不幸的是,SQL與關係代數不同。

不幸的是,在任何SQL系統願意接受自然連接確實是你需要的可怕想法之前,你需要做額外的寫作(「ON A.Column = B.column」)。

相關問題