当前位置: 首页 > 面试题库 >

在SQL / MySQL中,join语句中的“ ON”和“ WHERE”有什么区别?

盛柏
2023-03-14
问题内容

以下语句给出相同的结果(一个使用on,另一个使用where):

mysql> select * from gifts INNER JOIN sentGifts ON gifts.giftID = sentGifts.giftID;
mysql> select * from gifts INNER JOIN sentGifts WHERE gifts.giftID = sentGifts.giftID;

我只能看到在左外部联接的情况下找到“无与伦比”的情况:(
以找出从未有人发送过的礼物)

mysql> select name from gifts LEFT OUTER JOIN sentgifts 
           ON gifts.giftID = sentgifts.giftID 
           WHERE sentgifts.giftID IS NULL;

在这种情况下,它首先使用on,然后使用where。是否on先做匹配,然后where做“辅助”过滤?还是有使用onvs
的更一般规则where?谢谢。


问题答案:

WHERESELECT整个查询ON的一部分,是每个单独联接的一部分。

ON 只能引用以前使用的表的字段。

如果与左表中的记录没有实际匹配,则从右表中LEFT JOIN返回一条记录,并将所有字段设置为NULLSWHERE子句然后对此进行评估和过滤。

在您的查询中,仅gifts返回“ sentgifts”中不匹配的记录。

这是例子

gifts

1   Teddy bear
2   Flowers

sentgifts

1   Alice
1   Bob

---
SELECT  *
FROM    gifts g
LEFT JOIN
        sentgifts sg
ON      g.giftID = sg.giftID

---

1  Teddy bear   1     Alice
1  Teddy bear   1     Bob
2  Flowers      NULL  NULL    -- no match in sentgifts

---
SELECT  *
FROM    gifts g
LEFT JOIN
        sentgifts sg
ON      g.giftID = sg.giftID
WHERE   sg.giftID IS NULL

---

2  Flowers      NULL  NULL    -- no match in sentgifts

如您所见,任何实际的匹配都不能在中留下NULLin sentgifts.id,因此仅返回从未发送过的礼物。



 类似资料:
  • 问题内容: Doctrine2中的JOIN ON和JOIN WITH有什么区别? 我在手册中找不到任何相关信息。 问题答案: 替换原始的加入条件, 并为其添加条件。 范例 : 案例一 DQL 将翻译成SQL 案例二 DQL 将翻译成SQL

  • 问题内容: 之间有什么区别? 和: 我可以互换使用吗? 问题答案: MySQL在和之间没有区别。他们是一样的。 在两个示例中,子句 将任何类型的联接转换为内部联接。表达此查询的标准方式是

  • 问题内容: 有什么区别,每个应该有什么区别? 如果我正确理解该理论,则查询优化器应该可以互换使用。 问题答案: 它们不是同一件事。 考虑以下查询: 和 第一个将返回订单及其订单号的行(如果有)。第二个将返回所有订单,但只有订单将具有与之关联的任何行。 使用,子句 实际上是 等效的。但是,仅仅因为它们在功能上相同而产生相同的结果,并不意味着这两种子句具有相同的语义。

  • 问题内容: 我正在尝试在子句中构建case / if语句。 问题在于该列包含文本和数字。我要与之比较的列是一个整数。 有没有一种方法可以检测列是否包含字符或数字,然后将其设置为0,然后将其设置为0? 这是一个伪查询可以帮助您: 问题答案: 您正在寻找IsNumeric,但它并不总是有效(+,-和。是数字),因此您需要使用GBN所描述的解决方案,即在您的varchar中添加.0e0

  • 问题内容: 是什么区别,并在声明中? 编辑:我已将史蒂文的答案标记为正确的答案,因为它包含链接上信息的关键部分: 不使用when时,其行为类似于子句 我所见过的情况并没有发生,而这正是我开始困惑的地方。当然,除非您知道这一点,否则无法在问题中指定它。 问题答案: HAVING为SELECT语句中使用的组或聚合函数指定搜索条件。

  • 问题内容: 为简单起见,假设所有相关字段均为。 你可以做: 要不然: 这两个工作方式是否相同? 问题答案: 是您应该使用的ANSI语法。 通常认为它更具可读性,尤其是当您连接许多表时。 只要有需要,也可以轻松地将其替换为。 该语法更关系模型为主。 两个表ed的结果是表的笛卡尔积,将对其应用过滤器,该过滤器仅选择连接列匹配的那些行。 使用语法更容易看到这一点。 以您的示例为例,在MySQL(通常在S