编写一个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产品都包含了自己的各种规则和语法,其他人可能不会。