【MySQL】単一のクエリで2つのテーブルの最高値と最低値を取得する方法
2つのテーブルの中から最高値と最低値を取得するには、MAX()関数とMIN()関数を使用します。さらに、複数のテーブルの結果をひとつにまとめて扱う必要があるため、UNION演算子も併用します。この記事では、実際のサンプルコードを使いながら、手順をわかりやすく解説します。
1つ目のテーブル(DemoTable1)を作成する
まず、CREATE TABLE文でサンプル用のテーブルを作成します。
mysql> create table DemoTable1
(
UniqueId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score1 int
);
Query OK, 0 rows affected (0.76 sec)次に、INSERT文を使ってテーブルにレコードを挿入します。
mysql> insert into DemoTable1(Score1) values(56); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable1(Score1) values(76); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable1(Score1) values(65); Query OK, 1 row affected (0.09 sec)
SELECT文でテーブル内のすべてのレコードを確認しましょう。
mysql> select *from DemoTable1;
実行すると、次のような出力が得られます。
+----------+--------+ | UniqueId | Score1 | +----------+--------+ | 1 | 56 | | 2 | 76 | | 3 | 65 | +----------+--------+ 3 rows in set (0.00 sec)
2つ目のテーブル(DemoTable2)を作成する
続いて、2つ目のテーブルを作成します。
mysql> create table DemoTable2
(
UniqueId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score2 int
);
Query OK, 0 rows affected (0.93 sec)同じようにINSERT文でレコードを挿入します。
mysql> insert into DemoTable2(Score2) values(67); Query OK, 1 row affected (0.68 sec) mysql> insert into DemoTable2(Score2) values(94); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable2(Score2) values(98); Query OK, 1 row affected (0.08 sec)
SELECT文でレコードを確認します。
mysql> select *from DemoTable2;
出力は以下の通りです。
+----------+--------+ | UniqueId | Score2 | +----------+--------+ | 1 | 67 | | 2 | 94 | | 3 | 98 | +----------+--------+ 3 rows in set (0.00 sec)
2つのテーブルから最高値と最低値を取得するクエリ
ポイントは、UNIONで2つのテーブルのスコアを統合したサブクエリ(派生テーブル)を作り、その結果全体に対してMAX()とMIN()を適用することです。これにより、単一のクエリで両テーブルを横断した最高値と最低値を一度に取得できます。
mysql> select max(commonValue) AS Highest_Value,min(commonValue) AS Lowest_Value from
(
select Score1 as commonValue from DemoTable1
union
select Score2 as commonValue from DemoTable2
) tbl;実行結果は次のようになります。
+---------------+--------------+ | Highest_Value | Lowest_Value | +---------------+--------------+ | 98 | 56 | +---------------+--------------+ 1 row in set (0.04 sec)
この出力から、DemoTable1とDemoTable2を合わせたデータの中で、最高値が「98」、最低値が「56」であることが確認できます。AS句を使って別名(Highest_Value/Lowest_Value)を付けているため、結果の列も読みやすく表示されます。
補足:UNIONとUNION ALLの違い
UNIONは重複する値を自動的に除外して統合します。重複行も含めて扱いたい場合はUNION ALLを使用します。ただし、MAX()やMIN()は重複値の有無に関わらず同じ最大値・最小値を返すため、本記事のような用途ではどちらを使っても結果は変わりません。
-
MySQLで1つのクエリを使ってSELECTとINSERTを同時に実行する方法
MySQLでは、INSERT INTO ... SELECT構文とUNION ALLを組み合わせることで、1つのクエリだけで別テーブルからデータを選択(SELECT)し、挿入(INSERT)することができます。本記事では、実際のサンプルコードを使ってその手順をわかりやすく解説します。1. 最初のテーブルを作成するまず、データの挿入先となる最初のテーブルを作成します。以下のクエリを実行してください。mysql> create table DemoTable1 -> ( -> StudentName varchar(20), -> StudentMarks
-
MySQLで重複するタプルを検出してカウントを表示する方法
MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入