我正在研究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';
答案 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
条件不匹配。