是否有更好或替代的方法来编写我的SQL查询?

时间:2011-06-20 13:45:08

标签: php mysql sql

SQL是我的“弱”部分,但我可以处理它。我想知道下面是否有更好的方法来编写我的查询。任何替代方案,如小调整或编辑都是受欢迎的,这是我学习更多内容的一种方式。

我对所有这些都有预期/正确的结果。

显示哪些商店有产品代码1234,提供代码,名称和地址。

SELECT k.ShopCode, Name, Address FROM shops as k
INNER JOIN availability as d ON k.ShopCode=d.ShopCode
WHERE d.ProductCode = '1234';

显示商店中包含代码2的交易的平均值,包括交易的名称,地址和平均价格。

SELECT Name, Address, AVG(QUANTITY*ProductPrice) AS AveragePrice
FROM shop AS k
INNER JOIN chashier AS t ON k.ShopCode = t.ShopCode
INNER JOIN buy AS a ON t.CashierCode = a.CashierCode
INNER JOIN contains AS p ON a.BuyCode = p.BuyCode
WHERE t.ShopCode = '1'
GROUP BY NAME, ADDRESS

查看该连锁店总购买客户中前三名的名称,地址和金额。

SELECT TOP 3 BuyerName, BuyerSurname, Address, SUM(QUANTITY*ProductPrice) AS AveragePrice
FROM buyer AS pe
INNER JOIN buy AS a ON pe.CardCode = a.BuyerCode
INNER JOIN contains AS p ON a.BuyCode= p.BuyCode
GROUP BY pe.CardCode, BuyerName, BuyerSurname, Address
ORDER BY AveragePrice DESC;

这个展示了尚未在商店推出的新产品 不参加任何购买。答案包括产品的代码和说明。

SELECT BuyCode, description from products
WHERE product.BuyCode not in
( select distinct store_has_products.product_id FROM store_has_products)

显示每个商店的经理。答案包括商店代码和经理的姓名。

SELECT works.store_id as, employee.first_name, employee.last_name FROM manager
left join employee on manager.id = employee.id
lefti join works on employee.id = works. employee_id

4 个答案:

答案 0 :(得分:2)

我要更改第4个查询(尚未启动的产品)以使用EXISTS ...

SELECT BuyCode, description FROM products
WHERE NOT EXISTS (SELECT * FROM store_has_products WHERE product_id = products.BuyCode)

(我发现使用IN而不是大型设备的性能非常差。这可能有所改善,我多年没有使用MySQL。但这至少是一种替代配方。)

其余的看起来很好......

答案 1 :(得分:0)

'热'替代方案是ORM(对象关系映射)

答案 2 :(得分:0)

您的查询没有任何问题。只需几个选择:

  • 你的别名令人困惑。为什么在名为buy的表中使用'a'的别名?别名通常使用对象的第一个字母,如果是碰撞,则使用有意义的缩写。
  • 在您的联接上指定INNER过于冗长。默认情况下,JOIN是INNER。 OUTER也是如此。 LEFT和RIGHT联接总是OUTER
  • 您在某个查询中使用TOP关键字也很麻烦。如果有5个人同等数量并列第二名怎么办?你的TOP结果会随意忽略其中3个保持第1和第2个2。这是TOP的常见陷阱。

答案 3 :(得分:-1)

如果您不喜欢sql,请尝试使用PHP Object-relational mapping