在mysql中,concat、concat_ws和GROUP_CONCAT

CONCAT函数

在mysql中,concat函数的作用是将多个字符串连接成一个字符串

语法:

1
CONCAT(str1,str2,...)

案例:

1
SELECT CONCAT("奶油","蛋糕")

输出

1
奶油蛋糕

即将字符串”奶油“和”蛋糕“拼接成”奶油蛋糕“

但是,必须保证concat中所有参数都不为null,但凡有一个为null,则返回值为null

1
SELECT CONCAT("奶油","蛋糕",null)

输出

1
null

如果用于模糊查询

1
SELECT * FROM `students` WHERE grade like CONCAT("%","一","%")

CONCAT_WS函数

语法

1
CONCAT_WS(separator,str1,str2,...)

separator 为指定分隔符,且必须放在第一个

案例

1
SELECT CONCAT_WS("-","湖北省","武汉市")

输出

1
湖北省-武汉市

分隔符不能为null,否则返回null

1
SELECT CONCAT_WS(NULL,"湖北省","武汉市")

返回

1
null

但是字符串可以为null,为null则不拼接

1
SELECT CONCAT_WS("-","湖北省",null,"武汉市")

返回

1
湖北省-武汉市

为了方便后面练习,请输入下列sql建表

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `students` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR ( 255 ) CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`age` INT NULL DEFAULT NULL,
`grade` VARCHAR ( 255 ) CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '年级',
`class` VARCHAR ( 255 ) CHARACTER
SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '班',
PRIMARY KEY ( `id` ) USING BTREE
) ENGINE = INNODB AUTO_INCREMENT = 3 CHARACTER
SET = utf8mb4

再插入几条数据

1
2
3
4
5
6
7
INSERT INTO students ( `name`, age, grade, class )
VALUES
( "张三", 7, "一年级", "一班" ),
( "李四", 7, "一年级", "二班" ),
( "王五", 8, "一年级", "三班" ),
( "张三", 10, "二年级", "一班" ),
( "钱七", 10, "二年级", "二班" )

GROUP_CONCAT函数

语法

1
2
3
4
5
GROUP_CONCAT(
[DISTINCT] expr [, expr2 ...]
[ ...]
[SEPARATOR separator]
)

参数详解:

**expr [, expr2 …] :**必须写。指定要连接的一个或者多个列或者表达式

**ORDER BY:**可选。对连接内容进行排序

**SEPARATOR separator:**可选。separator 连接符。默认是 ,

但是我们通常在mysql中用如下方式使用group_concat()函数

1
2
3
4
SELECT GROUP_CONCAT(expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];

案例一:

1
2
3
4
SELECT
GROUP_CONCAT( NAME SEPARATOR "-" )
FROM
students

输出

1
张三-李四-王五-赵六-钱七

案例二:

根据年龄排序串联

1
2
3
4
SELECT
GROUP_CONCAT( NAME ORDER BY age SEPARATOR "-" )
FROM
students

输出

1
李四-张三-王五-钱七-赵六

案例三:

1
2
3
4
5
6
7
SELECT
`name`,
GROUP_CONCAT( grade, class ORDER BY age SEPARATOR "/" ) as "教室"
FROM
students
GROUP BY
`name`

输出

name 教室
张三 一年级一班/二年级一班
李四 一年级二班
王五 一年级三班
钱七 二年级二班

这里,我们在 GROUP_CONCAT() 函数中传入了多个列。但是需要注意,班级和年级之间直接拼到了一起,中间并没有连接符

如果我们需要在年级和班级之间加一个连接符,则需要按如下来写

1
2
3
4
5
6
7
SELECT
`name`,
GROUP_CONCAT( CONCAT(grade,"-"), class ORDER BY age SEPARATOR "/" ) AS "教室"
FROM
students
GROUP BY
`name`

或者

1
2
3
4
5
6
7
SELECT
`name`,
GROUP_CONCAT( CONCAT_WS( "-", grade, class ) ORDER BY age SEPARATOR "/" ) AS "教室"
FROM
students
GROUP BY
`name`

输出

name 教室
张三 一年级-一班/二年级-一班
李四 一年级-二班
王五 一年级-三班
钱七 二年级-二班