MySQLの連結関数CONCATの使い方の詳しい説明

MySQLの連結関数CONCATの使い方の詳しい説明

前回の記事では、MySQL の置換関数 (Replace) とセグメンテーション関数 (SubString) を紹介しました。今日は、MySQL のプロフェッショナルな「文字列連結」関数である concat について見てみましょう。いつものように、何か良い提案やアイデアがあれば、コメント欄に書き込んでください。仕事がサボっているときに、その経験を皆さんと共有します〜

1. concat関数のいくつかの使い方

1-1. 関数: concat(str1,str2,…)

concat関数は、通常、SELECTクエリ構文で返されるフィールドの内容を変更するために使用されます。たとえば、次のようなLOLヒーロー情報テーブルがあります。

mysql> `LOL` から * を選択します。
+----+---------------+--------------+-------+
| id | ヒーロータイトル | ヒーロー名 | 価格 |
+----+---------------+--------------+-------+
| 1 | DBlade Shadow | タロン | 6300 |
| 2 | X-Swift スカウト | ティーモ | 6300 |
| 3 | G ラディアント レディ | ルクス | 1350 |
| 4 | F クロックワークスピリット | オリアナ | 6300 |
| 5 | Z 覇道拳 | リー・シン | 6300 |
| 6 | W: ブレードマスター | 簡単 | 450 |
| 7 | J 俊足の剣士 | ヤスオ | 450 |
+----+---------------+--------------+-------+
セット内の行数は 7 です (0.00 秒)

列を返す必要があります: ヒーローのタイトル - ヒーローの名前データ。ここで、次のように concat 関数が使用されます。

`LOL` から CONCAT(hero_title,' - ',hero_name) を full_name, price として選択します。
mysql> SELECT CONCAT(hero_title,' - ',hero_name) as full_name, price from `LOL`;
+------------------------------+-------+
| フルネーム | 価格 |
+------------------------------+-------+
| DBlade Shadow - Talon | 6300 |
| X-Swift スカウト - ティーモ | 6300 |
| G ラディアント レディ - ルクス | 1350 |
| F クロックワークスピリット - オリアナ | 6300 |
| Z 覇道拳 - リー・シン | 6300 |
| W 五覚剣勝 - 簡単 | 450 |
| J 速攻剣士 - ヤスオ | 450 |
+------------------------------+-------+
セット内の行数は 7 です (0.00 秒)

結合されたパラメータに NULL がある場合は、次のように NULL が返されます。

`LOL` から、CONCAT(hero_title,NULL,hero_name) を full_name、price として選択します。
mysql> SELECT CONCAT(hero_title,'NULL',hero_name) as full_name, price from `LOL`;
+---------------------------------+-------+
| フルネーム | 価格 |
+---------------------------------+-------+
| DBlade Shadow NULLTalon | 6300 |
| X-Swift スカウト NULL ティーモ | 6300 |
| G ラディアントレディ NULL ルクス | 1350 |
| F クロックワークスピリット NULL オリアナ | 6300 |
| Z 覇道拳 NULL リー・シン | 6300 |
| W NULL イ | 450 |
| J 速剣の達人 NULL ヤスオ | 450 |
+---------------------------------+-------+
セット内の行数は 7 です (0.00 秒) 

ここに画像の説明を挿入

申し訳ありませんが、上記は私の弟が書いたもので、正しいのは次の通りです。

mysql> SELECT CONCAT(hero_title,NULL,hero_name) as full_name, price from `LOL`;
+-----------+------+
| フルネーム | 価格 |
+-----------+------+
| NULL | 6300 |
| NULL | 6300 |
| NULL | 1350 |
| NULL | 6300 |
| NULL | 6300 |
| NULL | 450 |
| NULL | 450 |
+-----------+------+
セット内の行数は 7 です (0.00 秒)

1-2. 関数: concat_ws(separator,str1,str2,…)

CONCAT_WS() 関数の完全な名前: CONCAT With Separator。これは CONCAT() の特殊な形式です。最初のパラメータ (セパレータ) は、他のパラメータのセパレータです。区切り文字の位置は、連結される 2 つの文字列の間にあります。分隔符可以是一個字符串,也可以是其它字段參數。

