每个订单的价格显示为订单价格



编写一个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;

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

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

隐式与显式加入

带有相关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关键字,并直接在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产品都包含了自己的各种规则和语法,其他人可能不会。

最新更新