我一直對SQLZoo的一個問題感興趣。這是「每組最大的」問題。我想了解引擎是如何運作的。mySQL:這是一種遞歸(或相互依賴)的形式嗎?
名爲BBC的表包含名稱,世界地區和每個國家的人口:
BBC(姓名,地區,人口)
給定的任務是選擇每個人口最多的國家顯示其名稱,地區和人口。
提供的解決方案是:
SELECT region, name, population FROM bbc x
WHERE population >= ALL
(SELECT population FROM bbc y
WHERE y.region=x.region
AND population>0)
1.主要問題。我覺得這有點讓人費解。我想了解引擎如何處理這個問題,因爲初看起來似乎存在某種相互依賴關係(x取決於y,y取決於x)。引擎是否遵循某種遞歸來產生最終選擇?或者我錯過了某些東西,例如x或y實際上是固定的?
2.繼發性問題。奇怪的是,當我從括號內拉出「AND總體> 0」並將其置於底部時,8個結果中有一個區域(歐洲/俄羅斯)缺失。爲什麼?我不明白這一點。
事實上,當我嘗試(可從同一頁的Sakila上的MySQL網站)的世界數據庫查詢,該行爲是不同的: 隨着人口> 0了括號的,我得到6區域。六是在這個數據庫中是正確的數字,因爲「選擇大陸從國家GROUP BY大陸」顯示七大洲,其中一個是南極洲,其中包括5個「國家」,都是0人口。
所以這似乎是正確的。
SELECT continent, `name`, population FROM country X
WHERE population >= ALL
(SELECT population FROM country Y
WHERE Y.`Continent` = X.`Continent`)
AND population>0
在另一方面,當我拉「人口> 0」回括號內爲上SQLZoo,我還獲得5個國家以零(國「屬於南極人」)。如果我指定x.population或y.population,則無關緊要,我會得到零。
continent name population
------------- -------------------------------------------- ------------
Antarctica Antarctica 0
Antarctica French Southern territories 0
Oceania Australia 18886000
South America Brazil 170115000
Antarctica Bouvet Island 0
Asia China 1277558000
Antarctica Heard Island and McDonald Islands 0
Africa Nigeria 111506000
Europe Russian Federation 146934000
Antarctica South Georgia and the South Sandwich Islands 0
North America United States 278357000
非常期待這些問題的見解!
祝大家美好的一週。
:)
注:
作爲參考,但問題是這個頁面上數3A: http://old.sqlzoo.net/1a.htm?answer=1
線程提的是「最偉大的正每組「問題的相同查詢: MySQL world database Trying to avoid subquery
世界數據庫可以在這裏找到:http://dev.mysql.com/doc/index-other.html
(關於第二個問題)如果用'AND population IS NOT NULL'替換AND AND> population> 0,會發生什麼? – 2012-08-12 23:29:23
@ypercube,謝謝。是的,這已經超出了我的想法,並且我嘗試了「並非ISNULL(人口)」。對於SQLZoo查詢,同樣的問題(結果集忽略了歐洲/俄羅斯)。對於「世界」數據庫,同樣的問題(在括號內,我們得到零)。 – zx81 2012-08-13 00:23:13
我打算在圓括號內的SQLzoo查詢中嘗試它。 – 2012-08-13 00:25:57