Sql 作为自然联接执行equijoin
我是SQL新手 我希望执行一个包含两个表的查询,这两个表都是equijoin和natural join,其中我将按城市统计客户下订单的实例。如果客户ID出现在Sql 作为自然联接执行equijoin,sql,join,group-by,count,Sql,Join,Group By,Count,我是SQL新手 我希望执行一个包含两个表的查询,这两个表都是equijoin和natural join,其中我将按城市统计客户下订单的实例。如果客户ID出现在ordertable关系中,我假设客户已经下了订单 我试图在一个查询中组合equijoin、COUNT()和GroupBy,然后在另一个查询中使用NATURAL JOIN重复相同的查询 请参考下面的代码了解我的尝试及其结果 以下等分连接: SELECT customer.city, COUNT(*) AS total FROM custom
ordertable
关系中,我假设客户已经下了订单
我试图在一个查询中组合equijoin、COUNT()
和GroupBy,然后在另一个查询中使用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 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
,该表没有cust\u id
。因此,“自然连接”生成了笛卡尔积
注意以下几点:
在join
子句中是明确的from
条件在查询中是明确的。没有猜测join
- 表别名使查询更易于编写和读取
我认为<代码>自然连接< /代码>是一个可憎的事情,因为它没有考虑到正确声明的外键关系。相反,它只是依赖列的命名约定来匹配表
而且,应该导致错误的问题——例如缺少
join
键——不会被检测到。我会避免这两种类型,并使用适当的join ON
子句。第一种样式不再是“标准”样式,第二种样式没有显示用于连接的特定列;示例输入(作为初始化代码)以及所需和实际输出(包括逐字错误消息);标签和版本;清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。(调试基础。)用于包含DBMS/product和DDL的SQL,其中包括约束和索引以及表格格式的初始化。感谢您指出我使用了错误的关系。令人恼火的是,当未检测到cust\u id
列时,没有抛出任何错误。我再也不会碰自然连接了。
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;