Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何混合和改进这些SQL语句?_Mysql_Sql - Fatal编程技术网

Mysql 如何混合和改进这些SQL语句?

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

首先,我正在使用mySQL的世界数据库:

我试图构建一个句子,返回每个大陆上人口最少的国家,如果人口相同,显示每个大陆的所有国家

用下面这句话,我设法得到了每个大陆上一个人口最少的国家的人口,但只有一个显示出来,而这个国家的显示不正确

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