之间有什么区别
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(命令行)中输入时,我得到了不同的结果。
答案 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”)。