MySQL,在特定语句中ON和WHERE之间的功能差异

时间:2019-05-11 14:59:49

标签: mysql sql

我正在研究MySQL连接函数的选择查询。

我对以下查询感到有些困惑。我理解下面的语句,使用ON子句将多个表的属性联接在一起,然后使用WHERE子句过滤结果集。

这是正确的吗?这还提供什么其他功能?有更好的选择吗?

表,属性和模式与该问题无关,特别是仅与ON和WHERE交互有关。预先感谢您提供的任何见解,表示赞赏。

SELECT DISTINCT Movies.title  
FROM Rentals  
    INNER JOIN Customers 
    INNER JOIN Copies 
    INNER JOIN Movies ON Rentals.customerNum=Customers.customerNum  
        AND Rentals.barcode=Copies.barcode  
        AND Copies.movieNum=Movies.movieNum  
WHERE Customers.givenName='Chad'  
AND Customers.familyName='Black';

2 个答案:

答案 0 :(得分:1)

INNER JOIN(和外部联接)是二进制运算符,后跟ON子句。您的特定语法在MySQL中有效,但在其他任何数据库中均无效(因为它缺少两个ON子句)。

我建议将查询编写为:

SELECT DISTINCT m.title  
FROM Movies m JOIN
     Copies co
     ON co.movieNum = m.movieNum JOIN
     Rentals r
     ON r.barcode = co.barcode JOIN
     Customers c
     ON c.customerNum = r.customerNum
WHERE c.givenName = 'Chad' AND
      c.familyName = 'Black';

您应始终将JOIN条件放在ON子句中,每ON插入一个JOIN。这也引入了表别名,使查询更易于编写和阅读。

WHERE子句具有其他过滤条件。这些也可以放在ON子句中,但是我认为查询在WHERE子句中的读取效果更好。您可以看一下查询,然后看到:“我们正在从一堆表中为Chad Black获得一些东西。”

答案 1 :(得分:0)

普通内部JOIN操作只为符合其ON条件的表行生成结果行。它们抑制所有不匹配的行。这意味着您可以将ON子句的内容移动到WHERE子句中,并获得相同的结果集。不过,不要那样做。 JOIN具有ON子句时更容易理解。

如果使用LEFT JOIN(一种外部联接),则会根据ON子句从提到的第一个表中获取与第二个表中的任何行都不匹配的行。

SELECT a.name, b.name
FROM a
LEFT JOIN b ON a.a_id = b.a_id

给出的结果集包含a的所有行,其中b.name中的NULL值表示ON条件不匹配。