Sql 需要帮助理解查询吗

Sql 需要帮助理解查询吗,sql,nested-queries,Sql,Nested Queries,这是数据库的架构: Suppliers(sid:integer, sname:string, address:string) Parts(pid:integer,pname:string,color:string) Catalog(sid:integer,pid:integer,cost:real) 目标:对于每个零件,找出对该零件收费最高的供应商的sname 教授守则: SELECT P.pid, S.sname FROM Parts P, Suppliers S, Catalog C

这是数据库的架构:

Suppliers(sid:integer, sname:string, address:string)

Parts(pid:integer,pname:string,color:string)

Catalog(sid:integer,pid:integer,cost:real)
目标:对于每个零件,找出对该零件收费最高的供应商的sname

教授守则:

SELECT P.pid, S.sname
FROM Parts P, Suppliers S, Catalog C
WHERE C.pid = P.pid AND C.sid = S.sid
AND C.cost = (SELECT MAX (C1.cost)
                         FROM Catalog C1
                         WHERE C1.pid = P.pid)
现在,一般来说,我对SQL非常陌生,所以我一直在努力从概念上理解查询是如何工作的。查看上面的查询,我对子查询究竟是如何工作的感到困惑。我知道子查询是否只是

SELECT MAX (C1.cost)
FROM Catalog C1
它只返回目录表中的最大成本。但是这里有一个条件,C1.pid=P.pid,这就是我的大脑停止工作的地方。我们想要每个零件的最高成本。从概念上讲,SQL查询如何知道单独查看每个pid?添加WHERE子句是否会使所有内容都有点像循环(在常规编程语言中)?这意味着它将进入pid列表,找到每个pid的最大成本,并返回它与C.cost进行比较,然后转到下一个pid?或者这一切究竟是如何在概念上发生的?(我的头脑中缺少了一些东西,可以帮助我理解它是如何或何时通过每个id的)


我最近一直在问一些关于SQL的非常模糊的问题,因为出于某种原因,我正在努力寻找更多的好资源来真正理解这些基础,与其他编程语言相比,我一直在让人们投票来结束我的问题,但是,如果有人能告诉我如何更好地表达我的问题,或者指导我到某个地方更好地理解这一点,我将不胜感激。

你这里有一个很好的答案。对于主查询中的每一行,都将执行子查询,这就是为什么子查询可以引用主查询。

我的第一个建议是不要尝试将SQL视为一种编程语言。如果您开始考虑循环(可能是递归sql之外的循环)或If语句(Case语句之外的循环),那么您最终将陷入一个糟糕的境地。而是考虑数据集。“查询的这一部分获取这组数据”。SQL是一种创建和处理数据集的语言

对于这个查询,您可以用英语输入如下内容:“给我产品的
PID
SNAME
,以及它们的最高
成本
。此外,产品必须在产品、目录和供应商表中。”

这里的假设是,您的
目录
表中每个产品可能有多个条目,并且这些条目之间的
成本可能不同。因此,我们使用相关子查询来确定这些
成本中的哪一个最高

我添加了关于产品需要在所有三个表中的but,只是为了指出这是使用隐式内部连接。我不太喜欢其中的隐含部分,我总是希望人们在查询的
FROM
部分中写出“INNER JOIN ON…”。隐式内部连接更为陈旧


回到在数据集中思考这个问题。假设我们连接所有三个表并返回所有字段。从概念上讲,每个产品在结果集中可能有多个记录,并且成本不同,以区分一个记录和下一个记录。因此,我们添加了子查询和约束,即记录集中的成本必须是目录中特定产品(子查询WHERE子句)的最高成本

既然有人问我“对于每个零件,找出对该零件收费最高的供应商的sname”,那么“对于每个零件”这个词是否应该作为一个通用指标,表明它可能是一个相关的子查询?“for each part”是否也应该告诉我parts id将出现在主查询中(因为您说过“对于主查询中的每一行,将执行子查询”,即对于每个部分,执行子查询)@埃斯格诺不一定。同样的查询可以写为连接、应用或其他巫毒。我不会从措辞中推断出太多的含义。相反,尝试定义所需的输出,然后找到实现它的最佳方法。