

SQLのMIN、テーブルなしでも出せる
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
SELECTだけでMINは出る
MINは集約関数なので、FROMもWHEREもGROUP BYも必須じゃない。
SELECT MIN(column_name) AS min_valueFROM 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に渡す代替値の符号を変えればいい。