这个SQL查询的更好或更有效的版本?

时间:2016-11-24 18:27:44

标签: mysql sql

我正在努力学习SQL查询,但我还没有弄清楚哪些更有效。

这是我的代码:

SELECT A.CustName, A.CustID, C.RestName, 
CONCAT(A.Address, ' - ', C.Address, ' + ', C.FoodTime, ' = ', A.Address - C.Address + C.FoodTime) 
AS DeliveryTime, B.OrderID
FROM (SELECT * FROM Customers) AS A
LEFT JOIN (SELECT * FROM Orders) AS B
ON A.CustID = B.CustID
LEFT JOIN (SELECT * FROM Restaurants) AS C
ON B.RestID = C.RestID
ORDER BY A.CustID;

有三个表格CustomersRestaurantsOrders。客户包含CustID,CustName和Address。餐馆包含RestID,RestName,地址和FoodTime。订单包含CustID,RestID和OrderID。

我认为这是一个维度和事实的练习,但我不是100%关于这些在表格方面进行交互的正确方法。如果有人对此有一个很好的解释,我都是耳朵(眼睛)。谢谢!

2 个答案:

答案 0 :(得分:1)

如果您确实需要所有餐厅所有订单的所有客户信息,那么您的查询将会“工作”#34;。正如已经指出的那样(从sometable中选择*)和(sometable),有或没有括号,是相同的,大多数人只会把表名。

concat的第一部分将向您显示地址和食物时间信息。第二部分,你试图从另一个地址减去一个地址,然后添加一个时间,可能会给你一个错误,这取决于所使用的数据库(如果你的数据库解释" +"作为一个连接运算符,实际上可以减去地址,然后你可能获得一个有效的字符串,但似乎不太可能。)

第三,作为一种风格问题,给你的桌子提供别名a,b和c可能会让你感到困惑。一个字符别名是可以的,但在这种情况下乳清不会将r用于餐厅,o用于订单而c用于客户?

答案 1 :(得分:0)

首先,避免无用的(SELECT * FROM xxx) AS zzz这应该更好:

SELECT C.CustName, C.CustID, R.RestName, 
    CONCAT(C.Address, ' - ', R.Address, ' + ', R.FoodTime, ' = ', C.Address - R.Address + R.FoodTime) 
    AS DeliveryTime, O.OrderID
FROM Customers AS C
LEFT JOIN Orders AS O
    ON C.CustID = O.CustID
LEFT JOIN Restaurants AS R
    ON O.RestID = R.RestID
ORDER BY C.CustID;

接下来,你真正想做什么?