在 MySQL 中拼接字符串是一个非常常见的操作,主要用于查询时动态组合多个字段或值。以下是几种最核心和常用的方法。
-
CONCAT(str1, str2, ...)
这是最通用、最常用的字符串拼接函数。它接受两个或多个字符串参数,并将它们按顺序连接成一个字符串。
如果参数中有 NULL,则 CONCAT 的结果为 NULL。这是最重要的一点。
SELECT CONCAT('Hello', ' ', 'World') AS greeting; -- 结果: 'Hello World' SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users; -- 结果: 将 first_name 和 last_name 用空格连接起来 SELECT CONCAT('User ID: ', id, ', Name: ', name) AS user_info FROM users; -- 结果: 'User ID: 1, Name: John Doe' SELECT CONCAT('Hello', NULL, 'World'); -- 结果: NULL (因为有一个参数是NULL)
-
CONCAT_WS(separator, str1, str2, ...)
WS 是 With Separator 的缩写。这个函数用一个指定的分隔符将多个字符串连接起来。它最大的优点是会自动忽略 NULL 值,而不会导致整个结果变为 NULL。
SELECT CONCAT_WS(' ', 'Hello', 'World') AS greeting; -- 结果: 'Hello World' (效果和CONCAT一样) SELECT CONCAT_WS(', ', last_name, first_name) AS full_name FROM users; -- 结果: 'Doe, John' SELECT CONCAT_WS('-', '2023', NULL, '10') AS date_str; -- 结果: '2023-10' (NULL值被忽略,分隔符仍然存在) -- 如果用 CONCAT('2023', NULL, '10') 结果会是 NULL SELECT CONCAT_WS(NULL, 'Hello', 'World'); -- 结果: NULL (因为分隔符是NULL)
处理 NULL 值:使用 IFNULL() 或 COALESCE()
为了避免 CONCAT 因为 NULL 值而返回 NULL,可以先用函数将 NULL 转换成一个空字符串 '' 或其他默认值。
IFNULL(expr1, replacement_value):如果 expr1 不是 NULL,则返回 expr1;否则返回 replacement_value。
COALESCE(value1, value2, ...):返回参数列表中第一个非 NULL 的值。
假设 middle_name 字段可能为 NULL。
-- 如果middle_name为NULL,就用空字符串代替 SELECT CONCAT( first_name, ' ', IFNULL(middle_name, ''), ' ', last_name ) AS full_name FROM users; -- 使用 COALESCE 实现同样效果 SELECT CONCAT( first_name, ' ', COALESCE(middle_name, ''), ' ', last_name ) AS full_name FROM users;
这个函数用于将分组后多行记录的某个字段值,拼接成一个字符串。通常与 GROUP BY 子句一起使用。
GROUP_CONCAT([DISTINCT] column_name [ORDER BY ...] [SEPARATOR 'sep'])
SEPARATOR: 指定分隔符,默认为逗号 ,。
假设有一个 orders 表,一个用户 (user_id) 可能有多个订单 (order_id)。
-- 查询每个用户的所有订单号,合并成一个用逗号分隔的字符串 SELECT user_id, GROUP_CONCAT(order_id) AS all_orders FROM orders GROUP BY user_id; -- 结果可能如下: -- user_id | all_orders -- 1 | 1001,1005,1009 -- 2 | 1002,1004 -- 去重并使用不同的分隔符 SELECT user_id, GROUP_CONCAT(DISTINCT product_name ORDER BY product_name SEPARATOR ' | ') AS products FROM order_details GROUP BY user_id; -- 结果: product_a | product_b | product_c
| 函数 | 用途 | 对 NULL 的处理 | 适用场景 |
| CONCAT() | 连接多个字符串 | 遇到 NULL 则返回 NULL | 通用的字符串拼接,需注意处理NULL |
| CONCAT_WS() | 用分隔符连接字符串 | 自动忽略 NULL | 用统一分隔符拼接字段(如地址、全名),首选 |
| GROUP_CONCAT() | 将分组的多行值连接成一行 | 忽略该行(如果该字段为NULL) | 与 GROUP BY 一起使用,进行行转列聚合查询 |
日常拼接,特别是字段之间需要加分隔符(如空格、逗号)时,优先使用 CONCAT_WS(),因为它更安全、简洁。
如果确定所有参数都不为 NULL,或者需要 NULL 导致整个结果为 NULL 的逻辑,可以使用 CONCAT()。
需要进行多行合并时,毫不犹豫地使用 GROUP_CONCAT()。
另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。