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

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件しかないため、そのまま該当ユーザーの名前が出力されます。

この手法を使えば、大量のユーザーデータからでも効率的に「同じ姓の持ち主が自分だけ」というユーザーを特定できます。重複チェックやデータクレンジングの場面でも活用できるので、ぜひ覚えておきましょう。

  1. MySQLで特定のカラム名を持つテーブルを検索する方法

    MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a

  2. MySQLのSELECT文にワイルドカードを追加する方法(CONCAT関数の活用)

    MySQLでSELECT文にワイルドカードを追加するには?MySQLで部分一致検索を行いたい場合、CONCAT()関数を使ってLIKE句にワイルドカード(%)を動的に追加する方法が便利です。値の前後に「%」を連結することで、文字列の一部分だけでも検索できるようになります。基本構文ワイルドカードを追加して検索する場合、基本的な構文は以下の通りです。SELECT * FROM テーブル名 WHERE カラム名 LIKE CONCAT(%, 検索値, %);この書き方により、指定した値がカラム内のどこに含まれていても(前方・中間・後方)ヒットするようになります。サンプルテーブルの作成まず、動作を確認