MySQLで文字列結合する方法とは?使用方法や用例を紹介

- システム
エンジニア - MySQLでの文字列結合について、教えてください。
- プロジェクト
マネージャー - では、3つの文字列結合の手段について見ていきましょう。
MySQLでの文字列結合とは?
MySQLには指定した情報、文字列を結合して文字列として返す、文字列結合という機能、関数があります。
この文字列結合機能を使うことで、MySQL内の情報を連結して1つの情報として表示することができます。
この記事では文字列結合をするための方法を紹介します。
MySQLで文字列結合する方法は1つだけ?
MySQLで文字列結合する手段は3つあります。
それは、文字列関数の「CONCAT」を使う方法と、集約関数「GROUP_CONCAT」を使う方法と、ダブルパイプ(||)演算子を使って結合する方法、この3種類があります。
ただし後者のダブルパイプを使う方法は詳しくは後述しますが「sql_mode」の設定を変えることになるので使用するときは注意しましょう。
文字列結合関数「CONCAT」とは
「CONCAT」とは、引数を指定することでその引数を文字列結合された結果の文字列を返す、MySQLでの文字列結合の関数です。
MySQLではこの関数を使うことで、文字列結合を行うことができます。
文字列結合関数「CONCAT」の使い方
CONCATの書式は以下となります。
CONCAT( 文字列1, 文字列2, ・・・文字列N )
このように、関数の中に結合したい情報(文字列)をカンマ区切りで並べることでその文字列たちが順番に文字列結合された文字列が返されます。
MySQLでは一番標準的な文字列結合の方法です。
CONCAT関数を使用することで文字列結合をすることができます。引数は1つ以上を持つ必要があります。
1.引数が文字列だった場合
1
2
|
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
|
2.引数に数値が含まれている場合
1
2
|
mysql> SELECT CONCAT(1, 2, 3);
-> '123'
|
3.引数にNULLが含まれている場合
1
2
|
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
|
このように、NULLが含まれているとNULLが返ってきてしまうので、IFNULL()関数などを使って回避するのが良いでしょう。
文字列結合関数「CONCAT」でテーブルの列から文字列結合するには
name_listID | family_name | given_name | year | month | day |
---|---|---|---|---|---|
1 | 山田 | 太郎 | 1999 | 01 | 20 |
2 | 田中 | 次郎 | 2010 | 12 | 31 |
上記のようなテーブルがあったとき、「姓」と「名」を繋げて、氏名としたい場合はどうすればいいでしょう。
これも文字列結合関数「CONCAT」を使うこと可能となります。
1
2
3
|
mysql> SELECT CONCAT(family_name , given_name) from name_list;
-> '山田太郎'
-> '田中次郎'
|
また、yearとmonthとdayを繋げて、「年月日」にすることも可能です。CONCATでは、列指定と文字列を併用して文字列結合することが可能です。
1
2
3
|
mysql> SELECT CONCAT(year, '/' , month , '/' , day) from name_list;
-> '1999/01/20'
-> '2010/12/31'
|
また、CONCATはSELECT句だけではなく、WHERE句などにも使うことができます。
1
2
|
mysql> SELECT family_name from name_list WHERE CONCAT(year, month) = '201012';
-> '田中'
|
ただし通常この方法だと索引が使われないため、あまりお勧めしません。
集約関数「GROUP_CONCAT」とは
GROUP_CONCATとは、テーブルの指定した列を指定の順番で並べて、指定の文字で連結していく文字列結合関数です。
厳密には文字列結合関数とは違うのですが、CONCATを「列の結合」、GROUP_CONCATを「行の結合」と考えると似ているので紹介します。
集合関数「GROUP_CONCAT」の使い方
GROUP_CONCATの書式は以下となります。
1
2
3
4
|
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
|
指定した列を、ORDER BYで指定した順に並べ、SEPARATORで指定した文字列で結合した文字列を返す。という関数になります。
実際の使用例を上げていきましょう。
score_listID | family_name | given_name | score |
---|---|---|---|
1 | 山田 | 太郎 | 98 |
2 | 田中 | 次郎 | 70 |
3 | 山田 | 太郎 | 85 |
上記のようなテーブルがあった場合、同じfamily_nameでまとめ、scoreをカンマ区切りにして文字列結合するときは以下の方法を取ります。
1
2
3
4
5
|
mysql> SELECT family_name
-> , GROUP_CONCAT(score SEPARATOR ',')
-> FROM score_list;
-> '山田' | '98,85'
-> '鈴木' | '70'
|
また、scoreの昇順で並べることも可能です。
1
2
3
4
5
|
mysql> SELECT family_name
-> , GROUP_CONCAT(score ORDER BY score DESC SEPARATOR ',')
-> FROM score_list;
-> '山田' | '85,98'
-> '鈴木' | '70'
|
また前述のCONCATとも組み合わせることもできます。
1
2
3
4
5
|
mysql> SELECT CONCAT(family_name , given_name)
-> , GROUP_CONCAT(score ORDER BY score SEPARATOR ',')
-> FROM score_list;
-> '山田太郎' | '98,85'
-> '鈴木次郎' | '70'
|
このようにしてMySQLではデータをカンマ区切りにしてデータ取得をすることができます。
ダブルパイプ(||)演算子を使って結合する方法
Oracleなどで使われる文字列結合の方法としてダブルパイプ(||)を使って文字列結合する方法がありますが、MySQLではダブルパイプは「OR」演算子として使用されるため、「CONCAT」の代用としては使用することができません。
ただし特定の設定を行うことでCONCATの代用として使用することができるようになります。
以下ではその方法を説明します。
ダブルパイプ演算子をCONCATとして使えるようにするには
ダブルパイプでCONCATと同じく文字列結合の機能にするためには、以下のコマンドを実行します。
1
|
mysql>SET @@session.sql_mode='PIPES_AS_CONCAT';
|
このコマンドを実行することで、MySQLでOracleと同様にダブルパイプで文字列結合が可能となります。
1
2
|
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
|
1
2
|
mysql> SELECT 'My' || 'S' || 'QL';
-> 'MySQL'
|
このコマンドはセッション中のみ生きる設定で、MySQLを再起動すると無効になります。
設定ファイル(my.ini等)に記述しておくことで常時反映される設定値として動作するため、再起動しても反映された状態となって常に使用可能となります。
ただしこの方法は本来の「OR」の代用として使っているダブルパイプの機能も機能しなくなるため(CONCATの機能になる)、当初の「OR」として使用している機能があると動作しなくなります。システム全体として利用するには考えた上で実施しましょう。
- システム
エンジニア - それぞれの関数を使い分けて、複数のレコードの結合に対応できますね。
- プロジェクト
マネージャー - 非常に便利な関数ですので、ぜひマスターして活用してください。
MySQLでの文字列結合についてまとめ
この記事ではMySQLでの文字列結合について説明しました。
列や指定文字列を結合する「CONCAT」と、指定列を指定の文字でレコード(行)で結合する「GROUP_CONCAT」は、情報を整理したり、欲しい情報でのデータ出力をする際に非常に役立つ関数です。
これらの関数をうまく使いこなして、効率的なMySQLプログラマーになりましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)