Sql 作为自然联接执行equijoin

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

我是SQL新手

我希望执行一个包含两个表的查询,这两个表都是equijoin和natural join,其中我将按城市统计客户下订单的实例。如果客户ID出现在
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
;
屈服

  • 城市|计数
  • SF | 1
  • SLC | 7
  • 图森| 2
  • 但是:

    屈服

  • 城市|总数
  • LA|34
  • SF | 17
  • SLC | 170
  • 图森| 34

  • 我相信第一组结果是正确的,但我不明白为什么这两种不同的方法会产生不同的结果。

    您正在比较苹果和橙子,并说明为什么应该避免自然连接。只是不要使用它们

    您应该了解的查询是:

    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;