SQLZOOのSELECT within SELECTを解いてみた
さいきんSQLを勉強していまして、Gunosyの「非エンジニアが最速でSQLをマスターする方法」に書いてある『10年戦えるデータ分析入門』→SQLZOO (https://sqlzoo.net/wiki/SQL_Tutorial) という順番で学習を進めています。
SQLZOOは出力が合っているのか違っているのかは教えてくれるのですが、どんなSQL文を書けば正解できるのか教えてくれません。すでに日本語でSQLZOOの解答を公開してくださっている方もおられますが、私も自分の勉強のアウトプットとして、解答例を公開したいと思います。
SQLZOOは問題文が英語なので、あまり自信はありませんが問題文の和訳も用意しました。意訳なので正確さに欠けるかもしれませんが……
- SELECT from Nobel Tutorial の解答例はこちら → https://rnsr0371.boy.jp/2020/12/17/sqlzooselect_from_nobel_tutorial/
参考にさせていただいたサイト
- 【SQLZOO答え】4.SELECT within SELECT https://note.com/shincz88/n/n8e3a542e4b38#Qyx1d
- 4. SELECT within SELECT/SQL ZOO の答えと解説 https://marucoblog.com/programing/4-select-within-select/
今回新しく知ったこと
- 相関サブクエリ
- MIN()を文字列に使うとアルファベッド順で一番若いものを返すこと
Bigger than Russia
ロシアより人口の多い国の国名を列挙してください。
SELECT
name
FROM world
WHERE population >
(SELECT population FROM world WHERE name = 'Russia’);
Richer than UK
ヨーロッパの国で一人あたりのGDPがイギリスより多い国を表示してください。
SELECT
name
FROM world
WHERE (gdp / population) >
(SELECT
gdp / population
FROM world
WHERE name = 'United Kingdom')
AND continent = 'Europe’;
Neighbours of Argentina Australia
アルゼンチンかオーストラリアが含まれる大陸に所属する国の名前と大陸名を列挙してください。国名順に並べ替えること。
SELECT
name
, continent
FROM world
WHERE continent IN
(SELECT
continent
FROM world
WHERE name = 'Argentina' OR name = 'Australia')
ORDER BY name;
Between Canada and Poland
どの国がカナダ以上ポーランド未満の人口を持っているでしょうか? 国名と人口を表示してください。
SELECT
name
,population
FROM world
WHERE population >
(SELECT
population
FROM world
WHERE name = 'Canada')
AND population <
(SELECT
population
FROM world
WHERE name = 'Poland’);
Percentages of Germany
ドイツ(人口8000万人)はヨーロッパの国で最大の割合です。オーストリア(人口850万人)はドイツの人口の11%です。ヨーロッパの各国の国名と人口を表示してください。人口はドイツの人口の割合で表示してください。
SELECT
name
, ROUND(population /
(SELECT population FROM world WHERE name = 'Germany') * 100) || '%' AS percentages
FROM world
WHERE continent = 'Europe’;
Bigger than every country in Europe
ヨーロッパのどの国よりもGDPが大きい国はどこでしょう?
SELECT
name
FROM world
WHERE gdp >
(SELECT
MAX(gdp)
FROM world
WHERE continent = 'Europe’);
Largest in each continent
面積が各大陸で一番大きい国を見つけて、大陸名・国名・面積を表示してください。
SELECT
continent
, name
, area
FROM world AS x
WHERE area >= ALL
(SELECT area
FROM world AS y
WHERE x.continent = y.continent);
参考:https://marucoblog.com/programing/4-select-within-select/
First country of each continent (alphabetically)
大陸ごとに国をアルファベッド順並べた時、最初の国の名前とその大陸を列挙してください。
SELECT
continent
, MIN(name)
FROM world
GROUP BY continent;
参考:https://marucoblog.com/programing/4-select-within-select/
Difficult Questions That Utilize Techniques Not Covered In Prior Sections
10.
大陸に所属する国の人口がすべて2500万人以下の大陸を見つけてください。その後、それらの大陸に属する国の名前を見つけてください。国名・大陸・人口を表示すること。
SELECT
name
, continent
, population
FROM world AS x
WHERE 25000000 >= ALL
(SELECT population
FROM world AS y
WHERE x.continent = y.continent);
参考:https://marucoblog.com/programing/4-select-within-select/
11.
同大陸内のどの国よりも3倍以上人口を持っている国があります。国名と大陸を教えてください。
SELECT
name
, continent
FROM world AS x
WHERE population >= ALL
(SELECT population * 3
FROM world AS y
WHERE x.continent = y.continent AND x.name <> y.name);
参考:https://marucoblog.com/programing/4-select-within-select/
