SQLスカラーサブクエリは「一途な愛」だ!たった一つの値を返す制約と美学

シーソー データベース

前回の記事で、SQLの中に別のSQLを埋め込む「副問い合わせ(サブクエリ)」を解説しました。

今回はその進化系、あるいは特化型である「スカラーサブクエリ」について話します。

「スカラー(Scalar)」

なんだか必殺技のような、あるいは物理学の難解な用語のような響きです。この名前にビビって学習を止める人がいますが、それはもったいないのでぜひ覚えちゃいましょう。

スカラーとは、「単一」という意味です。もっと平たく言えば、「たった一つ」ということです。

リストでもない。表でもない。たった一つの値だけを返す。それがスカラーサブクエリです。

定義:1行1列の「箱入り娘」

普通のSQL(SELECT文)は、結果として「表」を返します。何行もあり、何列もあるデータです。

しかし、スカラーサブクエリは違います。必ず「1行、かつ、1列」の結果を返します。

普通: 田中(25歳)、佐藤(30歳)、鈴木(20歳)…

スカラー: 「25」

Excelで言えば、範囲選択ではなく「セル1個」の状態です。 この「たった一つの値」であることが、SQLの世界では非常に強力な武器になります。

使い所:イコールの右側はこいつの指定席

なぜ「1つ」である必要があるのか。 それは、比較演算子(= , > , < など)とセットで使うためです。

思い出してください。イコールは「1対1」の比較にしか使えません。

「私の年齢」と「クラス全員の年齢リスト」をイコールで結ぶことはできません。

「私の年齢」と「平均点(1つの数字)」なら、比較できます。

つまり、WHERE 句などで = や > を使いたい場合、その相手になれるのはスカラーサブクエリだけなのです。

具体例:平均点との比較

では、実際に使ってみましょう。

「tests」テーブルから、平均点より高い点数を取った人を探します。

SELECT
    NAME,
    score
FROM
    tests
WHERE
    score > (
        SELECT
            AVG(score)
        FROM
            tests
    );

カッコの中の「SELECT AVG(score) FROM tests」。

これは、クラスの平均点という「たった一つの数字」を返します。

だから、score > 63.5 という比較が成立するのです。 また、これをSELECT句の中に書くこともできます。

「全員の点数の横に、平均点を表示したい」場合です。

SELECT name, score, (SELECT AVG(score) FROM tests) AS average FROM tests;

これも、カッコの中が「1つの値」だからこそ、列として表示できるのです。

もしカッコの中が複数行を返していたら、1行に収まりきらず、エラーになります。

事故:2つ以上返したら即死

スカラーサブクエリを使うとき、最も注意すべきは「本当に結果が1つになるか?」という点です。

もし、以下のようなSQLを書いたらどうなるか。

-- 悪い例
SELECT * 
FROM tests 
WHERE score = ( 
    SELECT score 
    FROM tests 
    WHERE score >= 80 -- 80点以上を探す!
);

カッコの中は、80点以上の点数を探しています。 もし80点以上の人が3人いたら?

結果は「80, 85, 90」というリストになります。 すると外側のSQLはパニックになります。

「えっ、イコールで比較しろって言われたけど、相手が3人もいるぞ! どれと比べればいいんだ!」

結果、データベースは無慈悲なエラーメッセージを吐きます。

Subquery returns more than 1 row

これは「約束が違うぞ」という怒りの声です。

スカラーサブクエリとして使うなら、必ず結果が1つになるように、AVG() や MAX() などの集計関数を使うか、LIMIT 1で件数を絞る必要があります。

まとめ:一途なやつしか愛せない

  • スカラー:単一の値(1行1列)。
  • 役割:イコールや不等号の相手役。
  • 注意:複数返すとエラーになる。

スカラーサブクエリは、一途な愛です。

「相手は一人だけ」という制約を守ることで、初めて成立する関係です。

浮気(複数行の返却)は許されません。

たった一つの真実だけを返す。その潔さが、複雑なデータ分析を可能にするのです。

コメント

タイトルとURLをコピーしました