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

Mysql使用连接和WHERE语句。这有什么区别?,sql,mysql,join,Sql,Mysql,Join,我们之间有什么区别 SELECT a.AccountId FROM Accounts AS a JOIN domain as d; 及 我认为JOIN是一个内部连接,它只在左AccountId==到右AccountId时匹配。上述情况不是完全相同吗?在MySQL(命令行)中键入时,我得到了不同的结果。您的第一条语句根本没有指定任何连接条件,要使其等效,您需要将其更改为: SELECT a.AccountId FROM Accounts AS a JOIN domain as d on a.a

我们之间有什么区别

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


我认为JOIN是一个内部连接,它只在左AccountId==到右AccountId时匹配。上述情况不是完全相同吗?在MySQL(命令行)中键入时,我得到了不同的结果。

您的第一条语句根本没有指定任何连接条件,要使其等效,您需要将其更改为:

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;

这些是等效的

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


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

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

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

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

这限制了连接,使查询变得更好。MySql应该有非常类似的功能。

第一个没有任何连接条件的查询将返回与交叉连接相同的结果。这意味着它将把表
Accounts
中的每一行与表
Domain
中的每一行连接起来。所以,如果第一个表中有4行,另一个表中有8行,那么将有32个结果。如果您只想获取
a.AccountId
,它将被复制到
表中的行数的倍。事实上,我不明白第一个问题的意义。你应该这样做:

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;

在上指定连接条件之后。

免责声明:手头没有MySQL,所以我只是按照我记忆中的内容进行操作

因为在第一种情况下没有指定连接条件,所以我相信您的第一行相当于

SELECT a.AccountID FROM Accounts a, Domain d;
它将返回作为笛卡尔乘积的
a*d

第二行指定表Accounts中的行应与域中相应的行相匹配,这样查询将返回较少的行。

“我认为JOIN是一个内部联接,只有在左AccountId==右AccountId时才匹配。上面的情况不是完全相同吗?”

称为“自然联接”的代数运算符的行为方式是这样的

不幸的是,SQL与关系代数不是一回事


不幸的是,在任何SQL系统愿意接受自然连接确实是您所需要的这一可怕想法之前,您需要进行额外的编写(“ON A.Column=B.Column)。

oops,我知道我忘了一些东西。我打算在原始示例程序中使用a.accountid=d.accountid。我完全忘记了on。我以为我有。难怪我的结果很奇怪!当您使用
JOIN
而不使用
ON
子句时,MySQL是少数不会向您抱怨的数据库之一。
SELECT a.AccountID FROM Accounts a, Domain d;