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に指定すれば、任意のページのデータだけを効率よく取り出せます。ぜひ実際の開発でも活用してみてください。
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected
-
MySQLのCONCAT_WS()関数で文字列を連結しながら条件に一致する行を抽出する方法
MySQLのCONCAT_WS()関数とはMySQLでは、CONCAT_WS()関数を使用することで、複数のカラムや値を指定した区切り文字で連結できます。さらにWHERE句と組み合わせれば、条件に一致する行だけを抽出しながら、読みやすい形式の文字列として出力することも可能です。この記事では、実際にテーブルを作成し、CONCAT_WS()と条件指定を組み合わせたクエリの実行例を順番に解説します。サンプルテーブルの作成まず、ユーザー情報を格納するテーブル「demo38」を作成しましょう。mysql> create table demo38-> (-> user_id int,-&