CONCAT関数とGROUP_CONCAT関数でマスターするMySQL列結合術

2024-06-09

MySQLで2つの列を1つの列に結合する方法

CONCAT関数は、複数の文字列を結合する関数です。2つの列を1つの列に結合するには、以下のように使用します。

SELECT CONCAT(column1, column2) AS new_column
FROM your_table;

このクエリは、your_table テーブルの column1 列と column2 列の値を結合した新しい列 new_column を作成し、結果を返します。

例:

顧客テーブル (customers) に、氏名 (first_name) と姓 (last_name) を格納する 2 つの列があるとします。以下のクエリは、氏名と姓を結合した新しい列 full_name を作成し、結果を返します。

SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM customers;

GROUP_CONCAT関数は、グループ内のすべての値を結合する関数です。複数の行にまたがる列を1つの列に結合する場合に使用します。

SELECT column1, GROUP_CONCAT(column2) AS new_column
FROM your_table
GROUP BY column1;

商品テーブル (products) に、商品ID (product_id) とカテゴリ (category) を格納する 2 つの列があるとします。以下のクエリは、商品IDとカテゴリを結合した新しい列 product_info を作成し、商品IDごとにグループ化して結果を返します。

SELECT product_id, GROUP_CONCAT(category) AS product_info
FROM products
GROUP BY product_id;

