MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで特定の範囲の行を取得する方法|LIMITとOFFSETの使い方を解説

MySQLでは、ORDER BY句とLIMIT句、OFFSET句を組み合わせることで、テーブル内の任意の範囲にある行だけを柔軟に取得できます。本記事では、サンプルテーブルを作成しながら、Idの降順に並べ替えたデータから「途中の行をスキップして指定件数だけ取得する」方法を具体的なSQLと実行結果つきで解説します。

1. サンプルテーブルの作成

まず、以下のSQLを実行してテーブルを作成します。Id列は自動採番(AUTO_INCREMENT)される主キーとして定義しています。

mysql> create table DemoTable
    (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName varchar(20)
    );
Query OK, 0 rows affected (1.23 sec)

2. レコードの挿入

続いて、INSERT文を使って9件の学生名を登録します。

mysql> insert into DemoTable(StudentName) values('John');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable(StudentName) values('Carol');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(StudentName) values('David');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(StudentName) values('Bob');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('Robert');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName) values('Adam');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentName) values('Mike');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('Sam');
Query OK, 1 row affected (0.16 sec)

3. 全レコードの確認

SELECT文を実行して、テーブルに登録されたすべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

出力結果

+----+-------------+
| Id | StudentName |
+----+-------------+
| 1  | John        |
| 2  | Carol       |
| 3  | David       |
| 4  | Bob         |
| 5  | Chris       |
| 6  | Robert      |
| 7  | Adam        |
| 8  | Mike        |
| 9  | Sam         |
+----+-------------+
9 rows in set (0.00 sec)

このように、Idが1〜9まで連番で振られた9件のデータが格納されています。

4. 特定の範囲の行を選択するクエリ

ここが本題のポイントです。次のクエリでは、ORDER BY Id DESCでIdの降順に並べ替えたうえで、LIMIT 4 OFFSET 2を指定することで、「先頭の2行をスキップし、そこから4行分」を取得しています。

mysql> select *from DemoTable ORDER BY Id DESC LIMIT 4 OFFSET 2;

出力結果

+----+-------------+
| Id | StudentName |
+----+-------------+
| 7  | Adam        |
| 6  | Robert      |
| 5  | Chris       |
| 4  | Bob         |
+----+-------------+
4 rows in set (0.00 sec)

5. LIMITとOFFSETの動作を解説

結果を見ると、Idの降順(9 → 8 → 7 → …)に並んだうち、先頭の「Id=9」「Id=8」の2行がOFFSET 2によって除外され、その次の4行(Id=7、6、5、4)だけが返されていることがわかります。

  • ORDER BY Id DESC: Idの大きい順(降順)に並べ替えます。
  • LIMIT 4: 取得する最大行数を4行に制限します。
  • OFFSET 2: 先頭から2行を読み飛ばしてから取得を開始します。

この組み合わせは、ページネーション(ページ送り)機能の実装などでも頻繁に使われるテクニックです。「何ページ目か × 1ページあたりの件数」をOFFSETに指定すれば、任意のページのデータだけを効率よく取り出せます。ぜひ実際の開発でも活用してみてください。

  1. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected

  2. MySQLのCONCAT_WS()関数で文字列を連結しながら条件に一致する行を抽出する方法

    MySQLのCONCAT_WS()関数とはMySQLでは、CONCAT_WS()関数を使用することで、複数のカラムや値を指定した区切り文字で連結できます。さらにWHERE句と組み合わせれば、条件に一致する行だけを抽出しながら、読みやすい形式の文字列として出力することも可能です。この記事では、実際にテーブルを作成し、CONCAT_WS()と条件指定を組み合わせたクエリの実行例を順番に解説します。サンプルテーブルの作成まず、ユーザー情報を格納するテーブル「demo38」を作成しましょう。mysql> create table demo38-> (-> user_id int,-&