取得するデータの順番を制御したり、件数を絞り込んだりする方法を学びましょう!
データベースから取得したデータをそのまま表示すると、順番がバラバラだったり、件数が多すぎたりすることがありますよね?
ORDER BY句を使えば、特定のカラムの値に基づいて結果を並び替えることができます。また、LIMIT句やOFFSET句を使えば、表示する件数や開始位置を指定できます。
これらを使いこなすことで、ランキング表示やページネーション(ページ送り機能)などを実装できるようになります。さっそく見ていきましょう!
ORDER BY句: 結果の並び替え
ORDER BY句は、SELECT文の最後に記述し、どのカラムを基準に、どのように並び替えるかを指定します。
基本的な使い方 (昇順・降順)
デフォルトでは昇順 (ASC: Ascending) で並び替えられます。明示的にASCを指定することも可能です。
降順 (DESC: Descending) で並び替えたい場合は、カラム名の後にDESCを指定します。
SELECT *
FROM employees
ORDER BY salary DESC;
SELECT name, price
FROM products
ORDER BY name ASC; -- ASCは省略可能
複数カラムでの並び替え
複数のカラムを基準に並び替えたい場合は、ORDER BY句にカラム名をカンマ (,) で区切って指定します。先に指定したカラムが優先されます。
各カラムに対して個別にASCまたはDESCを指定できます。
SELECT employee_id, name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary 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句がある場合はそのさらに後)。
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 5;
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 ..., ... の形式も可)。
-- PostgreSQL / MySQL の一般的な書き方
SELECT title, published_date
FROM articles
ORDER BY published_date DESC
LIMIT 10 OFFSET 10;
-- MySQL 独自の省略記法 (LIMIT オフセット, 件数)
SELECT title, published_date
FROM articles
ORDER BY published_date DESC
LIMIT 10, 10; -- 10件スキップして10件取得
ページネーションの実装例
例えば、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 の詳細)