以下の点に注意してください。

如果分隔符為NULL,則結果為NULL;但如果分隔符后面的參數為NULL,只會被直接忽略掉,而不會導致結果為NULL。

さて、上記の LOL テーブルを引き続き使用し、フィールドを連結して、カンマで区切ります。

`LOL` から、full_name、price として concat_ws(',',hero_title,hero_name,price) を選択します。
mysql> `LOL` から、concat_ws(',',hero_title,hero_name,price) を full_name、price として選択します。
+---------------------------------+-------+
| フルネーム | 価格 |
+---------------------------------+-------+
| DBlade Shadow、Talon、6300 | 6300 |
| X-Swift Scout、ティーモ、6300 | 6300 |
| G ラディアント レディ、ルクス、1350 | 1350 |
| F クロックワークスピリット、オリアナ、6300 | 6300 |
| Z 覇道拳 リー・シン 6300 | 6300 |
| W ウージュー ソードマスター、簡単、450 | 450 |
| J 俊足の剣士、ヤスオ、450 | 450 |
+---------------------------------+-------+
セット内の行数は 7 です (0.00 秒)

区切り文字の後の連結パラメータが NULL の場合、次のように直接無視され、全体の結果には影響しません。

`LOL` から、full_name、price として concat_ws(',',hero_title,NULL,hero_name) を選択します。
mysql> `LOL` から、concat_ws(',',hero_title,NULL,hero_name) を full_name、price として選択します。
+----------------------------+-------+
| フルネーム | 価格 |
+----------------------------+-------+
| DBlade Shadow、Talon | 6300 |
| X-Swift スカウト、ティーモ | 6300 |
| G ラディアントレディ、ルクス | 1350 |
| F 時計仕掛けの精霊 オリアナ | 6300 |
| Z 覇道拳 リー・シン | 6300 |
| W ウージュー ソードマスター、簡単 | 450 |
| J 俊足の剣士 ヤスオ | 450 |
+----------------------------+-------+
セット内の行数は 7 です (0.00 秒)

区切り文字が NULL の場合、結果は次のように NULL を返します。

`LOL` から、full_name、price として concat_ws(NULL、hero_title、hero_name、price) を選択します。
mysql> `LOL` から、concat_ws(NULL、hero_title、hero_name、price) を full_name、price として選択します。
+-----------+------+
| フルネーム | 価格 |
+-----------+------+
| NULL | 6300 |
| NULL | 6300 |
| NULL | 1350 |
| NULL | 6300 |
| NULL | 6300 |
| NULL | 450 |
| NULL | 450 |
+-----------+------+
セット内の行数は 7 です (0.00 秒)

1-3. 関数: group_concat(expr)

group_concat ( [DISTINCT] フィールド名 [ソートフィールドによる順序 ASC/DESC] [区切り文字 'separator'] )

group_concat 関数は通常、group by を含むクエリ ステートメントで使用されます。group_concat は通常、クエリの戻り結果フィールドに含まれます。

group_concat 関数の式は複雑に見えますか?上記の式を見てみましょう。括弧 [] はオプションであり、使用できるかどうかを示します。

  • 1. [DISTINCT] : スプライシングパラメータの重複排除をサポートします。
  • 2. [Order by] : 連結されたパラメータはソート機能をサポートします。
  • 3. [Separator] : これはよく知られています。「セパレーター」のカスタマイズをサポートしています。設定しない場合、デフォルトではセパレーターなしになります。

さて、楽しいテスト段階に入りましょう。この LOL テーブルをもう一度使用してみましょう。理由は聞かないでください。これが青春なのかもしれない! 5人チームで一晩中プレイしていた年、ビッグドラゴンの戦いの最中にインターネットカフェの停電があったことを今でも覚えています...

ここに画像の説明を挿入

また話題から外れました。 。すみません。

