SQLのMIN、テーブルなしでも出せる

  • SQL
  • Database

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

SELECTだけでMINは出る

MINは集約関数なので、FROMもWHEREもGROUP BYも必須じゃない。

SELECT MIN(column_name) AS min_value
FROM table_name;

WHEREつけたら条件付きの最小値、GROUP BYつけたらグループごとの最小値になるだけで、どっちも任意。

テーブルなし・数値だけで最小値を出したい場合

テーブルを用意せず、リテラルの数値からいきなり最小値を求めたいときはMINの複数引数渡しはできない。

SELECT MIN(10, 3, 7); -- これはエラー

MINは列を1つ受け取る集約関数なので、複数の値を並べて渡す使い方には対応してない。代わりに使えるのはこのあたり。

SELECT LEAST(10, 3, 7, 5) AS min_value;

LEASTは多くのDBで使える(MySQLでも動く)。もう一つの方法はVALUESでその場にテーブルっぽいものを作って集約する形。

SELECT MIN(x)
FROM (VALUES (10), (3), (7), (5)) AS t(x);

どっちも妥当な書き方で、好みで選べばよさそう。

NULLが混ざるとどうなるか

VALUESのリストにNULLを混ぜてみた。

SELECT MIN(x)
FROM (VALUES (10), (3), (7), (5), (NULL)) AS t(x);

結果は3。MINはNULLを自動で無視するので、NULLが混ざっててもそのまま無視して残りから最小値を出してくれる。

じゃあ全部NULLだったらどうなるかというと、これも試した。

SELECT MIN(x)
FROM (VALUES (NULL), (NULL)) AS t(x);

結果はNULL。無視する対象しかなければ結果もNULLになる、という素直な挙動。

NULLを明示的に除外したいならWHERE x IS NOT NULLでも同じ結果になる。逆にNULLを何かの値として扱いたいならCOALESCEで置き換えてから集約する手もある。

SELECT MIN(COALESCE(x, 999999))
FROM (VALUES (10), (3), (NULL)) AS t(x);

NULLを「最大値扱い」にしたいか「最小値扱い」にしたいかで、COALESCEに渡す代替値の符号を変えればいい。