取得するデータの順番を制御したり、件数を絞り込んだりする方法を学びましょう!
データベースから取得したデータをそのまま表示すると、順番がバラバラだったり、件数が多すぎたりすることがありますよね?
ORDER BY
句を使えば、特定のカラムの値に基づいて結果を並び替えることができます。また、LIMIT
句やOFFSET
句を使えば、表示する件数や開始位置を指定できます。
これらを使いこなすことで、ランキング表示やページネーション(ページ送り機能)などを実装できるようになります。さっそく見ていきましょう!
ORDER BY句: 結果の並び替え
ORDER BY
句は、SELECT
文の最後に記述し、どのカラムを基準に、どのように並び替えるかを指定します。
基本的な使い方 (昇順・降順)
デフォルトでは昇順 (ASC: Ascending) で並び替えられます。明示的にASC
を指定することも可能です。
降順 (DESC: Descending) で並び替えたい場合は、カラム名の後にDESC
を指定します。
複数カラムでの並び替え
複数のカラムを基準に並び替えたい場合は、ORDER BY
句にカラム名をカンマ (,
) で区切って指定します。先に指定したカラムが優先されます。
各カラムに対して個別にASC
またはDESC
を指定できます。
NULLの扱い
ORDER BY
で指定したカラムにNULL
が含まれる場合、その扱いはデータベース製品によって異なることがあります。
- MySQLでは、昇順 (
ASC
) の場合はNULL
が先頭に、降順 (DESC
) の場合はNULL
が末尾に来るのがデフォルトです。 - PostgreSQLやOracleでは、
NULLS FIRST
やNULLS LAST
を指定して、NULL
を先頭または末尾のどちらに配置するかを明示的に制御できます。
使用しているデータベースのマニュアルを確認することをお勧めします。
LIMIT句: 取得件数の制限
LIMIT
句は、取得するレコード(行)の最大数を指定します。大量のデータの中から上位N件だけを取得したい場合などに便利です。
通常、ORDER BY
句と組み合わせて使用し、「特定の順序で並び替えた後の上位N件」を取得します。
LIMIT
句はSELECT
文の最後に記述します(ORDER BY
句がある場合はそのさらに後)。
LIMIT
の構文はデータベース製品によって異なる場合があります。例えば、SQL ServerではTOP
句、OracleではFETCH FIRST N ROWS ONLY
句が使われます。ここでは標準SQLやMySQL/PostgreSQLで一般的なLIMIT
を紹介しています。
OFFSET句: 開始位置の指定
OFFSET
句は、取得を開始するレコードの位置を指定します。先頭から何件スキップして取得を開始するかを指定するイメージです。
OFFSET
句は通常、LIMIT
句と組み合わせて使用され、ページネーション(例: 検索結果の2ページ目を表示する)の実装によく使われます。
OFFSET
句はLIMIT
句の前に記述することが多いですが、順序はデータベース製品によって異なる場合もあります(例: PostgreSQLでは LIMIT ... OFFSET ...
、MySQLでは LIMIT ... OFFSET ...
または LIMIT ..., ...
の形式も可)。
ページネーションの実装例
例えば、1ページあたり20件表示する場合:
- 1ページ目:
LIMIT 20 OFFSET 0
(またはLIMIT 20
) - 2ページ目:
LIMIT 20 OFFSET 20
- 3ページ目:
LIMIT 20 OFFSET 40
- …
- Nページ目:
LIMIT 20 OFFSET (N-1) * 20
このようにLIMIT
とOFFSET
を組み合わせることで、大量の結果を分割して表示できます。
まとめ
今回は、SQLで検索結果を並び替えたり、取得件数を制限したりする方法を学びました。
ORDER BY カラム名 [ASC|DESC], ...
: 結果を指定したカラムで昇順 (ASC
) または降順 (DESC
) に並び替えます。LIMIT 件数
: 取得するレコードの最大数を指定します。OFFSET スキップ数
: 取得を開始する位置を指定します (先頭から何件スキップするか)。
これらを組み合わせることで、より見やすく、扱いやすい形でデータを取得できるようになります。
特に、ランキング表示やページネーションなど、Webアプリケーションでよく見られる機能の実装に不可欠な知識です。しっかりマスターしておきましょう!
次は「LIKE, BETWEEN, INによる検索」について学びます。お楽しみに!
参考情報
- MySQL 8.0 リファレンスマニュアル – SELECT ステートメント: https://dev.mysql.com/doc/refman/8.0/ja/select.html (ORDER BY, LIMIT の詳細)
- PostgreSQL 16 ドキュメント – 問い合わせ: https://www.postgresql.jp/document/16/html/queries-order.html (ORDER BY, LIMIT, OFFSET の詳細)