16bit!

エンジニアじゃなくなっちゃった人が何かを書くブログ

【SQL】ALL, ANYの使い方

ちょっと前に書いた以下の記事について、CodeIQからフィードバックが来ました。

【SQL】COUNTが最大のものだけを抽出する - 16bit!

で、そのフィードバックでは"ALL"というキーワードを使っていたのですが、
正直そのキーワード知らなかったのでメモを兼ねてちょっと書いておきます。
なお、フィードバックをそのまま載せるとまずい気がするので、テーブルとかは適当にオリジナルです。

使い方

使い方は"{カラム名} >= ALL({サブクエリ})", ""{カラム名} >= ANY({サブクエリ})""みたいな感じです。
ALLでは、サブクエリで取れる全ての値について条件を満たす場合にtrue、
ANYでは、サブクエリで取れる値のうち、いずれか1つでも条件を満たす場合にtrueになります。

例題

seisekiテーブル

seito kamoku tokuten
鈴木くん 英語 72
鈴木くん 数学 84
鈴木くん 国語 80
鈴木くん 理科 90
鈴木くん 社会 66
山田くん 英語 50
山田くん 数学 62
山田くん 国語 70
山田くん 理科 40
山田くん 社会 55

上記のようなテーブルから、5科目の平均点が最も高い生徒を探します。

select seito, AVG(tokuten)
from seiseki
group by seito
having
  AVG(tokuten) >= ALL (select AVG(tokuten)
                       from seiseki
                       group by seito);

こんな感じ。
実質的には、

select seito, AVG(tokuten)
from seiseki
group by seito
having
  AVG(tokuten) = (select MAX(avg_tokuten)
                  from (select AVG(tokuten) as avg_tokuten
                        from seiseki
                        group by seito));

このようにgroup byしたビューからmax値を取っているのと変わらないですが、
まぁ多少見やすいかな?

記事まで書いといてなんですが、
正直知らなくても困ることはなさそう、という印象でした。


終わり。