mysql> `LOL` から * を選択します。
+----+---------------+--------------+-------+
| id | ヒーロータイトル | ヒーロー名 | 価格 |
+----+---------------+--------------+-------+
| 1 | DBlade Shadow | タロン | 6300 |
| 2 | X-Swift スカウト | ティーモ | 6300 |
| 3 | G ラディアント レディ | ルクス | 1350 |
| 4 | F クロックワークスピリット | オリアナ | 6300 |
| 5 | Z 覇道拳 | リー・シン | 6300 |
| 6 | W: ブレードマスター | 簡単 | 450 |
| 7 | J 速攻剣豪 | ヤスオ | 450 |
+----+---------------+--------------+-------+
セット内の行数は 7 です (0.00 秒)

たとえば、異なる価格帯のヒーローを区別する必要があります。group_concat を使用しない場合は、それらを区別するために order by を使用する必要がある場合があります。

`LOL` から * を選択し、価格の降順で並べ替えます。
mysql> select * from `LOL` order by price desc;
+----+---------------+---------------+-------+
| id | ヒーロータイトル | ヒーロー名 | 価格 |
+----+---------------+--------------+-------+
| 1 | DBlade Shadow | タロン | 6300 |
| 2 | X-Swift スカウト | ティーモ | 6300 |
| 4 | F クロックワークスピリット | オリアナ | 6300 |
| 5 | Z 覇道拳 | リー・シン | 6300 |
| 3 | G ラディアント レディ | ルクス | 1350 |
| 6 | W: ブレードマスター | 簡単 | 450 |
| 7 | J 速攻剣豪 | ヤスオ | 450 |
+----+---------------+--------------+-------+
セット内の行数は 7 です (0.00 秒)

しかし、これはあまり直感的ではありません。すべての行を確認したいのですが、どうすればよいでしょうか?

SELECT GROUP_CONCAT(hero_title,' - ',hero_name Separator ',' ) as full_name, price 
 `LOL` から GROUP BY price ORDER BY price desc;

現時点では、GROUP_CONCAT 関数を使用すると、この問題を簡単に解決できます。見て、気持ちいいでしょう?

: ここでは、3 つのパラメータ (hero_title、' - '、hero_name) を連結し、区切り文字を ',' に設定し、価格でグループ化し、価格で並べ替えます。効果は以下のとおりです

mysql> SELECT GROUP_CONCAT(hero_title,' - ',hero_name Separator ',' ) as full_name, price from `LOL` GROUP BY price ORDER BY price desc;
+------------------------------------------------------------------------+-------+
| フルネーム | 価格 |
+------------------------------------------------------------------------+-------+
| D ブレードシャドウ - タロン、X スウィフトスカウト - ティーモ、F クロックワーク - オリアナ、Z ハイフィスト - リー・シン | 6300 |
| G ラディアント レディ - ルクス | 1350 |
| W 五覚剣聖 - イー、J 速剣士 - ヤスオ | 450 |
+------------------------------------------------------------------------+-------+
セット内の 3 行 (0.00 秒)

価格を小さいものから大きいものの順に並べ替える場合は、次のように外側の ORDER BY を制御するだけで済みます。

SELECT GROUP_CONCAT(hero_title,' - ',hero_name Separator ',' ) as full_name, price 
  `LOL` から GROUP BY price ORDER BY price asc;
mysql> SELECT GROUP_CONCAT(hero_title,' - ',hero_name Separator ',' ) as full_name, price from `LOL` GROUP BY price ORDER BY price asc;
+--------------------------------------------------------------------------+-------+
| フルネーム | 価格 |
+--------------------------------------------------------------------------+-------+
| W 五覚剣聖 - イー、J 速剣士 - ヤスオ | 450 |
| G ラディアント レディ - ルクス | 1350 |
| D ブレードシャドウ - タロン、X スウィフトスカウト - ティーモ、F クロックワーク - オリアナ、Z ハイフィスト - リー・シン | 6300 |
+--------------------------------------------------------------------------+-------+
セット内の 3 行 (0.00 秒)

では、GROUP_CONCAT 関数で order by ソートをどのように使用するのでしょうか?次のように、hero_title に従ってソートやスプライシングなど、スプライシングされたフィールドをソートするために使用されます。

