簡體   English   中英

如何混合和改進此SQL語句?

[英]How to mix AND improve this SQL sentences?

首先,我使用mySQL的world數據庫: http : //dev.mysql.com/doc/world-setup/en/index.html

我正在嘗試構建一個句子,以返回每個大陸上居住最少的國家,如果人口相同,則顯示每個大陸上所有國家的人口。

通過下面的句子,我設法獲得了每個大陸上人口最少的國家的人口,但是其中只有一個顯示,而該國家顯示不正確。

SELECT 
CASE
  WHEN Continent="Europe" THEN "Europe"
  WHEN Continent="Asia" THEN "Asia"
  WHEN Continent="North America" THEN "North America"
  WHEN Continent="South America" THEN "South America"
  WHEN Continent="Africa" THEN "Africa"
  WHEN Continent="Oceania" THEN "Oceania"
  ELSE "Antarctica"
END
  AS Area,
Name,
  CONCAT(MIN(Population),"hb") AS "N habitantes"     
FROM Country
GROUP BY Area;

得到這個結果

'Africa'       , 'Angola'        , '0hb'
'Antarctica'   , 'Antarctica'    , '0hb'
'Asia'         , 'Afghanistan'   , '286000hb'
'Europe'       , 'Albania'       , '1000hb'
'North America', 'Aruba'         , '7000hb'
'Oceania'      , 'American Samoa', '0hb'
'South America', 'Argentina'     , '2000hb'

嗯,代碼非常笨拙,我想必須有一種方法可以更好地表明針對每個大陸,查詢必須返回居住最少的國家。 我想知道它是否存在,因為只能做到7大洲,但是如果它們是1000000 ...

通過這些句子,我將能夠返回我所指示的大陸上居住最少的國家,例如:

SELECT Name,Population FROM Country WHERE Population=
(SELECT MIN(Population) FROM   Country WHERE Continent="Antarctica");

返回值:

'南極洲','0'

“法國南部領土”,“ 0”

“布威島”,“ 0”

“聽說島和麥當勞群島”,“ 0”

“英國印度洋領地”,“ 0”

“南喬治亞島和南桑威奇群島”,“ 0”

“美國本土外小島嶼”,“ 0”

我認為必須有一種將兩個句子混合使用的方法,並且返回的結果類似於每個大陸的先前結果,因此它返回了我在開始時所說的內容。 我的意思是,如果世界上只有南極洲和南美的大陸,則應將其添加到先前的結果中:

福克蘭群島(Falkland Islands),2000年

諾福克島(Norfolk Island),2000年

紐埃(Niue),2000

'托克勞','2000'

我知道我可以使用UNION對每個大洲進行類似於第二個句子的句子,但這再次是可行的,因為只有7個大洲。

我想念什么嗎? 謝謝你的幫助。

要獲取每個大洲人口最少的國家/地區的名稱,您需要確定這些國家/地區。 像這樣的東西:

SELECT Continent, MIN(Population) 
FROM   Country
GROUP BY Continent

不利的一面是它不會返回國家名稱,並且您不能合法地僅將國家名稱添加到查詢中(MySQL不會出錯,但結果不確定)。

因此,您可以將以上內容用作子查詢,並將其與表格(大陸名稱和人口數)結合起來

SELECT b.Continent, b.Name, b.Population
FROM
(
    SELECT Continent, MIN(Population) AS Population
    FROM Country
    GROUP BY Continent
) a
INNER JOIN Country b
ON a.Continent = b.Continent
AND a.Population = b.Population

不利的一面是,如果一個大陸上有多個國家人口相同,那么結果將是奇怪的。

另一種選擇是使用GROUP_CONCAT以人口順序將所有名稱放在一起,然后僅使用SUBSTRING_INDEX來獲取第一個名稱:

SELECT Continent, SUBSTRING_INDEX(GROUP_CONCAT(Name ORDER BY Population), ',', 1), SUBSTRING_INDEX(GROUP_CONCAT(Population ORDER BY Population), ',', 1)
FROM Country
GROUP BY Continent

此方法的缺點是,如果國家/地區名稱包含用作分隔符的字符,則結果可能會很奇怪(默認值為逗號)。

也可以使用用戶變量將序列號添加到按人口排序的大洲內的國家/地區,然后僅獲取序列號為1的國家/地區。

 SELECT x.continent
      , x.code
      , x.name
      , x.population 
   FROM country x 
   JOIN 
      ( SELECT continent
             , MIN(population) min_population 
          FROM country 
         GROUP 
            BY continent
      ) y 
     ON y.continent = x.continent 
    AND y.min_population = x.population;

輸出:

+---------------+------+----------------------------------------------+------------+
| continent     | code | name                                         | population |
+---------------+------+----------------------------------------------+------------+
| Antarctica    | ATA  | Antarctica                                   |          0 |
| Antarctica    | ATF  | French Southern territories                  |          0 |
| Antarctica    | BVT  | Bouvet Island                                |          0 |
| South America | FLK  | Falkland Islands                             |       2000 |
| Antarctica    | HMD  | Heard Island and McDonald Islands            |          0 |
| Africa        | IOT  | British Indian Ocean Territory               |          0 |
| Asia          | MDV  | Maldives                                     |     286000 |
| Antarctica    | SGS  | South Georgia and the South Sandwich Islands |          0 |
| North America | SPM  | Saint Pierre and Miquelon                    |       7000 |
| Oceania       | UMI  | United States Minor Outlying Islands         |          0 |
| Europe        | VAT  | Holy See (Vatican City State)                |       1000 |
+---------------+------+----------------------------------------------+------------+

您可以像這樣使用group by:

SELECT Name,Population FROM Country WHERE Population=
(SELECT MIN(Population) FROM   Country GROUP BY Continent);

暫無
暫無

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

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