HOWTO · MySQL

MySQL テーブルから最初の行を選択する

このチュートリアルでは、MySQL テーブルから最初の行を選択する方法について説明します。

今日は、MySQL テーブルから最初の行を選択する 3つのシナリオとその解決策について説明します。

最初のシナリオでは、特定の列に複数のインスタンスがある MySQL テーブルから最初の行を取得する方法を学習します。 たとえば、manager テーブルから first_nameMehvish である最初の行を選択します。

2 番目のシナリオでは、テーブルの各グループの最初の行を選択します。 ここでは、グループに関してデータを取得する方法についても説明します。 3 番目のシナリオでは、MySQL テーブル全体から最初の行を取得する方法を確認します。

MySQL テーブルから最初の行を選択する

コード例に入る前に、manager_idfirst_name、および last_name をフィールドとして manager_id が主キーである manager_id テーブルを作成しましょう。

このテーブルを作成および設定するためのクエリを以下に示します。 これらを使用することもできます。

コード例:

CREATE TABLE manager (
    manager_id INT NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(150) NOT NULL,
    last_name VARCHAR(150) NOT NULL,
    PRIMARY KEY(manager_id)
);

INSERT INTO manager (first_name, last_name)
VALUES
('Mehvish', 'Ashiq'),
('Saira', 'Mushtaq'),
('Thomas', 'Christopher'),
('Thomas', 'Gabrial'),
('Tahir', 'Raza'),
('Saira', 'Johny'),
('Saira', 'Daniel');

SELECT * FROM manager;

出力:

+------------+------------+-------------+
| manager_id | first_name | last_name   |
+------------+------------+-------------+
|          1 | Mehvish    | Ashiq       |
|          2 | Saira      | Mushtaq     |
|          3 | Thomas     | Christopher |
|          4 | Thomas     | Gabrial     |
|          5 | Tahir      | Raza        |
|          6 | Saira      | Johny       |
|          7 | Saira      | Daniel      |
+------------+------------+-------------+
7 rows in set (0.00 sec)

LIMIT 句を使用して、列に複数のインスタンスがある MySQL テーブルから最初の行を取得する

manager テーブルの first_name 列には、Mehvish のインスタンスが 1つ、Tahir のインスタンスが 1つ、Thomas のインスタンスが 2つ、Saira のインスタンスが 3つあります。 SELECT ステートメントを使用して、現在のテーブル データを確認できます。

次のステートメントを実行して、manager テーブルから first_nameSaira である最初の行を取得します。

クエリ:

SELECT * FROM manager WHERE first_name = 'Saira' LIMIT 1;

出力:

+------------+------------+-----------+
| manager_id | first_name | last_name |
+------------+------------+-----------+
|          2 | Saira      | Mushtaq   |
+------------+------------+-----------+
1 row in set (0.00 sec)

first_nameSaira である 3 番目のレコードを取得したいとします。 2つの引数を指定して LIMIT 句を使用します (このチュートリアルの後半で説明します)。

クエリ:

SELECT * FROM manager WHERE first_name = 'Saira' LIMIT 2,1;

出力:

+------------+------------+-----------+
| manager_id | first_name | last_name |
+------------+------------+-----------+
|          7 | Saira      | Daniel    |
+------------+------------+-----------+
1 row in set (0.00 sec)

first_nameSaira である最初の 2つのレコードを取得したいとします。 これは次のように行うことができます。

クエリ:

SELECT * FROM manager WHERE first_name = 'Saira' LIMIT 2;

出力:

+------------+------------+-----------+
| manager_id | first_name | last_name |
+------------+------------+-----------+
|          2 | Saira      | Mushtaq   |
|          6 | Saira      | Johny     |
+------------+------------+-----------+
2 rows in set (0.00 sec)

first_name の名前が Saira である最後の 2つのレコードも取得できます。 LIMIT 句とともに ORDER BY 句を使用します。

クエリ:

