【问题标题】:Price of each order shown as order price每个订单的价格显示为订单价格
【发布时间】:2019-08-02 21:09:38
【问题描述】:

编写一个 SQL 查询,显示客户每笔订单的价格 其姓氏以字母 M 开头。显示订单号, 订单上的姓氏,以及订单的价格(订单价格)。首先显示订单价格最高的结果。使用单引号提供聚合别名。

产生一个结果,确保它完全回答了问题

Select `CustomerLastName`,petshop_order.OrderNo, 
sum(item.ItemPrice) as `Order Price`
from customer,petshop_order,petshop_order_item,item
where `CustomerLastName` like "M%"
 And (customer.ssn=petshop_order.ssn
 And petshop_order.OrderNo = petshop_order_item.OrderNo
 And petshop_order_item.SKU=item.SKU)
Group by `OrderNo`
Order By `Order Price` DESC;

我知道这可能是糟糕的语法......这是我的第一个数据库类。不幸的是,教授就是这样教给我们的。

【问题讨论】:

  • 嘿,不用担心语法。有更好的方法,但你必须在某个地方学习。你目前拥有的有什么问题?还有,那是 MySQL 吗?
  • 谢谢!是的,这是 MySQL 和工作台。我只是想确保我没有遗漏任何东西,并且它正确地回答了这个问题。
  • 您会在codereview.stackexchange.com 找到最好的运气,StackOverflow 用于解决特定问题或问题,它可能会导致您的帖子在此处关闭。也就是说,您的查询看起来对我有用,我会将一些反馈发布到答案中。

标签: mysql sql mysql-workbench


【解决方案1】:

总体而言,您的查询逻辑看起来是正确的。以下是一些一般性的反馈和提示:

隐式连接与显式连接

具有相关WHERE 子句的逗号分隔表称为隐式连接:

from customer,petshop_order,petshop_order_item,item
where (customer.ssn=petshop_order.ssn
 And petshop_order.OrderNo = petshop_order_item.OrderNo
 And petshop_order_item.SKU=item.SKU)

显式连接是非常受欢迎的,它们使用JOIN 关键字并在连接谓词中直接包含相关子句:

FROM customer
JOIN petshop_order ON customer.ssn=petshop_order.ssn
JOIN petshop_order_item ON petshop_order.OrderNo = petshop_order_item.OrderNo
JOIN item ON petshop_order_item.SKU = item.SKU

它们通常更容易阅读,当您使用不同的连接类型时,如果它们被明确表达,LEFT JOIN,而不是隐含表达,*=(+),跟踪它们要容易得多。

别名

别名是您的朋友,可以让所有内容更具可读性。例如给上面的JOIN添加表别名,你可以看到可读性的不同:

FROM customer as c
JOIN petshop_order as po ON c.ssn = po.ssn
JOIN petshop_order_item as poi ON po.OrderNo = poi.OrderNo
JOIN item as i ON poi.SKU = i.SKU

一旦我们将customer 别名为c,我们就可以在其他任何地方将其称为c,等等。

特殊 DBMS 规则

如果您包含聚合,大多数数据库管理系统会强制您在 GROUP BY 中包含所有非聚合字段。对于您的查询,这意味着CustomerLastName 也需要在分组中。

简明扼要:

SELECT CustomerLastName, OrderNo, SUM(ItemPrice)
FROM ..
WHERE ..
GROUP BY CustomerLastName, OrderNo

MySQL 不强制执行此操作,因此您当前的查询看起来应该可以工作,但值得注意的是,每个 DBMS 产品都包含自己的各种规则和语法,而其他产品可能没有。

【讨论】:

    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2021-07-22
    • 2015-03-21
    • 2015-04-24
    • 2021-07-20
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多