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

MySQLで3つの列から重複しない値を抽出し、1つの列にまとめて表示する方法

MySQLでは、1つのクエリ内で UNION を複数回使うことで、複数の列に分かれている値を縦方向に結合し、重複を除いた値を1つの列として取得できます。本記事では、実際のテーブル作成からデータ挿入、そして目的の結果を得るまでの手順を順番に解説します。

サンプルテーブルの作成

まずは、3つの整数型の列を持つテーブルを作成します。

mysql> create table DemoTable
    -> (
    -> Value1 int,
    -> Value2 int,
    -> Value3 int
    -> );
Query OK, 0 rows affected (0.69 sec)

テストデータの挿入

INSERT コマンドを使って、いくつかのレコードを挿入します。NULL を含む行も意図的に用意しています。

mysql> insert into DemoTable values(20,null,null);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(20,null,null);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(20,null,null);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(10,null,null);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(80,20,100);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(10,null,null);
Query OK, 1 row affected (0.16 sec)

登録済みレコードの確認

SELECT 文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable;

実行すると、次のような結果が出力されます。

+--------+--------+--------+
| Value1 | Value2 | Value3 |
+--------+--------+--------+
|     20 |   NULL |   NULL |
|     20 |   NULL |   NULL |
|     20 |   NULL |   NULL |
|     10 |   NULL |   NULL |
|     80 |     20 |    100 |
|     10 |   NULL |   NULL |
+--------+--------+--------+
6 rows in set (0.00 sec)

3つの列から重複しない値を1列に抽出するクエリ

ここが本題です。各列を個別に SELECT し、それらを UNION で連結することで、3つの列の値を1つの列に統合できます。UNION は自動的に重複を排除するため、同じ値は1度だけ表示されます。

mysql> select *from
    -> (
    -> select Value1 as AllValue from DemoTable
    -> union
    -> select Value2 as AllValue from DemoTable
    -> union
    -> select Value3 as AllValue from DemoTable
    -> ) tbl where AllValue IS NOT NULL
    -> order by AllValue;

実行結果

このクエリを実行すると、次のような出力が得られます。

+----------+
| AllValue |
+----------+
|       10 |
|       20 |
|       80 |
|      100 |
+----------+
4 rows in set (0.00 sec)

ポイント解説

  • UNION の重複除去: UNION はデフォルトで重複行を除外するため、DISTINCT を明示的に書く必要はありません。重複を残したい場合は UNION ALL を使用します。
  • NULL の除外: サブクエリの外側で WHERE AllValue IS NOT NULL を指定することで、NULL 値を結果から取り除いています。
  • 並べ替え: 最後に ORDER BY AllValue を付けることで、抽出した値を昇順に整列させています。

このように、UNION を活用すれば、複数の列に散らばった値を簡単に1つの列へ集約し、重複のない一覧として取得できます。正規化されていないテーブルや、集計前の前処理などで役立つテクニックなので、ぜひ覚えておきましょう。

  1. MySQLでNULLを含む列からNULL以外(NOT NULL)の値だけを抽出して表示する方法

    MySQLのIS NOT NULLを使ってNULL以外の値のみを表示するMySQLで、NULLとNULL以外のレコードが混在する列からNULL以外の値だけを取得したい場合は、IS NOT NULL演算子を使用します。この記事では、実際にテーブルを作成しながら手順を解説します。1. テーブルの作成まず、日付型の列を持つサンプルテーブルを作成します。mysql> create table DemoTable1      (      DueDate date      ); Query OK, 0 ro

  2. MySQLでハイフン区切りの文字列値を1つの列から複数の列に分離して選択する方法

    ハイフンで区切られた文字列値を1つの列から複数の列に分離して取得したい場合、MySQLの SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。ここでは、サンプルテーブルを使って具体的な手順を解説します。 サンプルテーブルの作成 まず、従業員情報を格納するテーブルを作成します。 mysql> create table DemoTable1962 ( EmployeeInformation text ); Query OK, 0 rows affected (0.00 sec) データの挿入 次に、INSERT文を使って「ID-名前-年齢」の形