SELECT GROUP_CONCAT(hero_title,' - ',hero_name order by hero_title Separator ',' ) as full_name, price from `LOL` GROUP BY price ORDER BY price asc;
mysql> SELECT GROUP_CONCAT(hero_title,' - ',hero_name order by hero_title Separator ',' ) as full_name, price from `LOL` GROUP BY price ORDER BY price asc;
+--------------------------------------------------------------------------+-------+
| フルネーム | 価格 |
+--------------------------------------------------------------------------+-------+
| J スイフトブレードマスター - ヤスオ、W インフィニティブレードマスター - イー | 450 |
| G ラディアント レディ - ルクス | 1350 |
| D 刃の影 - タロン、F 機械仕掛けの精霊 - オリアナ、X 素早い偵察 - ティーモ、Z 至高の拳 - リー・シン | 6300 |
+--------------------------------------------------------------------------+-------+
セット内の 3 行 (0.00 秒)

さて、MySQL の concat 関数は依然として非常に便利であることがわかります。同様のニーズや混乱が生じたときに、ぜひご検討ください。あるいは、このブログを見つけて、それが役に立つかもしれません!

MySQL 連結関数 CONCAT の使い方の詳しい説明はこれで終わりです。MySQL 連結関数 CONCAT に関するその他の関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Mybatis でデータを一括更新する 2 つの方法の効率比較の詳細な説明
  • MybatisPlus での @TableField アノテーションの使用に関する詳細な説明
  • Mybatis でバインドタグと連結を使用する手順

<<:  HTMLのテーブルの内容は中央に水平と垂直に表示されます

>>:  Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法

推薦する

MySQLのクラスタモードでのgalera-clusterのデプロイメントの詳細説明

目次1: galera-clusterの紹介2. galera-clusterの仕組み3: Mari...

Vue の基本的な手順の例のグラフィック説明

目次1. v-on指令1. 基本的な使い方2. 糖衣構文3. イベントパラメータ4. イベント修飾子...

画像をMySQLデータベースに保存し、フロントエンドページに表示するための実装コード

目次1. まず、pycharmを使用してDjangoプロジェクトを作成し、関連する環境を設定します。...

垂直方向の中央揃えをエレガントに実現する方法を教えます(推奨)

序文CSS で水平方向と垂直方向に中央揃えする方法はたくさんあります。この記事で紹介する方法は非常に...

Linux にバイナリ MySQL をインストールして MySQL パスワードをクラックする方法

1. システムに必要な libaio ソフトウェアがインストールされていることを確認します。インスト...

MySQL シリーズ 14 MySQL 高可用性実装

1. 内閣府マスターノードを監視することで、他のスレーブノードへの自動フェイルオーバーを実現できます...

Mysql トランザクション分離レベルの読み取りコミットの詳細な説明

MySQL トランザクション分離レベルを表示する mysql> '%isolation...

phpmyadmin を使用して MySQL 権限を設定する方法

目次ステップ 1: root ユーザーとしてログインします。ステップ 2: 新しいデータ テーブルを...

CentOS仮想マシンの時刻を変更する方法

上はシステム時間、下はハードウェア時間です。ここでは変更を加えているので、同じくらいの速さになってい...

Vue+js 矢印をクリックして画像を切り替える

この記事の例では、矢印をクリックして画像を切り替えるVue + jsの具体的なコードを共有しています...

tomcat デプロイメント プロジェクトの実装と IDEA との統合

目次Tomcat でプロジェクトを展開する 3 つの方法プロジェクトをwebappsディレクトリに直...

ウェブデザインにおけるグリッドシステム

グリッドシステムの形成1692年、新しく即位したフランス国王ルイ14世は、フランスの印刷技術のレベル...

Vue ログインページでクッキーを使用してパスワードを 7 日間記憶する方法

問題の説明プロジェクトのログインページでは、7日間パスワードを記憶する必要がある機能があります。この...

CSS で実現される HTML 背景色のグラデーション

エフェクトのスクリーンショット:実装コード:コードをコピーコードは次のとおりです。 <!DOC...

MySQL で 1 つのテーブルのフィールドを使用して別のテーブルのフィールドを更新する方法

1. 1列を変更する 学生の更新、都市c s.city_name = c.name を設定します こ...