SQLでは様々な記述が可能で、最大値を持っている行を求める記述方法もいくつかあります。MySQLとSQLiteで記述する例を紹介します。
データ
次のようなテーブルとデータがあるとします。
allを使う方法(MySQL)
最大値を含む行
“all”キーワードを使うと簡単に最大値を含む行を取得することが出来ます。
select * from 社員売上実績 where 売上 >= all (select 売上 from 社員売上実績 )
最小値を含む行
不等号の向きを返れば最小値を含む行を取得することが出来ます。
select * from 社員売上実績 where 売上 <= all (select 売上 from 社員売上実績 )
結果行をマスタテーブルと結合
最大の売上をした社員の名前を取得するには、上記で得られた結果行をマスターテーブルと結合します。
select 名前, 売上, 売上日 from 社員マスター M, (select * from 社員売上実績 A where 売上 >= all (select 売上 from 社員売上実績 B )) R where M.社員ID = R.社員ID
しかし、sqliteでは “all”キーワードは使えません。 そこで、sqliteで同じことをする場合は、次の”not exists”キーワードを使います。
not existsを使う方法(MySQL, SQLite)
existsキーワードを使うと指定表現が真になった時のデータを取得できます。そこで、その否定キーワード”not exists”を使ってどのデータよりも「売上」が大きいデータを求めます。
select * from 社員売上実績 A where not exists (select * from 社員売上実績 B where A.売上 < b.売上)
処理ロジック
上記のSQL文では、社員売上実績テーブルから全く同じデータを持つ2つのインスタンスA,Bが作成され、インスタンスAのデータが順番に調べられていきます。
■ 1件目
1件目の売上120,000のデータは、インスタンスBに売上が248,8000のデータがあるので”not exists”がfalseになって選択されません。
■ 2件目
2件目の売上98,000のデータは、インスタンスBに12,000, 115,000, 248,000のデータがあるので”not exists”がfalseになって選択されません。
■ 3件目〜5件目
上記同様にインスタンスBに売上がより大きいデータが存在するので、 “not exists”がfalseになって選択されません。
■ 6件目
6件目の売上248,800のデータは、インスタンスBに248,000より大きい売上のデータがないので”not exists”がtrueになって選択されます。
最終結果
インスタンスAの6件目のデータだけが選択され、結果として返されます。
結果行をマスタテーブルと結合
最大の売上をした社員の名前を取得するには、上記で得られた結果行をマスターテーブルと結合します。
select 名前, 売上, 売上日 from 社員マスター M, (select * from 社員売上実績 A where not exists (select * from 社員売上実績 B where A.売上 < b.売上)) R where M.社員ID = R.社員ID
関数を使う方法(MySQL, SQLite)
max()やmin()などの関数を使って検索することもできます。
最大値を含む行
max()関数を使って最大値を求め、その値の行を検索します。
select * from 社員売上実績 where 売上 = (select max(売上) from 社員売上実績)
最小値を含む行
min()関数を使って最小値を求め、その値の行を検索します。
select * from 社員売上実績 where 売上 = (select min(売上) from 社員売上実績)
結果行をマスタテーブルと結合
最大の売上をした社員の名前を取得するには、上記で得られた結果行をマスターテーブルと結合します。
select 名前, 売上, 売上日 from 社員マスター M, (select * from 社員売上実績 where 売上 = (select max(売上) from 社員売上実績)) R where M.社員ID = R.社員ID
関連記事
- 2012/06/30 mysqlで複数のテーブルを集計しつつ結合する方法