Mysql 如何混合和改进这些SQL语句?
首先,我正在使用mySQL的世界数据库: 我试图构建一个句子,返回每个大陆上人口最少的国家,如果人口相同,显示每个大陆的所有国家 用下面这句话,我设法得到了每个大陆上一个人口最少的国家的人口,但只有一个显示出来,而这个国家的显示不正确Mysql 如何混合和改进这些SQL语句?,mysql,sql,Mysql,Sql,首先,我正在使用mySQL的世界数据库: 我试图构建一个句子,返回每个大陆上人口最少的国家,如果人口相同,显示每个大陆的所有国家 用下面这句话,我设法得到了每个大陆上一个人口最少的国家的人口,但只有一个显示出来,而这个国家的显示不正确 SELECT CASE WHEN Continent="Europe" THEN "Europe" WHEN Continent="Asia" THEN "Asia" WHEN Continent="North America" THEN "Nort
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'
'Bouvet Island','0'
“赫德岛和麦当劳岛”,“0”
'英属印度洋领土','0'
'南乔治亚和南桑威奇群岛','0'
'美国小离岛','0'
我认为必须有一种方法来混合这两个句子,并且它返回的结果与之前针对每个大陆的结果相似,因此它返回的是我在开始时讲的内容。我的意思是,如果世界上只有南极洲和南美洲这样的大陆,那么它应该将这一点添加到先前的结果中:
“福克兰群岛”,“2000”
“诺福克岛”,“2000”
‘纽埃’、‘2000’
“托克劳”,“2000”
我知道我可以用UNION为每个大陆造出一个类似于第二个句子的句子,但再一次,这是可行的,因为只有7个大陆
你知道我错过了什么吗?谢谢您的帮助。您可以这样使用group by:
SELECT Name,Population FROM Country WHERE Population=
(SELECT MIN(Population) FROM Country GROUP BY Continent);
您可以这样使用group by:
SELECT Name,Population FROM Country WHERE Population=
(SELECT MIN(Population) FROM Country GROUP BY Continent);
您可以这样使用group by:
SELECT Name,Population FROM Country WHERE Population=
(SELECT MIN(Population) FROM Country GROUP BY Continent);
您可以这样使用group by:
SELECT Name,Population FROM Country WHERE Population=
(SELECT MIN(Population) FROM Country GROUP BY Continent);
输出:
+---------------+------+----------------------------------------------+------------+
| 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 |
+---------------+------+----------------------------------------------+------------+
输出:
+---------------+------+----------------------------------------------+------------+
| 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 |
+---------------+------+----------------------------------------------+------------+
输出:
+---------------+------+----------------------------------------------+------------+
| 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 |
+---------------+------+----------------------------------------------+------------+
输出:
+---------------+------+----------------------------------------------+------------+
| 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 |
+---------------+------+----------------------------------------------+------------+
要获得每个大陆人口最少的国家的名称,您需要识别这些国家。大概是这样的:-
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 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 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 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_CONCA