MySQLで最大値の行を取得する方法

SQLでは様々な記述が可能で、最大値を持っている行を求める記述方法もいくつかあります。MySQLとSQLiteで記述する例を紹介します。

データ

次のようなテーブルとデータがあるとします。

データ例

allを使う方法(MySQL)

最大値を含む行

“all”キーワードを使うと簡単に最大値を含む行を取得することが出来ます。

select *
from 社員売上実績
where 売上 >= all 
	(select 売上 from 社員売上実績 )

検索結果1

最小値を含む行

不等号の向きを返れば最小値を含む行を取得することが出来ます。

select *
from 社員売上実績
where 売上 <= all 
	(select 売上 from 社員売上実績 )

結果行をマスタテーブルと結合

最大の売上をした社員の名前を取得するには、上記で得られた結果行をマスターテーブルと結合します。

select 名前, 売上, 売上日 
from 社員マスター M,
	(select *
	from 社員売上実績 A
	where 売上 >= all 
		(select 売上 from 社員売上実績 B )) R
where M.社員ID = R.社員ID

検索結果1-2 

しかし、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になって選択されません。

not_exists

■ 2件目

2件目の売上98,000のデータは、インスタンスBに12,000, 115,000, 248,000のデータがあるので”not exists”がfalseになって選択されません。

not_exists2

■ 3件目〜5件目

上記同様にインスタンスBに売上がより大きいデータが存在するので、 “not exists”がfalseになって選択されません。

■ 6件目

6件目の売上248,800のデータは、インスタンスBに248,000より大きい売上のデータがないので”not exists”がtrueになって選択されます。

not_exists6

最終結果

インスタンスAの6件目のデータだけが選択され、結果として返されます。

結果行をマスタテーブルと結合

最大の売上をした社員の名前を取得するには、上記で得られた結果行をマスターテーブルと結合します。

select 名前, 売上, 売上日
from 社員マスター M,
	(select *
	from 社員売上実績 A
	where not exists 
		(select * from 社員売上実績 B 
			where A.売上 < b.売上)) R 
where M.社員ID = R.社員ID

検索結果1-2 

関数を使う方法(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

検索結果1-2


関連記事