MySQLのLIMITはORDER BYの前と後、どちらに適用される?
MySQLにおけるLIMITとORDER BYの適用順序
MySQLでは、LIMITはORDER BYの後に適用されます。つまり、まず並べ替え(ソート)が実行され、その結果に対して取得件数の制限がかけられます。
ここからは、サンプルデータを使いながら実際の動作を順を追って確認していきましょう。
1. テーブルを作成する
まず、以下のクエリでテーブルを作成します。
mysql> create table LimitAfterOrderBy
−> (
−> Id int,
−> Name varchar(100)
−> );
Query OK, 0 rows affected (0.50 sec)
2. レコードを挿入する
次に、INSERTコマンドを使ってテーブルにいくつかのレコードを追加します。
mysql> insert into LimitAfterOrderBy values(101,'John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into LimitAfterOrderBy values(102,'Carol');
Query OK, 1 row affected (0.15 sec)
mysql> insert into LimitAfterOrderBy values(103,'Bob');
Query OK, 1 row affected (0.21 sec)
mysql> insert into LimitAfterOrderBy values(104,'Sam');
Query OK, 1 row affected (0.15 sec)
3. テーブルの全レコードを表示する
SELECT文でテーブル内のすべてのレコードを確認します。
mysql> select *from LimitAfterOrderBy;
実行結果は以下の通りです。
+------+-------+
| Id | Name |
+------+-------+
| 101 | John |
| 102 | Carol |
| 103 | Bob |
| 104 | Sam |
+------+-------+
4 rows in set (0.00 sec)
4. ORDER BYの後にLIMITを指定したクエリを実行する
続いて、ORDER BY句の後ろにLIMITを指定したクエリを実行してみます。
mysql> select *from LimitAfterOrderBy order by Name limit 4;
実行結果は以下の通りです。
+------+-------+
| Id | Name |
+------+-------+
| 103 | Bob |
| 102 | Carol |
| 101 | John |
| 104 | Sam |
+------+-------+
4 rows in set (0.00 sec)
まとめ
上記の実行結果を見ると、レコードがNameカラムを基準にアルファベット順(Bob → Carol → John → Sam)に並べ替えられて出力されていることがわかります。これは、MySQLのクエリ処理において先にORDER BYによるソートが行われ、その後にLIMITによって返す行数が制限されるという順序で処理されていることを示しています。
そのため、「上位N件を特定の条件で並べ替えて取得したい」といったケースでも、ORDER BYとLIMITを組み合わせることで意図した通りの結果を正しく得ることができます。
-
MySQLで最初の文字を基準にレコードを並べ替える方法(ORDER BY CASEの使い方)
MySQLで最初の文字を基準に並べ替える方法MySQLでレコードを「最初の文字」を基準に並べ替えたい場合は、ORDER BY句とCASE式を組み合わせます。ここでは、LEFT関数で先頭の1文字を取得し、CASE式で条件分岐させることで、特定の文字で始まるレコードを優先的に表示する方法を解説します。1. サンプルテーブルの作成まず、並べ替えの動作を確認するためのテーブルを作成します。mysql> create table DemoTable1535 -> ( -> Value varchar(100) -> );Query OK, 0 rows affe
-
MySQLで条件を指定して日付の期間(間・前・後)を抽出する方法
MySQLでは、WHERE句にAND条件とOR条件を組み合わせることで、「ある日付より前」かつ「別のある日付より後、またはNULL」といった複雑な条件付きの日付抽出が可能になります。退職日(relieving_date)が未設定のレコードも含めて抽出したい場合などに特に便利です。 基本の構文 条件付きで日付を選択する場合の基本的な構文は以下の通りです。 SELECT * FROM テーブル名 WHERE カラム名1 < 値1 AND (カラム名2 > 値2 OR カラム名2 IS NULL); この構文のポイントは、OR条件部分を括弧()で囲むことです。これにより、AND条件との優