補足:

  • 上記の例では、区切り文字としてスペース (" ") を使用していますが、任意の文字列に変更できます。
  • CONCAT関数とGROUP_CONCAT関数の両方とも、NULL値を処理することができます。NULL値を結合した場合は、結果としてNULL値になります。
  • より複雑な結合が必要な場合は、JOIN操作を使用することもできます。



    CONCAT関数を使用する

    -- 顧客テーブル (customers) を作成
    CREATE TABLE customers (
      id INT PRIMARY KEY AUTO_INCREMENT,
      first_name VARCHAR(255) NOT NULL,
      last_name VARCHAR(255) NOT NULL
    );
    
    -- データを挿入
    INSERT INTO customers (first_name, last_name)
    VALUES
      ('John', 'Doe'),
      ('Jane', 'Doe'),
      ('Peter', 'Jones'),
      ('Mary', 'Smith');
    
    -- 氏名と姓を結合した新しい列を作成
    SELECT CONCAT(first_name, ' ', last_name) AS full_name
    FROM customers;
    

    このコードは、以下の結果を出力します。

    full_name
    ---------
    John Doe
    Jane Doe
    Peter Jones
    Mary Smith
    

    GROUP_CONCAT関数を使用する

    -- 商品テーブル (products) を作成
    CREATE TABLE products (
      id INT PRIMARY KEY AUTO_INCREMENT,
      product_name VARCHAR(255) NOT NULL,
      category VARCHAR(255) NOT NULL
    );
    
    -- データを挿入
    INSERT INTO products (product_name, category)
    VALUES
      ('Laptop', 'Electronics'),
      ('Phone', 'Electronics'),
      ('Book', 'Books'),
      ('Shirt', 'Clothing'),
      ('Shoes', 'Clothing');
    
    -- 商品IDとカテゴリを結合した新しい列を作成
    SELECT product_id, GROUP_CONCAT(category) AS product_info
    FROM products
    GROUP BY product_id;
    
    product_id | product_info
    -----------+--------------
    1          | Electronics
    2          | Electronics
    3          | Books
    4          | Clothing
    5          | Clothing
    

    このサンプルコードは、基本的な使用方法を示しています。実際の使用例では、テーブルや列名、データ型などは状況に合わせて変更する必要があります。

    上記のサンプルコード以外にも、状況に応じて様々な方法で2つの列を結合することができます。詳細については、MySQLのドキュメントを参照してください。




    MySQLで2つの列を1つの列に結合するその他の方法

    FORMAT関数は、値を指定された形式で書式設定するために使用できます。2つの列の値を結合して書式設定するには、以下のように使用します。

    SELECT FORMAT(column1, '%s %s', column2) AS new_column
    FROM your_table;
    

    このクエリは、your_table テーブルの column1 列と column2 列の値を結合し、%s %s 形式で書式設定した結果を new_column 列に格納して返します。%s は文字列を表すプレースホルダです。

    SELECT FORMAT(last_name, '%s, %s', first_name) AS full_name
    FROM customers;
    

    SUBSTRING_INDEX関数とREVERSE関数は、文字列を操作するために使用できます。2つの列の値を結合するには、以下のように使用します。

    SELECT CONCAT(REVERSE(SUBSTRING_INDEX(REVERSE(column1), ',', 1)), ',', column2) AS new_column
    FROM your_table;
    

    このクエリは、your_table テーブルの column1 列と column2 列の値を結合します。まず、REVERSE関数を使用して column1 列の値を反転させます。次に、SUBSTRING_INDEX関数を使用して、最後のカンマ (,) を含む最初の部分文字列を抽出します。さらに、REVERSE関数を使用して抽出された部分文字列を反転させ、カンマ (,) と column2 列の値を連結して、new_column 列に格納して返します。

    SELECT CONCAT(REVERSE(SUBSTRING_INDEX(REVERSE(first_name), ',', 1)), ',', last_name) AS full_name
    FROM customers;
    

    CASE式を使用する

    CASE式は、条件に応じて異なる値を返すために使用できます。2つの列の値を結合するには、以下のように使用します。

    SELECT
      CASE
        WHEN column1 IS NOT NULL AND column2 IS NOT NULL THEN CONCAT(column1, ' ', column2)
        WHEN column1 IS NOT NULL THEN column1
        ELSE column2
      END AS new_column
    FROM your_table;
    

    このクエリは、your_table テーブルの column1 列と column2 列の値を条件に応じて結合します。column1 列と column2 列の両方に値が存在する場合は、それらをスペースで区切って結合します。一方の列のみ値が存在する場合は、その値のみを返します。

    • 氏名と姓の両方に値が存在する場合は、"姓 名" 形式で結合
    • 氏名のみ存在する場合は、氏名をそのまま返す
    SELECT
      CASE
        WHEN first_name IS NOT NULL AND last_name IS NOT NULL THEN CONCAT(last_name, ' ', first_name)
        WHEN first_name IS NOT NULL THEN first_name
        ELSE last_name
      END AS full_name
    FROM customers;
    

    注意事項

    上記で紹介した方法は、それぞれ異なる用途に適しています。状況に合わせて適切な方法を選択してください


    mysql sql


    MS-Accessで複数テーブルのデータを効率的に扱う: UNIONとORDER BYの活用

    UNION は、複数の SELECT クエリの結果を結合する演算子です。異なるテーブルや異なる条件で取得したデータでも、まとめて一つの結果セットとして扱えます。例:このクエリは、テーブル1 と テーブル2 の全てのデータを取得し、結合します。...


    MySQLの文字コード設定と非ASCII文字: データの整合性を保つために

    MySQLデータベースでは、文字列データは様々な文字コードでエンコードされます。最も一般的なのはASCIIですが、日本語や中国語などの多言語環境では、UTF-8などのマルチバイト文字コードが使用されます。問題となるのは、ASCII文字コードにはない非ASCII文字(特殊文字、絵文字、記号など)がデータベースに混入してしまうことです。これはデータの不整合や表示エラーを引き起こす可能性があります。...


    データベースのパフォーマンスを爆速化!MySQLのインデックスサイズを調査する方法

    インデックスサイズを確認するには、以下の方法があります。INFORMATION_SCHEMA テーブルを使用するMySQL には、INFORMATION_SCHEMA というスキーマが用意されており、データベースに関するさまざまな情報を格納しています。このスキーマには、インデックスのサイズに関する情報も含まれています。...


    【保存版】SQL WHERE句の短絡評価:仕組み、サンプルコード、注意点まとめ

    SQLのWHERE句においても短絡評価が適用される場合がありますが、これはDBMSによって実装が異なります。短絡評価が有効な場合以下の例のように、最初の条件で結果が確定すれば、2番目の条件は評価されません。このクエリの場合、id = 10 が偽であれば、active = TRUE を評価する必要はありません。なぜなら、id = 10 が偽であれば、レコードは存在しないことが確定するためです。...


    SQL Server 2005で前日のデータを取得:サンプルコードと詳細な説明

    このチュートリアルでは、SQL Server 2005を使用して、前日のすべての行を特定の表から選択する方法について説明します。 2つの方法をご紹介します。WHERE 句と DATEADD 関数を使用するLAG 関数を使用する前提条件:SQL Server 2005 へのアクセス...