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

【MySQL】UNION ALLを使って複数テーブルのCOUNT合計を1つのクエリで取得する方法

はじめに

MySQLでは、複数のテーブルに保存されたデータの件数(COUNT)をまとめて集計したいケースがあります。そんなときに便利なのがUNION ALLです。UNION ALLを使えば、複数のSELECT文の結果を1つに結合し、その合計値を単一のクエリで取得できます。

本記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。

1つ目のテーブルを作成する

まず、以下のCREATE TABLE文で最初のテーブル「DemoTable1」を作成します。

mysql> create table DemoTable1
-> (
-> Id int,
-> Name varchar(30)
-> );
Query OK, 0 rows affected (1.55 sec)

レコードを挿入する

INSERTコマンドを使って、テーブルにいくつかのレコードを追加します。

mysql> insert into DemoTable1 values(10,'Chris Brown');
Query OK, 1 row affected (0.83 sec)
mysql> insert into DemoTable1 values(20,'David Miller');
Query OK, 1 row affected (0.50 sec)
mysql> insert into DemoTable1 values(30,'John Adam');
Query OK, 1 row affected (0.83 sec)

登録内容を確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable1;

出力結果:

+------+--------------+
| Id | Name |
+------+--------------+
| 10 | Chris Brown |
| 20 | David Miller |
| 30 | John Adam |
+------+--------------+
3 rows in set (0.00 sec)

この時点で、DemoTable1には3件のレコードが登録されています。

2つ目のテーブルを作成する

続いて、2つ目のテーブル「DemoTable2」を作成します。

mysql> create table DemoTable2
-> (
-> Amount int
-> );
Query OK, 0 rows affected (1.17 sec)

レコードを挿入する

mysql> insert into DemoTable2 values(100);
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable2 values(200);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2 values(300);
Query OK, 1 row affected (0.54 sec)

登録内容を確認する

mysql> select *from DemoTable2;

出力結果:

+--------+
| Amount |
+--------+
| 100 |
| 200 |
| 300 |
+--------+
3 rows in set (0.00 sec)

DemoTable2にも3件のレコードが登録されました。

UNION ALLでカウントの合計を取得する

それでは、2つのテーブルのレコード数の合計を、単一のクエリで取得してみましょう。ポイントは、各テーブルのCOUNT(*)をサブクエリとしてUNION ALLで結合し、外側でSUM関数を使って合計することです。

mysql> select sum(AllCount) AS Total_Count
-> from
-> (
-> (select count(*) AS AllCount from DemoTable1)
-> union all
-> (select count(*) AS AllCount from DemoTable2)
-> )t;

出力結果:

+-------------+
| Total_Count |
+-------------+
| 6 |
+-------------+
1 row in set (0.03 sec)

クエリの仕組み

このクエリは以下の手順で動作します。

  • 各サブクエリがそれぞれのテーブルのレコード数(DemoTable1:3件、DemoTable2:3件)を返します。
  • UNION ALLによって、これらの結果が縦方向に結合されます。UNIONではなくUNION ALLを使うことで、重複チェックが不要になり、高速に動作します。
  • 最後にSUM(AllCount)で結合結果の合計(3+3=6)を計算し、「Total_Count」という別名で出力しています。

まとめ

UNION ALLとSUM関数を組み合わせることで、MySQLでも複数テーブルのレコード数の合計を簡単に、しかも単一のクエリで取得できます。3つ以上のテーブルに対しても、サブクエリを追加するだけで同じように対応できるので、ぜひ活用してみてください。

  1. 単一のMySQLクエリで複数のテーブルからNOT NULL値をカウントする方法

    MySQLでは、スカラーサブクエリを組み合わせることで、単一のクエリで複数のテーブルからNOT NULL値の件数を同時に取得できます。COUNT関数はNULL値を自動的に除外するため、この方法はNULLを含むカラムの有効な値の数を数えるのに非常に便利です。基本構文複数のテーブルから値をカウントする場合、基本的な構文は以下の通りです。Select ( select count(yourColumnName) from yourTableName1) as anyAliasName1, ( select count(yourColumnName) from your

  2. 【MySQL】SUBSTRING_INDEXでカンマ区切り文字列から指定位置の値を取得する方法

    カンマ区切りの文字列から、指定した位置にある単一の値を取り出したい場合は、SUBSTRING_INDEX() 関数を使用します。この関数をネスト(入れ子)して呼び出すことで、任意の位置の要素を簡単に抽出できます。1. サンプルテーブルの作成まず、カンマ区切りの文字列を格納するテーブルを作成します。mysql> create table DemoTable1615 -> ( -> ListOfSubject text -> ); Query OK, 0 rows affected (0.81 sec)2. レコードの挿入INSERT文を使って、カン