SELECT * FROM manager WHERE first_name = 'Saira' ORDER BY manager_id DESC LIMIT 2;

出力:

+------------+------------+-----------+
| manager_id | first_name | last_name |
+------------+------------+-----------+
|          7 | Saira      | Daniel    |
|          6 | Saira      | Johny     |
+------------+------------+-----------+
2 rows in set (0.00 sec)

ここで、LIMIT 句と ORDER BY 句の役割を理解することが重要です。 LIMIT 句は SELECT ステートメントで使用され、テーブルから特定の数のレコードを取得します。

LIMIT 句は、正の整数またはゼロでなければならない 1つまたは 2つの引数を取ります。 以下は、1つと 2つの引数を持つ LIMIT 句の構文です。

構文:

# Syntax with one argument
SELECT
    your_select_list
FROM
    you_table_name
WHERE
    your_condition
LIMIT row_count;

# Syntax with two arguments
SELECT
    your_select_list
FROM
    your_table_name
WHERE
    your_condition
LIMIT [offset,] row_count;

row_count は、返されるレコードの最大数を示します。一方、offset は、特定の範囲のレコードを取得する場合に使用されます。たとえば、offset 2 から row_count 4 までです。 最初の行の offset は 1 ではなく 0 です。

次の図を参照してください。

MySQL Select First Row - Limit Arguments Illustration

LIMIT row_countLIMIT 0, row_count は互いに同等であることを思い出してください。 プロジェクトの要件に応じて、ORDER BY 句はテーブル データを降順または昇順で並べ替えます。

IN()MIN()、および GROUP BY を使用して、MySQL テーブルから各グループの最初の行を取得する

この 2 番目のシナリオでは、IN() および MIN() 関数と GROUP BY 句を使用して、テーブルから各グループの最初の行を選択して取得します。

コード例:

SELECT * FROM manager
WHERE
manager_id IN (
    SELECT min(manager_id)
    FROM manager
    GROUP BY first_name
);

出力:

+------------+------------+-------------+
| manager_id | first_name | last_name   |
+------------+------------+-------------+
|          1 | Mehvish    | Ashiq       |
|          2 | Saira      | Mushtaq     |
|          3 | Thomas     | Christopher |
|          5 | Tahir      | Raza        |
+------------+------------+-------------+
4 rows in set (0.08 sec)

この例では、さまざまな関数と句を使用して目的の結果を取得します。

  1. IN() - この関数を使用すると、WHERE 句で複数の値を指定できます。 式が IN() リスト値のいずれかと等しい場合、1 を返します。
  2. GROUP BY - 同じ値を含むレコードをグループ化します。主に集計関数で使用されます。たとえば、MIN()MAX()COUNT() などです。
  3. MIN() - クエリ内の属性 (列) の最小値を返します。
  4. Subquery - 別のクエリ内にネストされています。たとえば、SELECTUPDATEDELETE などです。サブクエリを別のサブクエリにネストすることもできます (さまざまなクエリの実行順序を理解する必要があります)。 条項)。

LIMITORDER BY を使用して、MySQL テーブル全体から最初の行を選択する

LIMIT 句を使用して、順序や条件に関係なく、テーブル全体から最初の行を選択します。

クエリ:

SELECT * from manager LIMIT 1;

出力:

+------------+------------+-----------+
| manager_id | first_name | last_name |
+------------+------------+-----------+
|          1 | Mehvish    | Ashiq     |
+------------+------------+-----------+
1 row in set (0.00 sec)

LIMITORDER BY を使用して、並べ替えられたデータから最初の行を (降順で) 取得します。

クエリ:

SELECT * from manager ORDER BY first_name DESC LIMIT 1;

出力:

+------------+------------+-------------+
| manager_id | first_name | last_name   |
+------------+------------+-------------+
|          3 | Thomas     | Christopher |
+------------+------------+-------------+
1 row in set (0.00 sec)