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

MySQLで最初と最後のデータ行を取得する方法|MIN()・MAX()を使った実践テクニック

MySQLでは、MIN()関数MAX()関数を組み合わせることで、テーブル内の最初と最後のデータ行を簡単に取得できます。これらの関数は指定したカラムの最小値・最大値を返すため、AUTO_INCREMENTで採番されるIDカラムなどに対して適用すれば、先頭行と最終行を正確に特定できるのです。

基本構文

最初の行と最後の行を同時に取得するための基本的な構文は以下の通りです。

SELECT *
FROM yourTableName
WHERE yourColumnName = (SELECT MIN(yourColumnName) FROM yourTableName)
UNION
SELECT *
FROM yourTableName
WHERE yourColumnName = (SELECT MAX(yourColumnName) FROM yourTableName) ;

このクエリの仕組みを整理すると、次のようになります。

  • サブクエリの MIN() でカラムの最小値を取得し、その値に一致する行(最初の行)を抽出します。
  • 同じく MAX() で最大値に一致する行(最後の行)を抽出します。
  • UNION によって2つの結果セットを結合し、1つの結果として表示します。

なお、UNION は重複行を自動的に除外するため、テーブルに1行しか存在しない場合でも重複表示されることはありません。

検証用テーブルの作成

実際に動きを確認するために、まずサンプル用のテーブルを作成しましょう。

mysql> create table FirstAndLastDataDemo
    -> (
    -> EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> EmployeeName varchar(20),
    -> EmployeeAge int
    -> );
Query OK, 0 rows affected (0.59 sec)

このテーブルは、従業員ID(EmployeeId)、氏名(EmployeeName)、年齢(EmployeeAge)の3つのカラムを持つ構成です。

サンプルデータの挿入

続いて、INSERTコマンドを使って複数のレコードを登録します。

mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('John',23);
Query OK, 1 row affected (0.15 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Bob',13);
Query OK, 1 row affected (0.11 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Larry',24);
Query OK, 1 row affected (0.14 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Sam',14);
Query OK, 1 row affected (0.18 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Mike',31);
Query OK, 1 row affected (0.10 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('James',18);
Query OK, 1 row affected (0.16 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Maxwell',28);
Query OK, 1 row affected (0.17 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('David',27);
Query OK, 1 row affected (0.12 sec)
mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values('Chris',22);
Query OK, 1 row affected (0.19 sec)

SELECT文ですべてのレコードを表示し、登録内容を確認してみます。

mysql> select *from FirstAndLastDataDemo;

出力結果

+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
|          1 | John         |          23 |
|          2 | Bob          |          13 |
|          3 | Larry        |          24 |
|          4 | Sam          |          14 |
|          5 | Mike         |          31 |
|          6 | James        |          18 |
|          7 | Maxwell      |          28 |
|          8 | David        |          27 |
|          9 | Chris        |          22 |
+------------+--------------+-------------+
9 rows in set (0.00 sec)

合計9件のレコードが登録されました。ここから、最初の行(EmployeeId=1)と最後の行(EmployeeId=9)だけを取り出していきます。

最初と最後の行を取得するクエリの実行

冒頭で紹介した構文に当てはめて実行すると、次のようになります。

mysql> SELECT *
-> FROM FirstAndLastDataDemo
-> WHERE EmployeeId = (SELECT MIN(EmployeeId) FROM FirstAndLastDataDemo)
-> UNION
-> SELECT *
-> FROM FirstAndLastDataDemo
-> WHERE EmployeeId = (SELECT MAX(EmployeeId) FROM FirstAndLastDataDemo);

出力結果

+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
|          1 | John         |          23 |
|          9 | Chris        |          22 |
+------------+--------------+-------------+
2 rows in set (0.00 sec)

実行結果を見ると、EmployeeIdが最小値「1」であるJohn(最初の行)と、最大値「9」であるChris(最後の行)の2件だけが正しく抽出されていることがわかります。

代替手法:ORDER BYとLIMITを組み合わせる方法

IDカラムが連番になっていない場合や、別の基準で先頭・末尾を決めたい場合は、ORDER BYLIMIT を使う方法も有効です。

(SELECT * FROM FirstAndLastDataDemo ORDER BY EmployeeId ASC LIMIT 1)
UNION ALL
(SELECT * FROM FirstAndLastDataDemo ORDER BY EmployeeId DESC LIMIT 1);

昇順ソートの先頭1件と降順ソートの先頭1件を UNION ALL で結合することで、同様の結果が得られます。UNION の代わりに UNION ALL を使えば重複チェック処理が不要になるため、大規模なテーブルではパフォーマンス面で有利になるケースもあります。

まとめ

  • MIN() / MAX() + サブクエリ + UNION:IDの最小値・最大値に一致する行を取得する定番のアプローチ。
  • ORDER BY + LIMIT + UNION ALL:ソート基準を柔軟に指定でき、大量データでも高速に動作しやすい方法。

用途やテーブル構造に応じて使い分けることで、MySQLにおける「最初と最後の行」の取得を効率的かつ確実に行えます。

  1. 複数テーブルのデータを組み合わせてMySQLビューを作成する方法(UNION演算子の活用)

    MySQLでは、UNION演算子を使うことで、2つ以上のSELECT文の結果セットを1つに結合できます。この特性を利用すれば、複数のテーブルから取得したデータをまとめたビュー(VIEW)を簡単に作成できます。ここでは、以下のような2つの基本テーブル「Student_info」と「Student_detail」を例に説明します。サンプルテーブル:Student_infomysql> Select * from Student_info; +------+---------+------------+------------+ | id | Name | Address |

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

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