SELECT within SELECT Tutorial/ja

From SQLZoo
Language:Project:Language policy English  • 日本語 • 中文

このチュートリアルで、より複雑なクエリ―を実行するために SELECT 文の中で SELECT 文を利用する方法を示す。

name 国名continent 大陸area 面積 population 人口gdp 国内総生産
AfghanistanAsia6522302550010020343000000
AlbaniaEurope28748 2831741 12960000000
AlgeriaAfrica2381741 37100000 188681000000
AndorraEurope46878115 3712000000
AngolaAfrica1246700 20609294 100990000000
...

SELECTをネスト(入れ子)にして使うには

サマリー

ロシアより大きい

ロシア(Russia)よりも人口(population)が多い国の名前を表示する

world(name 国名, continent 大陸, area 面積, population 人口, gdp 国内総生産)


SELECT name FROM world
  WHERE population >
     (SELECT population FROM world
      WHERE name='Romania')
SELECT name FROM world
  WHERE population >
     (SELECT population FROM world
      WHERE name='Russia')

{{#ev:youtube|UPFwlsJFcsw}}

イギリスより豊か

国民一人当たりの国内総生産がイギリス 'United Kingdom' よりも大きなヨーロッパ(Europe)の国を表示する。

国内総生産の式は gdp/population
SELECT name FROM world
  WHERE continent='Europe' AND gdp/population >
     (SELECT gdp/population FROM world
      WHERE name='United Kingdom')

{{#ev:youtube|RELAqb4DlvY}}

アルゼンチンとオーストラリアの近所

'Argentina'または'Australia'を含む大陸にある国の、国名と大陸を表示する。国名順に表示する。

SELECT name,continent
FROM world
WHERE continent IN (
  SELECT continent
  FROM world
  WHERE name IN ('Australia','Argentina'))
ORDER BY name

カナダとポーランドの間

人口がカナダ Canadaよりも多く、ポーランドPolandよりも少ない国の、国名と人口を表示する。

SELECT name,population FROM world
WHERE population BETWEEN
(SELECT population+1 FROM world WHERE name='Canada')
AND
(SELECT population-1 FROM world WHERE name='Poland')

ドイツのパーセント

ドイツは(人口 80000000人)とヨーロッパで最大の人口の国である。オーストリア(人口8500000人)はドイツの人口の11%である。

ヨーロッパの各国について 国名と人口を表示する。ドイツ人口の何%かで表示する。

ROUND関数で小数点以下を除去できる。
CONCAT関数で記号を付け加えられる。
SELECT name,
   CONCAT(ROUND(100*population/(SELECT population FROM world WHERE name='Germany')),'%')
FROM world
WHERE continent='Europe'

{{#ev:youtube|lCbLvHUNBG4}}


SQLのより多彩で重要な表示機能について、次のチュートリアルの集約関数を確認すること。

言語の詳細な機能をとても詳しく知るには、読んでみてください。

キーワード ALL で大小記号 >= > < <= をリストの全ての要素に対して適用できる。 例えば、人口が最大の国を見つけるクエリーは:

SELECT name
  FROM world
 WHERE population >= ALL(SELECT population
                           FROM world
                          WHERE population>0)

サブクエリー中の条件式 population>0 は一部の国の人口が null である場合に必要な処理である。

ヨーロッパで最大の国

ヨーロッパのどの国のGDPよりも大きなGDPを持つ国の国名だけを表示する。(GDPがNULL の国も有る)

SELECT name FROM world 
  WHERE gdp > ALL
   (SELECT gdp FROM world
    WHERE continent = 'Europe' 
      AND gdp IS NOT NULL)

外側の SELECT 文の値を、内側の SELECT で参照できる。内と外のテーブルを、各テーブルに名前を付けて区別する。

各大陸で最大

各大陸のもっとも大きな国(面積で)の大陸、国名、面積を表示する。:

SELECT continent, name, population FROM world x
  WHERE population >= ALL
    (SELECT population FROM world y
        WHERE y.continent=x.continent
          AND population>0)
SELECT continent, name, area 
 FROM world x
  WHERE area >= ALL
    (SELECT area FROM world y
        WHERE y.continent=x.continent
         and area > 0 )

自己相関クエリー というテクニックを利用して解きます。

相関サブクエリーの2重ループの様に機能する: 内側のサブクエリーは一度に1行ずつ外側のクエリーの関連するレコードにアクセスする。内と外で同じ名前のテーブルを区別するテクニックとして、外側のクエリーのテーブルと内側のサブクエリーのテーブルの名前を付け替える(訳注:この例では 外側の world を x とし、内側の world を y として、y.continent=x.continent で外側でアクセスしているx.continentの値と同じy.continentのレコードを内側のサブクエリーで処理する。)。

WHERE 節の2つのテーブルへの参照の解釈は、”関連する値が同じである”と考える。

ここの例は、“大陸が同じ各国の人口と比べてより大きいか等しいような人口を持つ国をworldから選ぶ”となる。

各大陸で先頭の国(アルファベット順)

各大陸の中でアルファベット順で先頭になる国の大陸と国名を表示する。

SELECT continent,name FROM world x
  WHERE x.name <= ALL (
    SELECT name FROM world y
     WHERE x.continent=y.continent)

これまでにないテクニックを駆使する難問

大陸に属する各国の人口が全て25000000以下である大陸を見つけ、それらの大陸に属する国の名前と大陸と人口を表示。

SELECT name,continent,population FROM world x
  WHERE 25000000 >= ALL (
    SELECT population FROM world y
     WHERE x.continent=y.continent
       AND y.population>0)

これまでにないテクニックを駆使する難問

同じ大陸にある他の全ての国よりも3倍は大きな人口の国の、国名と大陸を表示する。

SELECT name, continent FROM world x WHERE
 population > ALL
 (SELECT population*3 FROM world y
 WHERE y.continent = x.continent
 AND y.name != x.name)