前回の記事で、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列)。
- 役割:イコールや不等号の相手役。
- 注意:複数返すとエラーになる。
スカラーサブクエリは、一途な愛です。
「相手は一人だけ」という制約を守ることで、初めて成立する関係です。
浮気(複数行の返却)は許されません。
たった一つの真実だけを返す。その潔さが、複雑なデータ分析を可能にするのです。


コメント