【MySQL】WHERE句で実際の行数(COUNT(*))を条件にする方法|サブクエリの活用テクニック
MySQLでは、WHERE句の中でサブクエリを組み合わせることで、テーブル全体の実際の行数(COUNT(*))を抽出条件として扱うことができます。本記事では、その基本的な考え方から、サンプルテーブルを使った具体的な動作確認まで、手順を追ってわかりやすく解説します。
基本構文
ポイントは、WHERE句の中で同じテーブルに対する COUNT(*) をサブクエリとして記述し、その結果を数値と比較する点です。基本形は以下の通りです。
SELECT yourColumnName1,yourColumnName2,...N FROM yourTableName WHERE ( SELECT COUNT(*) FROM yourTableName )=2;
この例では、「テーブルの総行数がちょうど2件である場合にのみ、すべての行を返す」という動作になります。
サンプルテーブルを作成する
それでは、実際の動きを確認してみましょう。まずは従業員名を格納するシンプルなテーブルを作成します。
mysql> create table CountWithSubqueryDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EmployeeName varchar(20)
-> );
Query OK, 0 rows affected (2.09 sec)
テストデータを挿入する
続いて、INSERT文で複数件のレコードを登録します。NULL値や空文字('')が含まれていても、COUNT(*) はすべての行をカウントする点に注目してください。
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('John');
Query OK, 1 row affected (0.54 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values(NULL);
Query OK, 1 row affected (0.36 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Carol');
Query OK, 1 row affected (0.23 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('');
Query OK, 1 row affected (0.31 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Bob');
Query OK, 1 row affected (1.24 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values(NULL);
Query OK, 1 row affected (0.30 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Sam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Mike');
Query OK, 1 row affected (0.18 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('James');
Query OK, 1 row affected (0.26 sec)
登録済みデータの確認
SELECT文ですべてのレコードを表示し、データが正しく登録されているかを確認します。
mysql> select *from CountWithSubqueryDemo;
実行結果は以下の通りです。合計9件のレコードが登録されています。
+----+--------------+ | Id | EmployeeName | +----+--------------+ | 1 | John | | 2 | NULL | | 3 | Carol | | 4 | | | 5 | Bob | | 6 | NULL | | 7 | Sam | | 8 | Mike | | 9 | James | +----+--------------+ 9 rows in set (0.19 sec)
WHERE句で行数を条件に使ってみる
ここで、冒頭で紹介した構文を使い、WHERE句内で実際の行数を評価してみます。条件は「行数が2件の場合」です。
mysql> select Id,EmployeeName from CountWithSubqueryDemo
-> where
-> (
-> select count(*) from CountWithSubqueryDemo
-> )=2;
Empty set (0.03 sec)
結果は空セット(Empty set)となりました。これは、現在テーブルには9件のレコードが存在しており、「行数が2件」という条件を満たしていないためです。つまり、このクエリは「テーブルの総行数が2件のときだけ、全行を返す」という意味になります。
レコードを2件に絞り込んで再確認
動作を正しく理解するために、一度テーブルを空にしてから、レコードを2件だけ登録し直してみましょう。
テーブルの初期化
TRUNCATE文ですべてのレコードを削除します。
mysql> truncate table CountWithSubqueryDemo; Query OK, 0 rows affected (1.95 sec)
2件のレコードを挿入
今度はレコードを2件だけ挿入します。
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('James');
Query OK, 1 row affected (0.15 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values(NULL);
Query OK, 1 row affected (0.46 sec)
データの再確認
mysql> select *from CountWithSubqueryDemo;
実行結果:
+----+--------------+ | Id | EmployeeName | +----+--------------+ | 1 | James | | 2 | NULL | +----+--------------+ 2 rows in set (0.00 sec)
条件を満たした場合の実行結果
この状態でもう一度、WHERE句で行数を評価するクエリを実行します。
mysql> select Id,EmployeeName from CountWithSubqueryDemo
-> where
-> (
-> select count(*) from CountWithSubqueryDemo
-> )=2;
今回はテーブルの行数がちょうど2件なので条件を満たし、すべての行が返されます。
+----+--------------+ | Id | EmployeeName | +----+--------------+ | 1 | James | | 2 | NULL | +----+--------------+ 2 rows in set (0.00 sec)
まとめ
WHERE句の中で (SELECT COUNT(*) FROM テーブル名) のようにサブクエリを記述することで、テーブル全体の実際の行数を抽出条件として扱えます。「行数が特定の値と一致する場合のみデータを取得したい」といったケースに応用できる便利なテクニックなので、ぜひ覚えておきましょう。
-
MySQLでGROUP BYとGROUP_CONCATを使って各グループのレコード数とID一覧を1行で表示する方法
MySQLでは、GROUP_CONCAT()とCOUNT()、さらにGROUP BY句を組み合わせることで、同じ値を持つ複数のレコードを1行にまとめ、その件数と一緒に表示することができます。本記事では、実際にテーブルを作成し、データを挿入したうえで、グループごとのレコード数とIDの一覧を取得する手順を解説します。サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable -> ( -> CompanyId int NOT
-
MySQLで列ごとの同じ値の出現回数をカウントする方法(GROUP BYとCOUNT(*)の使い方)
MySQLである列に含まれる同じ値がそれぞれ何回出現しているかを調べたい場合、COUNT(*)とGROUP BY句を組み合わせることで簡単に集計できます。この記事では、実際のサンプルを使いながら手順を解説します。 1. サンプルテーブルを作成する まずは動作確認用のテーブルを作成しましょう。ここでは「Id」と「Name」の2つのカラムを持つテーブルを定義します。 mysql> create table DemoTable1818 ( Id int, Name varchar(20) ); Query OK, 0 rows affected (0.00 s