我是SQL的新手。
我希望执行一个包含两个表的查询,这些表既是等值联接又是自然联接,在这里我按城市计算客户下订单的实例。我假设一个客户已经下订单,如果他们的客户ID出现在ordertable
关系中。
[我试图在一个查询中组合等值连接,COUNT()
和GROUP BY,然后在另一个查询中使用NATURAL JOIN
重复相同的查询。
请参阅下面的代码了解我的尝试及其结果。
以下等参:
SELECT customer.city, COUNT(*) AS total FROM customer, ordertable
WHERE customer.cust_id = ordertable.cust_id
GROUP BY customer.city
ORDER BY customer.city ASC
;
产量
但是:
SELECT city, COUNT(*) AS total
FROM customer
NATURAL JOIN orderline
GROUP BY customer.city, city
ORDER BY customer.city ASC
;
产量
我相信第一组结果是正确的,但是我不明白为什么两种不同的方法会产生不同的结果。
您正在比较苹果和橘子,并说明为什么应避免使用natural join
。只是不要使用它们。
您应该学习的查询是:
SELECT c.city, COUNT(*) AS total
FROM customer c JOIN
ordertable ot
ON c.cust_id = ot.cust_id
GROUP BY c.city
ORDER BY c.city ASC;
您的第二个查询正在联接到一个没有orderline
的different表cust_id
。因此,“自然连接”正在生成笛卡尔积。
注意以下内容:
join
在from
子句中是显式的。join
条件在查询中是显式的。没猜到。我认为natural join
是可憎的,因为它没有考虑正确声明的外键关系。相反,它仅依赖于列的命名约定来匹配表。
并且,未检测到应导致错误的问题-例如缺少join
键。