[SQLのはじめ方] Part7: ORDER BYとLIMIT・OFFSETによる並び替え

SQL

取得するデータの順番を制御したり、件数を絞り込んだりする方法を学びましょう!

データベースから取得したデータをそのまま表示すると、順番がバラバラだったり、件数が多すぎたりすることがありますよね?🤔

ORDER BY句を使えば、特定のカラムの値に基づいて結果を並び替えることができます。また、LIMIT句やOFFSET句を使えば、表示する件数や開始位置を指定できます。

これらを使いこなすことで、ランキング表示やページネーション(ページ送り機能)などを実装できるようになります。さっそく見ていきましょう!🚀

ORDER BY句: 結果の並び替え 👇

ORDER BY句は、SELECT文の最後に記述し、どのカラムを基準に、どのように並び替えるかを指定します。

基本的な使い方 (昇順・降順)

デフォルトでは昇順 (ASC: Ascending) で並び替えられます。明示的にASCを指定することも可能です。

降順 (DESC: Descending) で並び替えたい場合は、カラム名の後にDESCを指定します。

例: employeesテーブルから、従業員を給料 (salary) が高い順に並び替えて全カラムを取得する

SELECT *
FROM employees
ORDER BY salary DESC;

例: productsテーブルから、商品を名前 (name) のアルファベット順(昇順)に並び替えて名前と価格 (price) を取得する

SELECT name, price
FROM products
ORDER BY name ASC; -- ASCは省略可能

複数カラムでの並び替え

複数のカラムを基準に並び替えたい場合は、ORDER BY句にカラム名をカンマ (,) で区切って指定します。先に指定したカラムが優先されます。

各カラムに対して個別にASCまたはDESCを指定できます。

例: employeesテーブルから、部署ID (department_id) で昇順に並び替え、同じ部署内では給料 (salary) が高い順(降順)に並び替える

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 FIRSTNULLS LASTを指定して、NULLを先頭または末尾のどちらに配置するかを明示的に制御できます。

使用しているデータベースのマニュアルを確認することをお勧めします。💡

LIMIT句: 取得件数の制限 ✂️

LIMIT句は、取得するレコード(行)の最大数を指定します。大量のデータの中から上位N件だけを取得したい場合などに便利です。

通常、ORDER BY句と組み合わせて使用し、「特定の順序で並び替えた後の上位N件」を取得します。

LIMIT句はSELECT文の最後に記述します(ORDER BY句がある場合はそのさらに後)。

例: productsテーブルから、価格 (price) が高い順に上位5件の商品名と価格を取得する

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 ..., ... の形式も可)。

例: articlesテーブルから、公開日 (published_date) が新しい順に並び替え、最初の10件をスキップして、次の10件(つまり11件目から20件目)を取得する(2ページ目に相当)

-- 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

このようにLIMITOFFSETを組み合わせることで、大量の結果を分割して表示できます。✨

まとめ 🎉

今回は、SQLで検索結果を並び替えたり、取得件数を制限したりする方法を学びました。

  • ORDER BY カラム名 [ASC|DESC], ...: 結果を指定したカラムで昇順 (ASC) または降順 (DESC) に並び替えます。
  • LIMIT 件数: 取得するレコードの最大数を指定します。
  • OFFSET スキップ数: 取得を開始する位置を指定します (先頭から何件スキップするか)。

これらを組み合わせることで、より見やすく、扱いやすい形でデータを取得できるようになります。

特に、ランキング表示やページネーションなど、Webアプリケーションでよく見られる機能の実装に不可欠な知識です。しっかりマスターしておきましょう!💪

次は「LIKE, BETWEEN, INによる検索」について学びます。お楽しみに!

参考情報

コメント

タイトルとURLをコピーしました