当前位置:首页 > 文章列表 > 数据库 > MySQL > 详解MySQL拼接函数CONCAT的使用心得

详解MySQL拼接函数CONCAT的使用心得

来源:脚本之家 2022-12-29 18:56:02 0浏览 收藏

本篇文章给大家分享《详解MySQL拼接函数CONCAT的使用心得》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

前几篇文章给大家介绍了MySQL中的替换函数(Replace)、切分函数(SubString),今天我们一起来看看MySQL专业拼接“字符串”的函数:concat。老规矩,有好的建议和想法,记得写到评论中,等我上班摸鱼时,跟大家一起吃瓜~

一、concat函数相关的几种用法

1-1、函数:concat(str1,str2,…)

concat 函数一般用在SELECT 查询语法中,用于修改返回字段内容,例如有张LOL英雄信息表如下

mysql> select * from `LOL`;
+----+---------------+--------------+-------+
| id | hero_title  | hero_name  | price |
+----+---------------+--------------+-------+
| 1 | D刀锋之影   | 泰隆     | 6300 |
| 2 | X迅捷斥候   | 提莫     | 6300 |
| 3 | G光辉女郎   | 拉克丝    | 1350 |
| 4 | F发条魔灵   | 奥莉安娜   | 6300 |
| 5 | Z至高之拳   | 李青     | 6300 |
| 6 | W无极剑圣   | 易      |  450 |
| 7 | J疾风剑豪   | 亚索     |  450 |
+----+---------------+--------------+-------+
7 rows in set (0.00 sec)

我需要返回一列:英雄称号 - 英雄名称 的数据,这是就用到了concat函数,如下:

SELECT CONCAT(hero_title,' - ',hero_name) as full_name, price from `LOL`;
mysql> SELECT CONCAT(hero_title,' - ',hero_name) as full_name, price from `LOL`;
+------------------------------+-------+
| full_name          | price |
+------------------------------+-------+
| D刀锋之影 - 泰隆       | 6300 |
| X迅捷斥候 - 提莫       | 6300 |
| G光辉女郎 - 拉克丝      | 1350 |
| F发条魔灵 - 奥莉安娜     | 6300 |
| Z至高之拳 - 李青       | 6300 |
| W无极剑圣 - 易        |  450 |
| J疾风剑豪 - 亚索       |  450 |
+------------------------------+-------+
7 rows in set (0.00 sec)

如果拼接的参数中有NULL,则返回NULL;如下:

SELECT CONCAT(hero_title,NULL,hero_name) as full_name, price from `LOL`;
mysql> SELECT CONCAT(hero_title,'NULL',hero_name) as full_name, price from `LOL`;
+-------------------------------+-------+
| full_name           | price |
+-------------------------------+-------+
| D刀锋之影NULL泰隆       | 6300 |
| X迅捷斥候NULL提莫       | 6300 |
| G光辉女郎NULL拉克丝      | 1350 |
| F发条魔灵NULL奥莉安娜     | 6300 |
| Z至高之拳NULL李青       | 6300 |
| W无极剑圣NULL易        |  450 |
| J疾风剑豪NULL亚索       |  450 |
+-------------------------------+-------+
7 rows in set (0.00 sec)

在这里插入图片描述

不好意思,上面是我弟弟写的,正确的如下:

mysql> SELECT CONCAT(hero_title,NULL,hero_name) as full_name, price from `LOL`;
+-----------+-------+
| full_name | price |
+-----------+-------+
| NULL   | 6300 |
| NULL   | 6300 |
| NULL   | 1350 |
| NULL   | 6300 |
| NULL   | 6300 |
| NULL   |  450 |
| NULL   |  450 |
+-----------+-------+
7 rows in set (0.00 sec)

1-2、函数:concat_ws(separator,str1,str2,…)

  CONCAT_WS() 函数全称: CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数(separator)是其它参数的分隔符。分隔符的位置在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它字段参数。

需要注意的是:

  如果分隔符为 NULL,则结果为 NULL;但如果分隔符后面的参数为NULL,只会被直接忽略掉,而不会导致结果为NULL。

好了,我们依旧用上面的LOL表,连接各字段,以逗号分隔:

select concat_ws(',',hero_title,hero_name,price) as full_name, price from `LOL`;
mysql> select concat_ws(',',hero_title,hero_name,price) as full_name, price from `LOL`;
+---------------------------------+-------+
| full_name            | price |
+---------------------------------+-------+
| D刀锋之影,泰隆,6300       | 6300 |
| X迅捷斥候,提莫,6300       | 6300 |
| G光辉女郎,拉克丝,1350      | 1350 |
| F发条魔灵,奥莉安娜,6300     | 6300 |
| Z至高之拳,李青,6300       | 6300 |
| W无极剑圣,易,450        |  450 |
| J疾风剑豪,亚索,450       |  450 |
+---------------------------------+-------+
7 rows in set (0.00 sec)

分隔符后的拼接参数为NULL时,直接忽略,不会影响整体结果,如下:

select concat_ws(',',hero_title,NULL,hero_name) as full_name, price from `LOL`;
mysql> select concat_ws(',',hero_title,NULL,hero_name) as full_name, price from `LOL`;
+----------------------------+-------+
| full_name         | price |
+----------------------------+-------+
| D刀锋之影,泰隆       | 6300 |
| X迅捷斥候,提莫       | 6300 |
| G光辉女郎,拉克丝      | 1350 |
| F发条魔灵,奥莉安娜     | 6300 |
| Z至高之拳,李青       | 6300 |
| W无极剑圣,易        |  450 |
| J疾风剑豪,亚索       |  450 |
+----------------------------+-------+
7 rows in set (0.00 sec)

