Mysql使用JOIN和WHERE语句。这有什么区别?

时间:2009-10-22 15:37:13

标签: sql mysql join

之间有什么区别
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;

我认为JOIN是一个内部联接,只有在左侧AccountId为==时才匹配到正确的AccountId。以上不完全一样吗?在MySQL(命令行)中输入时,我得到了不同的结果。

6 个答案:

答案 0 :(得分: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;

那些是等价的

答案 1 :(得分: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条件。

答案 2 :(得分:1)

在第一个示例中,连接中没有条件,因此A中的所有行都将与D中形成“A x D”行的所有行相关联 - 即所谓的“Cartesian join”。

在第二个示例中,仅列出A和D中具有相同AccountId的行。

答案 3 :(得分:1)

我不确定MySql如何处理不合格的连接,但我加入猜测它只是做了一个外连接,为第一个提供了大量的结果。第二个合格的加入并给了你想要的东西。

在SQL Server中,您将使用“on”限定符...

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

这限制了连接并提供了更好的查询。 MySql应该有类似的东西。

答案 4 :(得分:0)

免责声明:没有方便的MySQL,所以我只是按照我的记忆去做。

由于您没有在第一种情况下指定连接条件,我相信您的第一行等同于

SELECT a.AccountID FROM Accounts a, Domain d;

将返回a * d行作为笛卡尔积。

您的第二行指定表帐户中的行应与域中的相应行匹配,以便该查询将返回更少的行。

答案 5 :(得分:0)

“我认为JOIN是一个内部联接,只有在左侧AccountId = =到正确的AccountId时才会匹配。上述内容是否完全相同?”

名为“NATURAL JOIN”的代数运算符就是这样的。

不幸的是,SQL与关系代数不同。

不幸的是,在任何SQL系统愿意接受自然连接确实是你需要的可怕想法之前,你需要做额外的写作(“ON A.Column = B.column”)。