取得するデータの順番を制御したり、件数を絞り込んだりする方法を学びましょう!
データベースから取得したデータをそのまま表示すると、順番がバラバラだったり、件数が多すぎたりすることがありますよね?🤔
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 の詳細)
コメント