分隔符为NULL时,结果返回NULL,如下:

select concat_ws(NULL,hero_title,hero_name,price) as full_name, price from `LOL`;
mysql> select concat_ws(NULL,hero_title,hero_name,price) as full_name, price from `LOL`;
+-----------+-------+
| full_name | price |
+-----------+-------+
| NULL   | 6300 |
| NULL   | 6300 |
| NULL   | 1350 |
| NULL   | 6300 |
| NULL   | 6300 |
| NULL   |  450 |
| NULL   |  450 |
+-----------+-------+
7 rows in set (0.00 sec)

1-3、函数:group_concat(expr)

group_concat ( [DISTINCT] 字段名 [order by 排序字段 ASC/DESC] [Separator ‘分隔符'] )

  group_concat函数通常用于有group by的查询语句,group_concat一般包含在查询返回结果字段中。

  是不是group_concat函数的公式看着还挺复杂的?我们一起看看,上方公式中 [] 括号是可选项,表示可用可不用;

  • 1.[DISTINCT]:对拼接的参数支持去重功能;
  • 2.[Order by]:拼接的参数支持排序功能;
  • 3.[Separator]:这个你很熟悉了,支持自定义'分隔符',如不设置默认为无分隔符;

  好了,下面让我们来进入开心的测试环节吧~ 还是用这张LOL表,别问为什么。或许这就是青春吧!还记的那年通宵五排,大龙团的时候网吧停电了…

在这里插入图片描述

又跑题了。。不好意思。

mysql> select * from `LOL`;
+----+---------------+--------------+-------+
| id | hero_title  | hero_name  | price |
+----+---------------+--------------+-------+
| 1 | D刀锋之影   | 泰隆     | 6300 |
| 2 | X迅捷斥候   | 提莫     | 6300 |
| 3 | G光辉女郎   | 拉克丝    | 1350 |
| 4 | F发条魔灵   | 奥莉安娜   | 6300 |
| 5 | Z至高之拳   | 李青     | 6300 |
| 6 | W无极剑圣   | 易      |  450 |
| 7 | J疾风剑豪   | 亚索     |  450 |
+----+---------------+--------------+-------+
7 rows in set (0.00 sec)

  举个场景,我们要区分出各个价格段的英雄来,如果不用group_concat的话,或许只能用order by区分了。

select * from `LOL` order by price desc;
mysql> select * from `LOL` order by price desc;
+----+---------------+--------------+-------+
| id | hero_title  | hero_name  | price |
+----+---------------+--------------+-------+
| 1 | D刀锋之影   | 泰隆     | 6300 |
| 2 | X迅捷斥候   | 提莫     | 6300 |
| 4 | F发条魔灵   | 奥莉安娜   | 6300 |
| 5 | Z至高之拳   | 李青     | 6300 |
| 3 | G光辉女郎   | 拉克丝    | 1350 |
| 6 | W无极剑圣   | 易      |  450 |
| 7 | J疾风剑豪   | 亚索     |  450 |
+----+---------------+--------------+-------+
7 rows in set (0.00 sec)

但是这样很不直观啊,我想一行都看到,怎么办?

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

这时GROUP_CONCAT函数就轻松的帮你解决了这个问题。看,舒服不~

注释:这里我是拼接了(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;
+------------------------------------------------------------------------+-------+
| full_name                               | price |
+------------------------------------------------------------------------+-------+
| D刀锋之影 - 泰隆,X迅捷斥候 - 提莫,F发条魔灵 - 奥莉安娜,Z至高之拳 - 李青     | 6300 |
| G光辉女郎 - 拉克丝                            | 1350 |
| W无极剑圣 - 易,J疾风剑豪 - 亚索                      |  450 |
+------------------------------------------------------------------------+-------+
3 rows in set (0.00 sec)

如果按价格(price)从小到大排序,只需控制外层ORDER BY即可,如下:

SELECT GROUP_CONCAT(hero_title,' - ',hero_name Separator ',' ) as full_name, price 
  from `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;
+-------------------------------------------------------------------------+-------+
| full_name                                | price |
+-------------------------------------------------------------------------+-------+
| W无极剑圣 - 易,J疾风剑豪 - 亚索                      |  450 |
| G光辉女郎 - 拉克丝                            | 1350 |
| D刀锋之影 - 泰隆,X迅捷斥候 - 提莫,F发条魔灵 - 奥莉安娜,Z至高之拳 - 李青     | 6300 |
+-------------------------------------------------------------------------+-------+
3 rows in set (0.00 sec)

  那么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;
+-------------------------------------------------------------------------+-------+
| full_name                                | price |
+-------------------------------------------------------------------------+-------+
| J疾风剑豪 - 亚索,W无极剑圣 - 易                       |  450 |
| G光辉女郎 - 拉克丝                            | 1350 |
| D刀锋之影 - 泰隆,F发条魔灵 - 奥莉安娜,X迅捷斥候 - 提莫,Z至高之拳 - 李青     | 6300 |
+-------------------------------------------------------------------------+-------+
3 rows in set (0.00 sec)

  好了,可以看出,MySQL中的concat拼接函数还是很好用的,希望你在有类似的需求或困惑时,想到它!或者能找到这篇博客,帮到你!

今天关于《详解MySQL拼接函数CONCAT的使用心得》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
详解DBeaver连接MySQL8以上版本以及解决可能遇到的问题详解DBeaver连接MySQL8以上版本以及解决可能遇到的问题
上一篇
详解DBeaver连接MySQL8以上版本以及解决可能遇到的问题
MySQL的Flush-List和脏页的落盘机制
下一篇
MySQL的Flush-List和脏页的落盘机制
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    95次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    89次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    105次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    98次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    96次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码