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

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

この記事では、MySQLで複数のテーブルの行数(レコード数)を1つのクエリだけで同時に取得する方法を解説します。鍵となるのは、SELECT文の中にサブクエリとしてCOUNT(*)を組み込むテクニックです。実際にサンプルテーブルを作りながら、動作を確認していきましょう。

手順1:最初のテーブルを作成する

まず、サンプル用のテーブル「DemoTable1」を作成します。

mysql> create table DemoTable1 (FirstName varchar(100));
Query OK, 0 rows affected (0.54 sec)

レコードを挿入する

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

mysql> insert into DemoTable1 values('Bob');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1 values('James');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1 values('John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1 values('David');
Query OK, 1 row affected (0.18 sec)

登録内容を確認する

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

mysql> select *from DemoTable1;

実行結果は以下の通りです。4件のデータが登録されていることがわかります。

+-----------+
| FirstName |
+-----------+
| Bob       |
| James     |
| John      |
| David     |
+-----------+
4 rows in set (0.00 sec)

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

続いて、「DemoTable2」というテーブルを作成します。

mysql> create table DemoTable2 (Marks int);
Query OK, 0 rows affected (0.65 sec)

レコードを挿入する

こちらにもINSERTコマンドで複数のレコードを登録します。

mysql> insert into DemoTable2 values(98);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2 values(89);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable2 values(67);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2 values(34);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable2 values(32);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable2 values(42);
Query OK, 1 row affected (0.17 sec)

登録内容を確認する

SELECT文で全レコードを表示すると、6件のデータが確認できます。

mysql> select *from DemoTable2;
+-------+
| Marks |
+-------+
| 98    |
| 89    |
| 67    |
| 34    |
| 32    |
| 42    |
+-------+
6 rows in set (0.00 sec)

複数テーブルの行数をカウントするクエリ

それでは本題です。SELECT句の中で、テーブルごとにCOUNT(*)を実行するサブクエリを記述すると、複数のテーブルの行数をまとめて取得できます。

mysql> select
   (select count(*) from DemoTable1) AS First_Table_Row,
   (select count(*) from DemoTable2) AS Second_Table_Row;

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

+-----------------+------------------+
| First_Table_Row | Second_Table_Row |
+-----------------+------------------+
| 4               | 6                |
+-----------------+------------------+
1 row in set (0.00 sec)

仕組みの解説

このクエリでは、(select count(*) from テーブル名)という形式のスカラーサブクエリを使用しています。各サブクエリは対応するテーブルの全行数を1つの値として返し、外側のSELECT文がそれらを1行にまとめて表示します。ASを使えば、結果の列にわかりやすい別名(First_Table_Row、Second_Table_Rowなど)を付けることもできます。

この方法のメリットは、UNION ALLやテーブル結合(JOIN)を必要としない点です。3つ以上のテーブルの場合も、同じようにサブクエリを並べて追加するだけで、すべてのテーブルの行数を一度に確認できます。テーブル間に関連性がない場合でも使えるため、日々の運用やデータ検証の際に非常に便利なテクニックです。

  1. MySQLで複数の行を効率的に選択する方法:インデックスとIN句の活用

    インデックスを活用して複数の行を効率的に取得するMySQLで複数の行を効率的に選択するには、インデックスの作成とIN句の組み合わせが非常に有効です。インデックスがない状態でWHERE句による検索を行うと、フルテーブルスキャンが発生し、データ量が増えるほどパフォーマンスが低下します。ここでは、実際の手順を順番に解説していきます。1. サンプルテーブルの作成まず、以下のようにテーブルを作成します。mysql> create table DemoTable1501 -> ( -> Id int NOT NULL PRIMARY KEY, -> URL tex

  2. MySQLで複数のテーブルの行数(COUNT(*))を1つのクエリで取得する方法

    MySQLでは、サブクエリを組み合わせることで、複数のテーブルの行数を1つのクエリで同時に取得できます。基本となる構文は以下の通りです。SELECT (SELECT COUNT(*) FROM テーブル名1) AS エイリアス名1, (SELECT COUNT(*) FROM テーブル名2) AS エイリアス名2 FROM dual;構文のポイント各テーブルに対して COUNT(*) を含むスカラーサブクエリを作成し、それらを SELECT 句の中に並べます。MySQLでは FROM dual を指定することで、実際のテーブルを参照しないままサブクエリを評価できます(なお、My