在SQL中,如何从关系数据库模式中检索信息?

时间:2012-11-01 08:41:38

标签: mysql sql database relational-database

我有一个关系数据库架构,如下所示: enter image description here

问题是“查找2009年购买产品的客户的详细信息,产品由霍尼韦尔于1968年制造”。

到目前为止我所做的是:

SELECT * FROM Customer
WHERE CID IN
    (SELECT Customer_ID FROM Order
     WHERE Purchase_Date = 2009 
     AND EXISTS
        (SELECT * FROM Order_Items, Product, Manufacturer
         WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID AND
         Mnufacturer_Name = "Honeywell" AND Manufacturerd_Date = 1968));

我一直在研究数据库大约一个月,所以我想这里的专家们看起来很复杂..我这样做了吗?否则,请提供任何反馈意见..

提前致谢。

1 个答案:

答案 0 :(得分:2)

通常,当从关系数据库中的相关表中检索信息时,您应该使用适合您从查询中获取的结果的连接类型JOIN表。是否包括外表中不匹配的行。所以,在你的情况下,你可以这样做:

SELECT DISTINCT c.*
FROM Customer c
INNER JOIN Order        o ON c.CID             = o.Customer_ID
INNER JOIN OrderItems  oi ON o.OID             = oi.OID
INNER JOIN Product      p ON oi.ProductID      = p.PID
INNER JOIN Manufacturer m ON p.Manufacturer_ID = m.MID
WHERE o.Purchase_Date = 2009 
  AND m.Mnufacturer_Name = "Honeywell"
  AND m.Manufacturerd_Date = 1968

但是,在您发布的查询中:

SELECT * FROM Customer
WHERE CID IN
    (SELECT Customer_ID FROM Order
     WHERE Purchase_Date = 2009 
     AND EXISTS
        (SELECT * FROM Order_Items, Product, Manufacturer
         WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID AND
         Mnufacturer_Name = "Honeywell" AND Manufacturerd_Date = 1968));

您正在使用IN谓词,并使用旧的联接语法Order_Items加入三个表ProductManufacturer.. FROM Order_Items, Product, Manufacturer WHERE OID = OID AND Product_ID = PID AND MID = Manufacturer_ID

您的查询可能有效。但是,如果NULL有任何Customer_ID值,则不会返回任何结果。但是使用JOIN会更容易。以下是关于JOIN

的实用新闻