🌍
【SQL】SQL Tutorial(SELECT from WORLD)をやってみた
問題1
〇問題文
このテーブルについて
全ての国の国名と大陸と人口を表示する SQL コマンドを実行して結果を観察する。
〇解答
SELECT name, continent, population FROM world;
問題2
〇問題文
WHERE でレコードを選択する方法
人口が2億人(200000000 ゼロが8個ある)以上の国の名前を表示
〇解答
SELECT name FROM world
WHERE population >= 200000000;
問題3
〇問題文
人口population2億人以上の国の国名nameと国民一人当たりの国内総生産を表示
〇解答
SELECT name, (gdp/population) AS GDPperCapita FROM world
WHERE population >= 200000000;
・備考:GDPperCapita = 国民一人当たりの国内総生産
〇解説
Oracleでは、テーブルの別名指定にASは使えません。
問題4
〇問題文
大陸continentが South America の国のnameとpopulationを百万人単位に変換して表示する。
人口 population を 1000000 で割ると100万人単位の人口になる。
〇解答
SELECT name, population/1000000 FROM world
WHERE continent = 'South America';
問題5
〇問題文
国名nameと人口population を France, Germany, Italy について表示する。
〇解答
SELECT name, population FROM world
WHERE name IN ('France', 'Germany', 'Italy');
〇別解
SELECT name, population FROM world
WHERE name = 'France'
OR name = 'Germany'
OR name = 'Italy';
問題6
〇問題文
国名に 'United' を含む国の国名を特定する。
〇解答
SELECT name FROM world
WHERE name LIKE 'United %';
〇解説
LIKE演算子で使用できるワイルドカードについて説明します。
ワイルドカードとは、任意の1文字あるいは任意の文字列(0文字以上)を表わす記号のことです。
ワイルドカード | 意味 |
---|---|
_ | 任意の1文字 |
% | 任意の0文字以上の文字列 |
問題7
〇問題文
ビッグになる2つの道: ビッグな国とは、面積が 3000000 平方キロ以上 または 人口が 250000000 以上の国とする。
面積か人口がビッグな国を表示する。国名 人口 面積(name, population , area)を表示する。
〇解答
SELECT name, population, area FROM world
WHERE area >= 3000000
OR population >= 250000000;
問題8
〇問題文
排他的論理和 Exclusive OR (XOR)の問題。
面積か人口のどちらかだけ(両方は除く)が大きな国を表示する。
国名 人口 面積を表示する(name, population, area)。
・オーストラリアは面積は大きく人口は少ないので、含まれる。
・インドネシアは人口は大きく面積は狭いので、含まれる。
・中国は人口も面積も大きいので除かれる。
・イギリスは人口も面積も小さいので除かれる。
〇解答
SELECT name, population, area FROM world
WHERE (population > 250000000 AND area < 3000000)
OR (population < 250000000 AND area > 3000000);
〇解説
「面積か人口のどちらかだけ(両方は除く)が大きな国を表示する」とは
・面積が小さいAND人口が多い
OR
・面積が大きいAND人口が少ない
と考えると、正解できました。
問題9
〇問題文
南アメリカ大陸にある国の、国名name、人口population(100万人単位)、GDP(10億ドル単位)を表示する。
ROUND関数で小数点以下の数値を2桁に丸める。
南アメリカ大陸にある国の国名と人口(100万人単位)とGDP(10億ドル単位)を小数点以下2桁に丸めて表示する。
〇解答
SELECT name, ROUND(population/1000000,2), ROUND(GDP/1000000000,2) FROM world
WHERE continent = 'South America';
〇解説
ROUND関数とは、数値を四捨五入したい場合に使用する関数です。
ROUND関数の書き方
ROUND(数値, 桁数)
第2引数で指定する桁数 | 処理される桁位置 | 戻される値 |
---|---|---|
-2 | 10の位 | 100の位まで持つ値 |
-1 | 1の位 | 10の位まで持つ値 |
0 | 小数第1位 | 1の位まで持つ値 |
1 | 小数第2位 | 小数第1位まで持つ値 |
桁数を省略した場合は、0が指定されたものとみなされます。
問題10
〇問題文
国内総生産 GDP が1兆ドル以上(0が12個)の国の国名と国民一人当たりのGDPを表示する。 GDPの単位は$1000単位にまとめる。
GDPが1兆ドル以上の国の国名と国民一人当たりのGDPを1000ドル単位に丸めて表示する。
〇解答
SELECT name, round(GDP/population, -3) FROM world
WHERE GDP >= 1000000000000;
問題11
〇問題文
ギリシャ(Greece) の首都はアテネ(Athens)。 GreeceとAthensの綴りはどちらも同じ6文字。
国名nameと首都capitalが同じ長さの国の、国名と首都を表示する。
LENGTH 関数で文字列の文字数を求める。
〇解答
SELECT name, capital FROM world
-- 国名と首都の文字列長が同じ
WHERE LEN(name) = LEN(capital)
〇解説
LENGTH関数を用いてクエリを作成すると、以下のようなエラーが表示されました。
'LENGTH' is not a recognized built-in function name.
調べたところ、LENGTH関数が使用できないデータベースがあるようです。
使用できる関数 | 使用可能なデータベース |
---|---|
LEN | Access |
LEN | SQL Server |
LENGTH | Oracle |
CHAR_LENGTH、CHARACTER_LENGTH | MySQL |
LENGTH、CHAR_LENGTH、CHARACTER_LENGTH | PostgreSQL |
問題12
〇問題文
スウェーデン Sweden の首都はストックホルム Stockholm 。どちらもSから始まる。
国名と首都の先頭の文字が同じである国の、国名と首都名を表示する。
ただし、国名と首都名が同じ場合は除く。
文字列の先頭一文字を切り取るには、LEFTを使う。
〇解答
SELECT name, capital FROM world
-- 国名と首都名の頭文字が同じ
WHERE LEFT(name, 1) = LEFT(capital, 1)
-- 国名と首都名が同じ場合、排除
AND name <> capital;
〇解説
LEFT関数とは、引数に指定した文字列の左端から指定した文字数分だけを抽出することが
できる関数です。
LEFT関数の書き方
LEFT(文字列, 文字列から抽出したい文字数)
問題13
〇問題文
Equatorial Guinea (エクアトリアル ギニア)と Dominican Republic(ドミニカ共和国)はどちらも全ての母音(a e i o u)を国名に含んでいる。
これらの国は、名前に単語が2つ以上あるので以下の対象としない。
国名に全ての母音を含む国で、空白を含まない単語1つの国名を検索する。
〇解答
SELECT name FROM world
-- 母音を含む国名を指定
WHERE name LIKE '%a%'
AND name LIKE '%e%'
AND name LIKE '%i%'
AND name LIKE '%o%'
AND name LIKE '%u%'
-- 空白がない国名を指定
AND name NOT LIKE '% %';
〇補足
以下のクエリも試してみましたが、正解ではありませんでした。
SELECT name FROM world
WHERE name IN ('%a%', '%i%', '%u%', '%e%', '%o%')
AND name NOT LIKE '% %';
その他
引用元:
・SELECT from WORLD Tutorial
・ROUND関数
・LENGTH関数
・LEFT関数
Discussion