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つ以上のテーブルの場合も、同じようにサブクエリを並べて追加するだけで、すべてのテーブルの行数を一度に確認できます。テーブル間に関連性がない場合でも使えるため、日々の運用やデータ検証の際に非常に便利なテクニックです。
-
MySQLで複数の行を効率的に選択する方法:インデックスとIN句の活用
インデックスを活用して複数の行を効率的に取得するMySQLで複数の行を効率的に選択するには、インデックスの作成とIN句の組み合わせが非常に有効です。インデックスがない状態でWHERE句による検索を行うと、フルテーブルスキャンが発生し、データ量が増えるほどパフォーマンスが低下します。ここでは、実際の手順を順番に解説していきます。1. サンプルテーブルの作成まず、以下のようにテーブルを作成します。mysql> create table DemoTable1501 -> ( -> Id int NOT NULL PRIMARY KEY, -> URL tex
-
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