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

MySQLでUNIONクエリの結果をカウントする方法を徹底解説

MySQLでは、UNION(ユニオン)で結合した結果セットの件数を取得したい場面がよくあります。本記事では、サブクエリとCOUNT(*)関数を組み合わせて、UNIONの結果をカウントする方法を具体例とともに解説します。

UNIONの結果をカウントする基本構文

UNIONの結果件数を取得するには、UNIONクエリをFROM句の中にサブクエリとして記述し、その外側でCOUNT(*)を実行します。基本となる構文は以下の通りです。

SELECT COUNT(*)
FROM
(
    SELECT yourColumName1 FROM yourTableName1
    UNION
    SELECT yourColumName1 FROM yourTableName2
) anyVariableName;

ポイントは、UNIONを含むSELECT文全体を括弧で囲み、任意の別名(エイリアス)を付けることです。MySQLではサブクエリに必ず別名が必要なため、「anyVariableName」のような名前を付けておきましょう。

動作確認用のサンプルテーブルを作成する

それでは、実際にテーブルを作成して動作を確認してみましょう。まずは1つ目のテーブル「union_Table1」を作成します。

mysql> create table union_Table1
-> (
-> UserId int
-> );
Query OK, 0 rows affected (0.47 sec)

union_Table1にデータを挿入

INSERTコマンドを使って、レコードを3件追加します。

mysql> insert into union_Table1 values(1);
Query OK, 1 row affected (0.18 sec)

mysql> insert into union_Table1 values(10);
Query OK, 1 row affected (0.12 sec)

mysql> insert into union_Table1 values(20);
Query OK, 1 row affected (0.09 sec)

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

mysql> select *from union_Table1;

実行結果は以下のようになります。

+--------+
| UserId |
+--------+
| 1      |
| 10     |
| 20     |
+--------+
3 rows in set (0.00 sec)

2つ目のテーブルを作成してデータを挿入

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

mysql> create table union_Table2
-> (
-> UserId int
-> );
Query OK, 0 rows affected (0.69 sec)

こちらにもINSERTコマンドでレコードを追加します。なお、1つ目のテーブルと同じ値「1」も意図的に含めています。

mysql> insert into union_Table2 values(1);
Query OK, 1 row affected (0.12 sec)

mysql> insert into union_Table2 values(30);
Query OK, 1 row affected (0.26 sec)

mysql> insert into union_Table2 values(50);
Query OK, 1 row affected (0.13 sec)

SELECT文で内容を確認します。

mysql> select *from union_Table2;

実行結果は以下の通りです。

+--------+
| UserId |
+--------+
| 1      |
| 30     |
| 50     |
+--------+
3 rows in set (0.00 sec)

UNIONクエリのカウントを実行する

準備が整ったので、いよいよUNIONクエリの結果をカウントしてみます。両テーブルには重複するレコード(UserId = 1)が存在しますが、通常のUNIONは重複行を自動的に除外し、同じ値は1回だけカウントされます。

mysql> select count(*) as UnionCount from
-> (
-> select distinct UserId from union_Table1
-> union
-> select distinct UserId from union_Table2
-> )tbl1;

実行結果は以下のようになります。

+------------+
| UnionCount |
+------------+
| 5          |
+------------+
1 row in set (0.00 sec)

結果の解説

各テーブルは3件ずつのデータを持っていますが、両方に存在する「1」が重複しているため、UNION後のユニークな値は「1」「10」「20」「30」「50」の5件となります。そのため、UnionCountの結果は「5」と表示されました。

ちなみに、重複したレコードも含めてすべてカウントしたい場合は、UNIONの代わりにUNION ALLを使用します。この場合、結果は6件(3件+3件)となります。用途に応じて使い分けるとよいでしょう。

  1. MySQLの1つのクエリで複数テーブルの行数を同時にカウントする方法

    はじめに MySQLでは、サブクエリ(スカラーサブクエリ)を組み合わせることで、1つのSELECT文で複数のテーブルの行数を同時に取得できます。この記事では、実際にテーブルを作成し、データを挿入して、2つのテーブルの行数を1回のクエリでカウントする手順を解説します。 手順1:1つ目のテーブルを作成する まず、以下のようにテーブルを作成します。 mysql> create table DemoTable1 ( Name varchar(40) ); Query OK, 0 rows affected (0.81 sec) レコードの挿入 INSERTコマンドを使って、いくつかの

  2. MySQLクエリでCASE条件を使ってカウントする方法

    MySQLでは、CASE WHENを活用し、COUNT()関数の中にCASE条件を設定することで、特定の条件に一致するレコードだけを数えることができます。この仕組みが成り立つのは、COUNT()関数がNULL値を無視するためです。条件に合わない場合にNULLを返すことで、そのレコードはカウント対象から除外されます。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。 ); Query OK, 0 rows affected (0.61 sec)2. レコードの挿入続いて、insertコマンドを使ってテーブルにデータを登録します。mysql> insert into D