最終更新日時:

データベースの並べ替え表示!

メイン画像

経緯

私はデータベース(以下DB)を活用しようと頑張っていることろである。
そこで私は 家の家計簿を記録できるサイト をローカルで立ち上げて、家族の役に大いに役に立っている(ドヤァ)
親がWindows Vistaで家計簿をとっているからである(もう一つはxp)

そのため絶賛家計簿用DBを組み立てている最中である。
そこで家計簿で欠かせない機能の一つとして「表の並べ替え」、いわゆる ソート 機能を付けることは言うまでもない。

家計簿サイト画像

このサイトの概要

ということで、今回はDBで使用する SQL文のソート方法 そして 日本語におけるソート方法 を考えてみました!

SQL文でのソート方法

ソート方法...といってもSQL文にはソートするコマンドがあります。
それが ORDER BY になります。
IT系資格の 基本情報技術者試験 にも出題される一般的なSQL文です。知らなかった方は覚えときましょう。(私が受けたR7年度の話)
使い方は簡単です。

sql
SELECT (列名) FROM (テーブル名) ... ORDER BY (列名) (ASC/DESC);
になります。
最後の(ASC/DESC)とは、並べ方のことです。
sql
ASC --昇順(小さい値から大きい値) DESC --降順(大さい値から小きい値)
例えば、「kakeibo」というテーブルの中の「date(購入日)」「item(商品)」を取り出し、「amount(金額)」の高い順に並べたいと思ったらこのようになります。
sql
SELECT date,id FROM kakeibo ORDER BY amount DESC;
というわけですね。

ということでここまではただのSQL文の紹介ですね。
このORDER BYを使ったソートは どんな型でも 比較することができるのでしょうか?見ていきましょう。

どんな型でも思い通りにソートできるのか

数値(INT,SMALLINT,BIGINT,FLOAT,DOUBLE,DECIMAL型)

さっきの例の通りですね。
当然余裕です 言うまでもない

真偽値(BOOLEAN型)

trueとfalseの2つの状態のみを持つbooleanですが...
ソートできます!
false = 0、true = 1という形で昇順、降順にソートできます
これをORDER BYを使って比較する方がおかしいと思いますがw

日付値・時刻値(DATE,TIME,TIMESTAMP型)

2026-03-23(date型)や01:10:30(time型)などとありますが、いったいどうなのでしょうか。
ソートできます!
日付・時刻が古いほうが小さく、未来のほうが大きい扱いでソートされます
0001-01-01が最も小さく9999-12-31が最も大きい値としてソートされます。

列挙型(ENUM型)

ここからがDBのマイナー型になるのでは、と勝手に思ってる
'XS','S','M','L','XL','XXL'などと、事前に定義した文字列のリストの中から一つを格納できるenum型ですが...
ソートできます!
enum型では「定義順」がベースで、先に定義した物が小さい値、後に定義したものが大きい値扱いでソートされます
例で、「XS」「S」「M」「L」「XL」「XXL」の順に定義すると、
ASCでサイズ小さい順、DESCでサイズ大きい順
ということができてしまうんですね~最高。
一見マイナーっぽい型だけど、ソートの観点で見るとすごく大切な型だということが分かると思います

バイナリ型(BINARY,VARBINARY型)

データをバイト列で保存するbinary型ですがこれは...
ソートできます!が...
比べる意味はない!
バイナリの数値の大きさでソートできるDBもありますが、そもそもデータ(画像や音声)なので比較しても意味がないです

配列型(INTGER[]型など)

数字ですが今度は配列。配列全体の大小でソートしたいときもあるかもしれませんが...
ソートできない!
配列などの複数データは比較できません!

JSON型

ソートできない!
構造物は比較できません!

文字列型(CHAR,VARCHAR,TEXT型)

おそらくDBでは最も使うであろう文字列型ですが...
ソートできます!
が、問題は ソートのされ方 にあります。
・大文字のみor小文字のみ...A~Z or a~zの順でアルファベット順にソート
・大小混合...コレーションによる
・ひらがなのみorカタカナのみ...あ~んorア~ンで50音順にソート
・ひらカタ混合...コレーションによる
・漢字...順序バラバラ(実質的ソート不可)
となります。
一般的にはアルファベット順or50音順に並び替えたいところですが、特に日本語ではそうはいかないようです

コレーションというのは、ソートをする上でのルールを指定するものです。
使い方としてはORDER BY文やWHERE文に続いてCOLLATE文を書くそうです(書いたことない)

sql
SELECT ... FROM ... ORDER BY ... COLLATE (照合順序) DESC;
ひらがなやカタカナをソートする場合は照合順序を日本語ルールで明示した方が良いです。
私が使ってるpostgresqlはOSや環境でコレーションが変わるので、確認してください。

日本語のソート方法

上にある通り、文字列型で日本語を50音順で表示させるのは難しいです
ひらがなカタカナ混合だと分離してしまいますし、ましてや漢字に関してはバラバラで実質ソートできていません。
混合したものを50音順にソートするにはどうしたらいいのでしょうか
今年19になるかけだしプログラマーなりに考えてみました。

私の考え方

ひらがなのみであればUnicode的に正しくソートできることから、カタカナと漢字を何とかひらがなに変えて ふりがなでソートする という、いたって普通な考え方が思い浮かびました。
再現できるのでしょうか?
AIの回答: ライブラリやAPIを使って変換可能
とのことです。見てみましょう。

Python
# MeCabを使用したふりがな変換 import MeCab tagger = MeCab.Tagger("-Ochasen") def to_katakana(text): result = tagger.parse(text) reading = "" for line in result.splitlines(): parts = line.split("\t") if len(parts) >= 4: reading += parts[3] return reading
引数に漢字のテキストを入れるとフリガナで帰ってくるとのこと。
そのままORDER BYでソートすればソートできそうです。

最適解(AI)

最適解は「ふりがな(読み)を別カラムで持ち、それを基準にソート」+「日本語コレーション補助」です。

あら、同じらしい。

まとめ

  • SQL文でのソート方法はORDER BY文
  • 照合順序を明示したい場合はCOLLATE文を入れる
  • 日本語をできるだけ正しくソートしたいときはフリガナに直す
  • 直し方は手動入力orライブラリやAPIを使って自動変換

おわりぃ