[英]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.