SQL SELECT基礎(3) その場で表を作る

  • 1
    いいね
  • 0
    コメント

この記事は「SQL SELECT基礎」の第3回目です。
SQL SELECT基礎 目次
←前の記事はSQL SELECT基礎(2) スカラ値いろいろ
→次の記事はSQL SELECT基礎(4-1) 列を減らす (project 射影)

第一回で表の話をして、第二回で表の構成要素であるスカラについて解説しました。
やっと具体的な表の話になります。

※以下がわかってたらこの章は飛ばしてOK

-- このSELECT文の出力結果を説明して下さい。もちろん暗算で。
SELECT * FROM (SELECT * FROM (SELECT "Hello world") AS h1) AS h2

その場で表を作る

SELECT文は、既にある表を加工してその場で別の表を作っていく構文です。

SELECT文だけで表を作る

あまり使いみちはないのですが、SELECT文だけで即興の表を作ることができます。
前回、文字列の説明をするためにこんなSQL文を書きましたよね。

SELECT "Hello, world!"

実はこれ、1x1の表をその場で作っているのです。
カンマ「,」を挟んで複数の値を並べると、Nx1(横に長い)表になります。何個でも並べることができます。

SELECT 1,2,3,4

image.png

UNION ALLという構文を使うと、複数の横長の表をくっつけていくことができます。

SELECT 1,2,3,4
UNION ALL
SELECT 2,4,6,8
UNION ALL
SELECT 3,6,9,12

image.png

横4 x 縦3の表が作れました。簡単ですね。

ASという構文を使うと、列に名前をつけることができます。UNIONで作っている場合は2行目以降は無視されるので、つけても付けなくても構いません。

SELECT 1 AS a, 2 AS b, 3 AS c, 4 AS d
UNION ALL
SELECT 2,4,6,8
UNION ALL
SELECT 3,6,9,12

image.png

この講座では、例を表現するためにこの記法を多用します。

既に存在するテーブルから復元する

その場で表を作れても、あまり役には立ちません。
普通はデータベースに既に存在するテーブルから復元するものです。そのときに使うのがFROM句です。

例えばusersというテーブルがあったとすると、

SELECT * FROM users

とすればusersテーブルの中身を全部取ってくる意味になります。usersはダブルクォーテーションでくくっていないことに注意して下さい。テーブル名は文字列ではないので、直接書くことができます。

SELECTの後ろが突然*となっています。テーブルには既に決まった構造があるため、*と書くと、自動的にテーブルの全列を取ってきて出力する意味になります。

次回の「projection」の章で詳しく説明します。

FROMに書けるもの

FROMの後ろにはテーブル名の他に、他のSELECT文も入れ子にして書くことができます。
MySQLの場合、SELECT文の結果にもAS構文で別名を付けることができますが、FROM句に書く場合は別名をつけることが必須になっています。

SELECT * FROM (
    SELECT "Hello world"
) AS h1

入れ子を更に入れ子にすることも可能なので、こんな風にすることもできます。

SELECT * FROM (
    SELECT * FROM (
        SELECT "Hello world"
    ) AS h1
) AS h2

この例だと何も加工を施していないので、入れ子には全く意味が無いのですが、よく使いますので「この書き方が可能である」ことは覚えておきましょう。

他のプログラミング言語の素養がある方はびっくりするかもしれませんが、SELECT文には変数という概念はありません。
書きづらいと思ったらSELECT文を多段の入れ子にすることで、ちょっと読みやすくすることができます。


SQL SELECT基礎 目次
←前の記事はSQL SELECT基礎(2) スカラ値いろいろ
→次の記事はSQL SELECT基礎(4-1) 列を減らす (project 射影)