MySQLで一意の姓(ラストネーム)を持つユーザーをすべて検索する方法
MySQLで、姓(ラストネーム)が重複していない、つまり一意の姓を持つユーザーをすべて抽出したい場合は、GROUP BY句とHAVING句にCOUNT()関数を組み合わせることで実現できます。
この記事では、実際にテーブルを作成し、サンプルデータを登録したうえで、一意の姓を持つユーザーを検索するクエリを段階的に解説します。
1. サンプルテーブルの作成
まず、名前(firstName)と姓(lastName)を格納するテーブルを作成します。
mysql> create table demo76
-> (
-> firstName varchar(20),
-> lastName varchar(20)
-> );
Query OK, 0 rows affected (9.29 sec)2. テストデータの挿入
次に、INSERTコマンドを使ってサンプルレコードを登録します。ここでは「Smith」という姓が2人に重複している点に注目してください。
mysql> insert into demo76 values('John','Doe');
Query OK, 1 row affected (2.52 sec)
mysql> insert into demo76 values('David','Smith');
Query OK, 1 row affected (6.31 sec)
mysql> insert into demo76 values('Adam','Smith');
Query OK, 1 row affected (1.52 sec)3. 登録データの確認
SELECT文でテーブルの中身を確認してみましょう。
mysql> select *from demo76;
実行結果は以下のとおりです。
出力結果
+-----------+----------+ | firstName | lastName | +-----------+----------+ | John | Doe | | David | Smith | | Adam | Smith | +-----------+----------+ 3 rows in set (0.00 sec)
このように、「Doe」は1人だけですが、「Smith」はDavidとAdamの2人が存在します。したがって、一意の姓を持つのはJohn(Doe)のみということになります。
4. 一意の姓を持つユーザーを検索するクエリ
以下のクエリでは、GROUP BYで姓ごとにグループ化し、HAVING句で「同じ姓を持つ異なるfirstNameの数が1件である」グループだけを抽出しています。
mysql> select max(tbl.firstName), tbl.lastName,
-> count(distinct tbl.firstName) as CountOfFirstName
-> from demo76 as tbl
-> group by tbl.lastName
-> having count(distinct tbl.firstName) = 1;出力結果
+--------------------+----------+------------------+ | max(tbl.firstName) | lastName | CountOfFirstName | +--------------------+----------+------------------+ | John | Doe | 1 | +--------------------+----------+------------------+ 1 row in set (0.00 sec)
解説のポイント
- GROUP BY tbl.lastName:姓をキーにしてレコードをグループ化します。
- count(distinct tbl.firstName):同一グループ内に存在する重複しない名前の件数をカウントします。
- HAVING ... = 1:グループ化後の集計結果に対して条件を絞り込み、該当する名前が1人だけの姓(=一意の姓)のみを残します。
なお、max(tbl.firstName)はグループ内の名前を代表して表示するために使用しています。一意の姓の場合は必ず1件しかないため、そのまま該当ユーザーの名前が出力されます。
この手法を使えば、大量のユーザーデータからでも効率的に「同じ姓の持ち主が自分だけ」というユーザーを特定できます。重複チェックやデータクレンジングの場面でも活用できるので、ぜひ覚えておきましょう。
-
MySQLで特定のカラム名を持つテーブルを検索する方法
MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a
-
MySQLのSELECT文にワイルドカードを追加する方法(CONCAT関数の活用)
MySQLでSELECT文にワイルドカードを追加するには?MySQLで部分一致検索を行いたい場合、CONCAT()関数を使ってLIKE句にワイルドカード(%)を動的に追加する方法が便利です。値の前後に「%」を連結することで、文字列の一部分だけでも検索できるようになります。基本構文ワイルドカードを追加して検索する場合、基本的な構文は以下の通りです。SELECT * FROM テーブル名 WHERE カラム名 LIKE CONCAT(%, 検索値, %);この書き方により、指定した値がカラム内のどこに含まれていても(前方・中間・後方)ヒットするようになります。サンプルテーブルの作成まず、動作を確認