頻馬主義

競馬のデータをいろいろ見ていきます

【馬王Z SQL講座】 データの並び替え

SELECT文でデータの取得

まずは前回の復習として、競走馬マスタ テーブルから

  • 血統登録番号
  • 馬名

を5行取得してみましょう。

SELECT TOP 5
    血統登録番号,
    馬名
FROM
    競走馬マスタ
;

このクエリを実行すると、下図のような結果が得られます。*1

f:id:mare_ism:20210323060855p:plain

この結果はたまたま競走馬マスタ テーブルの先頭に格納されていたデータを取得しただけなので、あまり意味がありません。

ORDER BY 句:昇順に並び替え

SELECT文で取得した結果を並び替えるには ORDER BY 句を使います。

ORDER BY 句に並び替えに使いたいカラムを書きます。

SELECT TOP 5
    血統登録番号,
    馬名
FROM
    競走馬マスタ
ORDER BY
    血統登録番号
;

このクエリを実行すると、血統登録番号が昇順(小さい順)に5件データが出力されます。*2

f:id:mare_ism:20210323061050p:plain

DESC:降順に並び替え

降順(大きい順)に並び替えたい場合は ORDER BY 句で指定したカラムの後ろに DESC を付け加えます。

SELECT TOP 5
    血統登録番号,
    馬名
FROM
    競走馬マスタ
ORDER BY
    血統登録番号 DESC
;

このクエリを実行すると、血統登録番号が降順に5件データが出力されます。

f:id:mare_ism:20210323062259p:plain

同値のデータがあった場合

競走馬マスタ テーブルから、生年月日を降順に5件取得するクエリを書いてみましょう。

SELECT TOP 5
    血統登録番号,
    馬名,
    生年月日
FROM
    競走馬マスタ
ORDER BY
    生年月日 DESC
;

このクエリを実行すると、下図のデータが出力されました。

f:id:mare_ism:20210323064328p:plain

TOP 5 と指定したはずなのに6行ありますね。何故でしょう?

生年月日が大きい方から4番目のデータは 2019/06/09 で、同じ生年月日の馬は3頭います。

このように TOP と ORDER BY を併用すると、上位n番目(nは TOP で指定した数)に同値のデータがあった場合n件より多いデータが出力されるので注意が必要です。*3

上位n番目に同値のデータがない場合

挙動を理解するために、同様の条件で上位9件取得してみましょう。

SELECT TOP 9
    血統登録番号,
    馬名,
    生年月日
FROM
    競走馬マスタ
ORDER BY
    生年月日 DESC
;

このクエリを実行すると、下図のデータが出力されました。

f:id:mare_ism:20210323065945p:plain

生年月日が 2019/06/09 のデータが3件、2019/06/06 のデータが2件ありますが、9件目には同値のデータがないので指定したとおり9件出力されています。

*1:馬王Zのデータ取得状況によっては結果が一致しないことがあります。

*2:出力結果が並び替えられているだけで、テーブル内のデータに変化はありません。

*3:MySQLなどで使える LIMIT 句とは挙動が違います。