簡體   English   中英

需要幫助了解查詢

[英]Need help understanding query

這是數據庫的架構:

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

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

Catalog(sid:integer,pid:integer,cost:real)

目標:對於每個零件,找到對該零件收費最高的供應商名稱。

教授代碼:

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

它只會在目錄表中返回最大成本。 但這具有條件WHERE C1.pid = P.pid ,這是我的頭腦停止工作的地方。 我們想要每個部分的最高成本。 從概念上講,SQL查詢如何知道分別查看每個pid? WHERE子句的添加是否使一切都像循環(在常規編程語言中)? 意味着它將在pid列表中查找,找到每個pid的最大成本,並將其返回以與C.cost進行比較,然后繼續下一個pid? 或者這在概念上到底是如何發生的? (我腦海中缺少某些東西,可以幫助我了解每個ID的操作方式或時間)

我最近一直在問一些關於SQL的非常模糊的問題,因為由於某些原因,我正努力尋找更多...與其他編程語言相比,有很多好的資源可以真正理解其中的一些基礎,而且我一直在吸引人們投票關閉我的問題,但是如果有人至少可以告訴我如何更好地表達我的問題或將我引導到一個更好地理解這一點的地方,我將不勝感激。

我的第一個建議是不要嘗試將SQL視為一種編程語言。 如果您開始考慮循環(可能不在遞歸sql之外)或if語句(在Case語句之外),那么您將陷入困境。 而是考慮數據集。 “查詢的這一部分將獲取這組數據”。 SQL是一種創建並使用數據集的語言。

對於此查詢,您可以用英文輸入:“請給我產品的PIDSNAME以及它們的最高cost 。此外,產品必須在“產品”,“目錄”和“供應商”表中。

這里的假設是,您的Catalog表每個產品可能有多個條目,並且這些條目之間的costs可能有所不同。 因此,我們使用相關子查詢來確定這些costs哪一個最高。

我添加了,但是關於該產品必須位於所有三個表中,只是為了指出這是使用隱式INNER JOIN的。 我不是那種隱式部分的忠實擁護者,並且總是喜歡人們在查詢的FROM部分中寫出“ INNER JOIN ON ...”。 隱式的INNER JOIN比較老派。

回到數據集中考慮這一點。 假設我們聯接了所有三個表並返回了所有字段。 從概念上講,每個產品可能在結果集中有一個以上的記錄,但要區分一個記錄和下一個記錄,會花費不同的成本。 因此,我們添加了子查詢和約束,即記錄集中的成本必須是我們可以在目錄中為該特定產品(子查詢WHERE子句)找到的最高成本。

您在這里擁有一個相關的子查詢 對於主查詢中的每一行,都會執行子查詢,這就是為什么子查詢可以引用主查詢的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM