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;