2009-10-22 39 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”)。

相关问题