mysql group_concat函数_mysql之group_concat函数

mysql之group_concat函数

在介绍GROUP_CONCAT之前,我们先来看看concat()函数和concat_ws()函数。

先准备一个测试数据库:

mysql> select * from scores;

+----+----------+-------+

| id | name | score |

+----+----------+-------+

| 1 | zhangsan | 100 |

| 2 | lisi | 90 |

| 3 | wangwu | 99 |

| 4 | zhangsan | 92 |

| 5 | zhangsan | 88 |

| 6 | lisi | 89 |

+----+----------+-------+

6 rows in set

concat()函数

concat()函数的功能是将多个字符连接成一个字符串。

语法: concat(str1, str2,...)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

mysql> select *,concat(name,score) from scores;

+----+----------+-------+--------------------+

| id | name | score | concat(name,score) |

+----+----------+-------+--------------------+

| 1 | zhangsan | 100 | zhangsan100 |

| 2 | lisi | 90 | lisi90 |

| 3 | wangwu | 99 | wangwu99 |

| 4 | zhangsan | 92 | zhangsan92 |

| 5 | zhangsan | 88 | zhangsan88 |

| 6 | lisi | 89 | lisi89 |

+----+----------+-------+--------------------+

6 rows in set

-- 加分隔符 & 起别名

mysql> select *,concat(name,':',score) as info from scores;

+----+----------+-------+--------------+

| id | name | score | info |

+----+----------+-------+--------------+

| 1 | zhangsan | 100 | zhangsan:100 |

| 2 | lisi | 90 | lisi:90 |

| 3 | wangwu | 99 | wangwu:99 |

| 4 | zhangsan | 92 | zhangsan:92 |

| 5 | zhangsan | 88 | zhangsan:88 |

| 6 | lisi | 89 | lisi:89 |

+----+----------+-------+--------------+

6 rows in set

concat_ws()函数

concat()函数加分隔符比较麻烦,如果有10个字段连接起来,就得写9个分隔符,concat_ws()函数就是为了解决这个问题。concat_ws就是concat with separator。

语法: concat_ws(separator, str1, str2, ...)

第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

mysql> select *,concat_ws(':',name,score) as info from scores;

+----+----------+-------+--------------+

| id | name | score | info |

+----+----------+-------+--------------+

| 1 | zhangsan | 100 | zhangsan:100 |

| 2 | lisi | 90 | lisi:90 |

| 3 | wangwu | 99 | wangwu:99 |

| 4 | zhangsan | 92 | zhangsan:92 |

| 5 | zhangsan | 88 | zhangsan:88 |

| 6 | lisi | 89 | lisi:89 |

+----+----------+-------+--------------+

6 rows in set

group_concat函数

明白了concat()和concat_ws()函数,我们来看一下GROUP_CONCAT()函数。它的功能就是将group by产生的同一个分组中的值连接起来,返回一个字符串结果。如果单独使用,那么就将指定字段所有的值连接起来。

语法:

group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ][separator '分隔符'] )

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

我们知道可以使用group by语句对结果进行分组处理:

mysql> select * from scores group by name;

+----+----------+-------+

| id | name | score |

+----+----------+-------+

| 2 | lisi | 90 |

| 3 | wangwu | 99 |

| 1 | zhangsan | 100 |

+----+----------+-------+

3 rows in set

但是我们只能看到zhangsan的第一个成绩,如果我想看到所有的成绩呢?

mysql> select *,group_concat(score) from scores group by name;

+----+----------+-------+---------------------+

| id | name | score | group_concat(score) |

+----+----------+-------+---------------------+

| 2 | lisi | 90 | 90,89 |

| 3 | wangwu | 99 | 99 |

| 1 | zhangsan | 100 | 100,92,88 |

+----+----------+-------+---------------------+

3 rows in set

-- 将分组结果按升序排序,并使用分隔符 :

mysql> select *,group_concat(score order by score separator ':') from scores group by name;

+----+----------+-------+--------------------------------------------------+

| id | name | score | group_concat(score order by score separator ':') |

+----+----------+-------+--------------------------------------------------+

| 2 | lisi | 90 | 89:90 |

| 3 | wangwu | 99 | 99 |

| 1 | zhangsan | 100 | 88:92:100 |

+----+----------+-------+--------------------------------------------------+

3 rows in set

-- 上面展示了以name分组后所有的score,现在多加展示一个id

mysql> select *,group_concat(concat_ws(':',id,score) order by id) from scores group by name;

+----+----------+-------+---------------------------------------------------+

| id | name | score | group_concat(concat_ws(':',id,score) order by id) |

+----+----------+-------+---------------------------------------------------+

| 2 | lisi | 90 | 2:90,6:89 |

| 3 | wangwu | 99 | 3:99 |

| 1 | zhangsan | 100 | 1:100,4:92,5:88 |

+----+----------+-------+---------------------------------------------------+

3 rows in set

-- 单独使用

mysql> select group_concat(score) from scores;

+---------------------+

| group_concat(score) |

+---------------------+

| 100,90,99,92,88,89 |

+---------------------+

1 row in set

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值