簡體   English   中英

sql子查詢

[英]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 萬,請執行以下操作:

  1. 找到按大陸分組的 max(population)

     (SELECT max(population) FROM world GROUP BY continent)

注意:由於最大值小於您的數字,您知道所有都是

  1. 尋找大陸

    SELECT continent FROM world WHERE population IN(SELECT max(population) FROM world GROUP BY continent) AND population <= 25000000)
  2. 把它們放在一起得到名字,大陸,人口

    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 ININ

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

在您的第二個查詢中,您可以在沒有INNOT 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的大陸。 然后找到與這些大陸相關聯的國家的名稱。 顯示namecontinentpopulation

這是我的解決方案,它似乎是上述所有解決方案中最簡單的一個:

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.

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