mysql函数concat与group_concat使用说明

本文介绍了MySQL中三种常用的字符串拼接函数:concat(), concat_ws() 和 group_concat() 的使用方法及注意事项。通过实例展示了如何利用这些函数进行字符串的拼接操作,并解释了group_concat()函数在聚合查询中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.concat()函数

使用方法:concat(str1,str2,…)
返回的结果为连接参数产生的字符串,如有任何一个参数为null,则返回值为null

注意:
如果所有参数均为非二进制字符串,则结果为非二进制字符串
如果自变量中含有任一二进制字符串,则结果为二进制字符串
一个数字参数被转为与之相等的二进制字符串格式,如要避免这种情况,可使用显式类型cast

例如:

select concat(cast(int_col as char), char_col);

使用例子:
1.字段两端加上’,’

mysql> select concat(',',name,',') from `user`;
+--------------------------+
| concat(',',fdipzone,',') |
+--------------------------+
| ,fdipzone,               |
+--------------------------+
1 row in set (0.00 sec)



2.其中有一个参数为null

mysql> select concat(null,name) from `user`;
+-------------------+
| concat(null,name) |
+-------------------+
| NULL              |
+-------------------+
1 row in set (0.00 sec)


2.concat_ws() 函数

使用方法:concat_ws(separator,str1,str2,…)

concat_ws()函数是concat()函数的特殊形式,第一个参数是其他参数的分隔符。分隔符的位置在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其他参数。
如果分隔符为null,则结果为null。
函数会忽略任何分隔符参数后的null值,但concat_ws()不会忽略任何空字符串。

使用例子:
1.使用’,’分隔多个字段

mysql> select concat_ws(',',country_code,phone,region) from `user`;
+------------------------------------------+
| concat_ws(',',country_code,phone,region) |
+------------------------------------------+
| 86,13794830550,GZ                        |
+------------------------------------------+
1 row in set (0.00 sec)



2.分隔符为null

mysql> select concat_ws(null,country_code,phone,region) from `user`;
+-------------------------------------------+
| concat_ws(null,country_code,phone,region) |
+-------------------------------------------+
| NULL                                      |
+-------------------------------------------+
1 row in set (0.00 sec)



3.参数中有null与空字符串

mysql> select concat_ws(',',country_code,phone,null,region,'',grade) from `user`;
+--------------------------------------------------------+
| concat_ws(',',country_code,phone,null,region,'',grade) |
+--------------------------------------------------------+
| 86,13794830550,GZ,,200                                 |
+--------------------------------------------------------+
1 row in set (0.00 sec)


3.group_concat()函数

使用方法:GROUP_CONCAT([DISTINCT] expr [,expr …]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col …]]
[SEPARATOR str_val])

group_concat可以得到表达式结合体的连结值,使用distinct可以排除重复值。使用order by子句可以排序。
separator是一个字符串,用于分隔结果集中每个元素。默认是逗号,可以通过指定separator “”完全移除这个分隔符。

使用例子:

表结构

CREATE TABLE `article_in_category` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `article_id` int(11) unsigned NOT NULL,
 `category_id` int(11) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `article_id_INDEX` (`article_id`),
 KEY `category_id_INDEX` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据:

INSERT INTO `article_in_category` (`id`, `article_id`, `category_id`) VALUES (NULL, '1', '1'),
(NULL, '1', '2'),(NULL, '1', '3'),(NULL, '2', '4'),(NULL, '2', '3'),(NULL, '2', '5'),(NULL, '3', '1'),
(NULL, '3', '5'),(NULL, '3', '6'),(NULL, '4', '8');
mysql> select * from `article_in_category`;
+----+------------+-------------+
| id | article_id | category_id |
+----+------------+-------------+
|  1 |          1 |           1 |
|  2 |          1 |           2 |
|  3 |          1 |           3 |
|  4 |          2 |           4 |
|  5 |          2 |           3 |
|  6 |          2 |           5 |
|  7 |          3 |           1 |
|  8 |          3 |           5 |
|  9 |          3 |           6 |
| 10 |          4 |           8 |
+----+------------+-------------+

获取文章的id及所有分类id

mysql> select article_id,group_concat(category_id order by category_id asc) from `article_in_category` group by article_id;
+------------+----------------------------------------------------+
| article_id | group_concat(category_id order by category_id asc) |
+------------+----------------------------------------------------+
|          1 | 1,2,3                                              |
|          2 | 3,4,5                                              |
|          3 | 1,5,6                                              |
|          4 | 8                                                  |
+------------+----------------------------------------------------+
4 rows in set (0.00 sec)

注意:group_concat()函数对返回的结果有长度限制,默认为1024字节

查看group_concat返回值最大长度

mysql> show global variables like '%group_concat_max_len%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| group_concat_max_len | 1024  |
+----------------------+-------+

修改group_concat返回值最大长度

mysql> set global group_concat_max_len=2048;
Query OK, 0 rows affected (0.03 sec)

mysql> show global variables like '%group_concat_max_len%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| group_concat_max_len | 2048  |
+----------------------+-------+
MySQL中的 `CONCAT` 和 `GROUP_CONCAT` 是两个常用的字符串处理函数,它们分别用于不同的场景,并且在功能和使用方式上有显著区别。 ### 1. `CONCAT` 函数 `CONCAT` 用于将多个字符串连接成一个单一的字符串。如果任意一个参数为 `NULL`,则整个结果也会是 `NULL`。该函数通常用于单条记录的字段拼接操作。 例如,可以将公司的名称和部门名称组合在一起显示: ```sql SELECT CONCAT(c.company_name, '-', d.dept_name) AS company_dept_name FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id; ``` 此查询会返回每一条记录中公司名部门名通过短横线 `-` 拼接后的结果[^1]。 ### 2. `GROUP_CONCAT` 函数 `GROUP_CONCAT` 是一种聚合函数,主要用于在包含 `GROUP BY` 的查询中,将分组内的多行数据拼接成一个单独的字符串,默认使用逗号 `,` 作为分隔符。可以通过 `SEPARATOR` 关键字指定自定义的分隔符[^3]。 例如,当需要将每个公司的所有部门名称合并成一个字段时,可以使用如下查询: ```sql SELECT c.company_id, GROUP_CONCAT(DISTINCT d.dept_name SEPARATOR ',') AS dept_names FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id GROUP BY c.company_id; ``` 此查询的结果中,每个 `company_id` 对应的所有 `dept_name` 会被拼接成一个由逗号分隔的字符串[^1]。 ### 3. 主要区别 - **用途不同**: `CONCAT` 用于拼接同一行中的多个字段值;而 `GROUP_CONCAT` 用于将多行数据的某一字段值进行拼接。 - **是否属于聚合函数**: `GROUP_CONCAT` 是聚合函数,通常 `GROUP BY` 配合使用;而 `CONCAT` 不是聚合函数,适用于每一行的字段拼接。 - **处理 NULL 值的方式**: 如果 `CONCAT` 中的任一参数为 `NULL`,则整个结果也为 `NULL`;而 `GROUP_CONCAT` 会忽略 `NULL` 值,不会将其纳入拼接结果中。 - **分组影响**: `GROUP_CONCAT` 必须配合 `GROUP BY` 使用,否则可能无法达到预期效果;而 `CONCAT` 不受分组影响,仅作用于当前行的数据。 ### 示例对比 假设表结构如下: #### 表 `sys_company`: | company_id | company_name | |------------|--------------| | 1 | Company A | | 2 | Company B | #### 表 `sys_dept`: | dept_id | dept_name | company_id | |---------|------------|------------| | 1 | HR | 1 | | 2 | Finance | 1 | | 3 | IT | 2 | #### 使用 `CONCAT` 查询: ```sql SELECT CONCAT(c.company_name, '-', d.dept_name) AS company_dept_name FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id; ``` **输出示例:** | company_dept_name | |---------------------| | Company A-HR | | Company A-Finance | | Company B-IT | #### 使用 `GROUP_CONCAT` 查询: ```sql SELECT c.company_id, GROUP_CONCAT(d.dept_name SEPARATOR ',') AS dept_names FROM sys_company c LEFT JOIN sys_dept d ON c.company_id = d.company_id GROUP BY c.company_id; ``` **输出示例:** | company_id | dept_names | |------------|--------------------| | 1 | HR,Finance | | 2 | IT | ### 注意事项 - `GROUP_CONCAT` 的结果长度受系统变量 `group_concat_max_len` 限制,默认值为 1024 字节。如需支持更长的字符串,可调整该值: ```sql SET SESSION group_concat_max_len = 1000000; ``` -使用 `GROUP_CONCAT` 时,建议加上 `DISTINCT` 来避免重复值被拼接进去,提高结果准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值