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

MySQLで複数テーブルにまたがる列の合計を計算する方法(UNION ALLの使い方)

MySQLで複数のテーブルにまたがる列を合計したい場合は、UNION ALLを使うのが効果的です。UNION ALLは複数のSELECT文の結果を重複を排除せずに連結できるため、サブクエリとして組み合わせてからSUM関数で合計を求められます。

ここでは、実際にサンプルテーブルを作成しながら、その手順を詳しく解説します。

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

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

mysql> create table Products1
-> (
-> ProductId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ProductName varchar(20),
-> ProductPrice int
-> );
Query OK, 0 rows affected (0.50 sec)

Products1にレコードを挿入する

続いて、INSERTコマンドでサンプルデータを登録します。

mysql> insert into Products1(ProductName,ProductPrice) values('Product-1',100);
Query OK, 1 row affected (0.22 sec)
mysql> insert into Products1(ProductName,ProductPrice) values('Product-2',200);
Query OK, 1 row affected (0.34 sec)
mysql> insert into Products1(ProductName,ProductPrice) values('Product-3',700);
Query OK, 1 row affected (0.15 sec)

Products1の全レコードを確認する

SELECT文で登録内容を表示してみましょう。

mysql> select *from Products1;

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

+-----------+-------------+--------------+
| ProductId | ProductName | ProductPrice |
+-----------+-------------+--------------+
| 1 | Product-1 | 100 |
| 2 | Product-2 | 200 |
| 3 | Product-3 | 700 |
+-----------+-------------+--------------+
3 rows in set (0.00 sec)

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

同じ構造を持つ2つ目のテーブルを作成します。

mysql> create table Products2
-> (
-> ProductId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ProductName varchar(20),
-> ProductPrice int
-> );
Query OK, 0 rows affected (0.63 sec)

Products2にレコードを挿入する

こちらにもINSERTコマンドでデータを追加します。

mysql> insert into Products2(ProductName,ProductPrice) values('Product-1',500);
Query OK, 1 row affected (0.24 sec)
mysql> insert into Products2(ProductName,ProductPrice) values('Product-4',100);
Query OK, 1 row affected (0.13 sec)
mysql> insert into Products2(ProductName,ProductPrice) values('Product-5',400);
Query OK, 1 row affected (0.10 sec)

Products2の全レコードを確認する

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

mysql> select *from Products2;

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

+-----------+-------------+--------------+
| ProductId | ProductName | ProductPrice |
+-----------+-------------+--------------+
| 1 | Product-1 | 500 |
| 2 | Product-4 | 100 |
| 3 | Product-5 | 400 |
+-----------+-------------+--------------+
3 rows in set (0.00 sec)

UNION ALLとSUMで複数テーブルの列を合計する

それでは本題です。UNION ALLで両テーブルのProductPriceを縦に連結したサブクエリを作り、外側でSUM関数を使うことで、複数テーブルにまたがる列の合計を一度に計算できます。

mysql> SELECT SUM(tbl.ProductPrice) AS TotalPrice
-> FROM (SELECT ProductPrice FROM Products1
-> UNION ALL
-> SELECT ProductPrice FROM Products2) tbl;

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

+------------+
| TotalPrice |
+------------+
| 2000 |
+------------+
1 row in set (0.04 sec)

解説:なぜUNION ALLを使うのか

Products1の合計は「100 + 200 + 700 = 1000」、Products2の合計は「500 + 100 + 400 = 1000」であり、両者を足すと2000になります。このように、UNION ALLで各テーブルの該当列を1つの仮想テーブル(派生テーブル)にまとめてからSUMすることで、テーブルが分かれていても一括で集計できます。

なお、UNIONではなくUNION ALLを使う理由は、UNIONの場合は重複行が自動的に除外されてしまい、金額などが同一の行があると正しい合計にならない可能性があるためです。単純に合計を求める用途では、パフォーマンス面でも有利なUNION ALLを選択するのが基本です。

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

    この記事では、MySQLで複数のテーブルの行数(レコード数)を1つのクエリだけで同時に取得する方法を解説します。鍵となるのは、SELECT文の中にサブクエリとしてCOUNT(*)を組み込むテクニックです。実際にサンプルテーブルを作りながら、動作を確認していきましょう。 手順1:最初のテーブルを作成する まず、サンプル用のテーブル「DemoTable1」を作成します。 mysql> create table DemoTable1 (FirstName varchar(100)); Query OK, 0 rows affected (0.54 sec) レコードを挿入する INSERT

  2. 1つのMySQLクエリで複数のカラムのデータ型を変更する方法

    MySQLでは、ALTER TABLE文を使うことで、テーブルのカラム定義を後から変更できます。複数のカラムのデータ型を一度に変更したい場合も、1つのクエリでまとめて実行可能です。基本構文単一のクエリで複数のカラムの型を変更するには、以下のように MODIFY COLUMN をカンマで区切って並べます。ALTER TABLE テーブル名 MODIFY COLUMN カラム名1 データ型1, MODIFY COLUMN カラム名2 データ型2, . . N;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable (