[英]sql sub-queries
任何人都可以帮助我解决以下问题:
一些国家的人口是其邻国(同一地区)的三倍以上。 给出国家和地区。
我的尝试:
select x.name, x.region
from bbc x
where x.population >all
(select population*3
from bbc y
where y.region = x.region)
语法正确但没有返回记录(应返回 3 行)
找出所有人口少于 2500 万的地区的每个国家。显示名称、地区和人口。
我的尝试:
select name, region, population
from bbc
where region not in
(select distinct region from bbc
where population >= 25000000)
我用了“不在”。 有没有办法使用“in”?
SELECT name, region
FROM bbc x
WHERE population/3 >= ALL
(SELECT population
FROM bbc y
WHERE y.region=x.region
AND x.name != y.name)
Elad,你的第一个答案几乎是正确的,只是缺少一个非常关键的组成部分:
SELECT x.name, x.continent
FROM world x
WHERE x.population >ALL(SELECT population*3
FROM world y
WHERE y.continent = x.continent
AND x.name<>y.name)
您会看到,当您执行检查 x.population>3*(all of y.populations for same Continent) 的子查询时,您必须指定不检查同一国家; 否则你要检查 x>3x 这在数学上是不可能的。
一些其他解决方案,增加了兴趣。
第一个查询:
SELECT name,
region
FROM bbc x
WHERE population >
-- this sub query finds each neighbour (not including itself) and returns the max populations multiplied by 3
(SELECT 3 * MAX(population)
FROM bbc y
WHERE x.region = y.region
AND x.name <> y.name)
第二个查询:
SELECT name,
region,
population
FROM bbc x
WHERE population < ALL
-- the ALL keyword allows comparison to be made against all the values in a list
-- this sub query finds each country that belongs to a region with populations less than 25 million and returns this as a list
(SELECT population
FROM bbc y
WHERE y.region = x.region
AND population > 25000000)
为了第一 :
你必须分工。 第一步,找到一个国家的邻居。 这必须是自动加入:
SELECT *
FROM bbc country
INNER JOIN bbc neighbours
ON country.region = neighbours.region
AND country.name != neighbours.name
不要忘记将自己的国家排除在邻居之外!
其次,您可以计算一个国家有多少邻国拥有合适的人口:
sum(CASE WHEN country.population > neighbours.population * 3 THEN 1 ELSE 0 END)
(Group by country !)
与总数比较,你就完成了!
SELECT countryName
FROM
(
SELECT sum(CASE WHEN country.population > neighbours.population * 3 THEN 1 ELSE 0 END) as okNeighbours,
count(*) as totalNeighbours
country.name as countryName
FROM bbc country
INNER JOIN bbc neighbours
ON country.region = neighbours.region
AND country.name != neighbours.name
GROUP BY country.name
)
WHERE totalNeighbours = okNeighbours
对于第二个:
SELECT name, region, population
FROM bbc
WHERE region IN (
SELECT region
FROM bbc
GROUP BY region
HAVING SUM(CASE WHEN population >= 25000000 THEN 1 ELSE 0 END) = 0
)
SELECT name, region
FROM bbc x
WHERE population > 3 *
(SELECT population
FROM bbc y
WHERE x.region=y.region
ORDER BY population DESC limit 1,1)
您正在关注的人口是第二高人口价值的 3 倍,即限制 1,1。 第二个问题缺少一个 0,那么它是正确的。
SELECT name, region, population
FROM bbc x
WHERE (SELECT SUM(population)
FROM bbc y
WHERE x.region=y.region) < 250000000
select name, region from bbc x
where population > all
(select 3*population from bbc y
where y.region=x.region and population > 0 and x.name <> y.name)
要查找一个大陆上所有国家的名称,其中所有国家的人口都少于 2500 万,请执行以下操作:
找到按大陆分组的 max(population)
(SELECT max(population) FROM world GROUP BY continent)
注意:由于最大值小于您的数字,您知道所有都是
寻找大陆
SELECT continent FROM world WHERE population IN(SELECT max(population) FROM world GROUP BY continent) AND population <= 25000000)
把它们放在一起得到名字,大陆,人口
SELECT name, continent, population FROM world WHERE continent IN(SELECT continent FROM world WHERE population IN(SELECT max(population) FROM world GROUP BY continent) AND population <= 25000000)
SELECT name,continent FROM world x WHERE population > ALL(SELECT population*3
FROM world y WHERE x.continent=y.continent and x.name!=y.name)
我现在刚刚遇到这个问题,如果我晚了几年,很抱歉。 哈哈! 我就是这样做的。 主要 select 语句的目的是比较每个国家/地区,然后我们在内部 select 语句中稍微扭曲它,该语句仅比较同一大陆/地区的国家/地区。 我们还添加了一个条件,即不应将外部选择的国家/地区与自身进行比较。
select x.name, x.continent
from world x
where x.population > 3 * (select y.population from world as y where x.continent = y.continent and x.name <> y.name order by y.population desc limit 1)
对于第二个查询,“查找属于所有人口少于 2500 万的地区的每个国家/地区。显示名称、地区和人口。” (参考sqlzoo.net,'SELECT 中的 SELECT',问题 3b )
SELECT name, region, population FROM bbc
WHERE region NOT IN
( SELECT DISTINCT region FROM bbc
WHERE population >= 25000000 )
AND region IN
( SELECT DISTINCT region FROM bbc
WHERE population < 25000000 )
找出所有人口少于 2500 万的大陆所属的每个国家。显示名称、大陆和人口
所以首先需要找到任何国家不应该有人口> 25000000的大陆。
SELECT name, continent, population from world x
WHERE continent in
(SELECT continent FROM world y
WHERE 25000000 >
(select max(population) from world z
where y.continent = z.continent))
任何人都可以在以下方面为我提供帮助:
一些国家的人口是其邻国(在同一地区)的三倍以上。 给出国家和地区。
我的尝试:
select x.name, x.region
from bbc x
where x.population >all
(select population*3
from bbc y
where y.region = x.region)
语法正确,但不返回任何记录(应返回3行)
查找属于所有人口均少于2500万的区域的每个国家/地区。显示名称,区域和人口。
我的尝试:
select name, region, population
from bbc
where region not in
(select distinct region from bbc
where population >= 25000000)
我用“不在”。 有没有一种使用“ in”的方法?
这也将起作用
SELECT name, continent
FROM world x
WHERE population >= 3* (SELECT population FROM world y
WHERE y.continent=x.continent
AND population>0 ORDER BY population DESC LIMIT 1 OFFSET 1 )
在内部查询中,我选择了各自大陆中第二高的人口,并在其中检查第二高的人口是否比人口小 3 倍。
对于第一个问题,SQL 脚本是:
SELECT w1.name,w1.continent
FROM world w1
WHERE w1.population > 3 * (
SELECT max(w2.population)
FROM world w2
WHERE w2.continent = w1.continent
AND w2.name <> w1.name
GROUP BY w2.continent
)
我也在 SQLZOO 上经历了这些小挑战,我发现这两个问题很棘手。
一些国家的人口是其邻国(同一大陆)的三倍以上。 给国家和大陆。
我的第一次尝试是:
SELECT name, continent
FROM world x
WHERE population > ALL (SELECT population*3
FROM world y
WHERE x.continent = y.continent)
这对我来说似乎是合乎逻辑的。 直到我意识到,如果我将大陆上的每个人口(包括它自己)与所有其他人口进行核对,那么我永远不会得到任何结果,因为一个国家的人口永远不会超过其自身的三倍。 因此,您需要检查所有其他国家/地区,不包括您要检查的国家/地区。
表中还有两个国家的人口为 NULL,因此您还必须排除这些国家才能满足问题。
SELECT name, continent
FROM world x
WHERE population > ALL (SELECT population*3
FROM world y
WHERE x.continent = y.continent
AND x.name <> y.name)
AND population > 0
使用此查询:
SELECT name, continent
FROM world x WHERE population/3 > ALL (SELECT population
FROM world y
WHERE x.continent = y.continent
AND x.name != y.name
AND population > 0)
对于第一个问题:您必须添加另一行代码AND B.name <> A.name
SELECT name, region
FROM bbc A
WHERE A.population/3 >= ALL(SELECT population FROM bbc B
WHERE B.region = A.region
AND B.name <> A.name)
对于第二个问题:您可以使用ALL
摆脱NOT IN
和IN
SELECT name, region, population
FROM bbc A
WHERE 25000000 >= ALL(SELECT population FROM bbc B
WHERE B.region = A.region)
此查询将帮助您。
select name,continent from world a where population >all(select population*3 from world b where a.continent=b.continent and a.name!=b.name)
正确答案仅显示全世界 3 个国家/地区的结果。 也许我错过了一些东西。 假设邻居仅被定义为同一大陆的一个国家,那么应该有许多国家的人口是其邻居的 3 倍以上。
IE,阿富汗有 2500 万人口,而亚洲的巴林有 120 万人口,这使得阿富汗的人口是其邻国巴林的 3 倍多。 所以这也应该是一个正确的答案选择吧?
此查询将返回所需的输出
SELECT countryName, continent FROM ( SELECT sum(CASE WHEN w1.population > w2.population * 3 THEN 1 ELSE 0 END) as finaloutput, count(*) as totalNeighbours, w1.name as countryName, w1.continent as continent FROM world w1 INNER JOIN world w2 ON w1.continent= w2.continent AND w1.name != w2.name GROUP BY country.name ) as tbl WHERE totalNeighbours = finaloutput
在您的第二个查询中,您可以在没有IN
或NOT IN
情况下执行此操作:
SELECT name, region, population
from bbc
where population >= 25000000
如果您坚持使用 IN 但是只需颠倒条件:
select name, region, population
from bbc where region not in
(select distinct region from bbc where population < 25000000)
如果我正确理解您的数据,那么您只有一张表。 所以当你
Select distinct region from bbc where population >=25000000)
你真的得到了所有拥有 2500 万人口的国家的列表,并列出了他们的地区名称。 要获得区域列表,您必须对人口求和
Select region, sum(population) as regionpop from bbc group by region having sum(population)>25000000
现在您可以从这些地区中选择国家并显示其信息
Select name, region, population from bbc where region in
(Select region from bbc group by region having sum(population)>25000000)
对于第一个查询,这样的事情会起作用吗?
SELECT
a.region , b.*
FROM
bbc a
INNER JOIN
(SELECT population , (population * 3) AS PopX3, region FROM bbc ) b
ON
a.population < PopX3
AND
a.region <> b.region
对于您的“3 次人口”查询,不需要子查询...只是区域上的自联接,并且第一个实例人口是 > 第二个实例人口 * 3。在自联接的情况下同一地区的国家,它永远不会被归还,因为它的人口永远不会超过其自身价值的 3 倍。
仍在等待其他人口问题的反馈在您的原始问题中作为评论发布...
select
b1.Name,
b1.Region,
b1.Population,
b2.Name SmallerCountry,
b2.Population SmallerPopulation
from
bbc b1
join bbc b2
on b1.Region = b2.Region
AND b1.Population > b2.Population * 3
Select name , continent
from world x
where population > All(
Select population* 3 from world y
where x.continent = y.continent and x.name != y.name);
找出所有国家人口<= 25000000 的大陆。然后找出与这些大陆相关联的国家的名称。 显示姓名、大陆和人口。
解决方案
select name, continent, population
from world x where 25000000>=
all(select population from world z where x.continent = z.continent);
找出所有国家population <= 25000000
的大陆。 然后找到与这些大陆相关联的国家的名称。 显示name
、 continent
和population
。
这是我的解决方案,它似乎是上述所有解决方案中最简单的一个:
SELECT name, continent, population FROM world
WHERE continent NOT IN (SELECT continent FROM world WHERE population > 25000000)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.