在mysql的实际开发场景中,经常需要将表中的多个字段内容合并成一个完整的字符串返回,比如将用户的姓和名拼接成全名,或者将地址的各个组成部分拼接成完整地址,CONCAT函数就是专门用来完成这类字符串连接操作的内置函数。

CONCAT函数基本语法
CONCAT函数的基本语法格式如下,它可以接收多个字符串参数,将这些参数按顺序拼接成一个字符串返回:
-- CONCAT函数基本语法,参数可以是字符串、字段名或者变量 CONCAT(str1, str2, ...)
需要注意的是,CONCAT函数的参数数量没有固定限制,最少可以传入1个参数,如果只传入1个参数,函数会直接返回该参数的内容。
多字段拼接基础示例
假设我们有一张用户表user_info,表结构如下:
-- 创建用户表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(20),
last_name VARCHAR(20),
city VARCHAR(50),
street VARCHAR(100)
);
-- 插入测试数据
INSERT INTO user_info (first_name, last_name, city, street) VALUES
('张', '三', '北京', '朝阳区建国路1号'),
('李', '四', '上海', '浦东新区陆家嘴环路2号'),
('王', '五', '广州', '天河区天河路3号');
如果我们需要将first_name和last_name拼接成用户全名,同时拼接城市和街道组成完整地址,可以使用如下查询语句:
-- 多字段拼接查询
SELECT
id,
CONCAT(first_name, last_name) AS full_name,
CONCAT(city, street) AS full_address
FROM user_info;
执行上述语句后,会返回每个用户的id、拼接后的全名和完整地址,比如第一条数据的full_name为张三,full_address为北京朝阳区建国路1号。
拼接过程中空值的处理
使用CONCAT函数时需要特别注意:如果传入的参数中有任意一个为NULL,那么整个CONCAT函数的返回结果都会是NULL。比如用户表中某个用户的last_name字段为NULL,拼接全名时结果就会是NULL。
如果希望避免空值导致整个拼接结果为NULL,可以使用IFNULL函数将空值转换为空字符串,示例如下:
-- 处理空值后的拼接查询
SELECT
id,
CONCAT(IFNULL(first_name, ''), IFNULL(last_name, '')) AS full_name
FROM user_info;
这样即使first_name或者last_name为NULL,拼接结果也不会是NULL,而是对应非NULL部分的内容。
CONCAT_WS扩展函数
如果需要在多个拼接的字符串之间添加统一的分隔符,比如拼接姓名时中间加空格,拼接地址时中间加逗号,可以使用CONCAT_WS函数,WS是With Separator的缩写,语法格式如下:
-- CONCAT_WS语法,第一个参数是分隔符,后面是待拼接的参数 CONCAT_WS(separator, str1, str2, ...)
CONCAT_WS函数的第一个参数是分隔符,后面的参数是待拼接的内容,同时CONCAT_WS会自动忽略NULL值,不需要额外使用IFNULL处理。比如拼接带空格的全名和带逗号的地址:
-- 使用CONCAT_WS添加分隔符拼接
SELECT
id,
CONCAT_WS(' ', first_name, last_name) AS full_name,
CONCAT_WS(',', city, street) AS full_address
FROM user_info;
执行后全名会显示为张 三、李 四这样的格式,地址会显示为北京,朝阳区建国路1号这样的格式,更符合实际阅读习惯。
拼接结果的其他处理
有时候拼接后的字符串需要和其他固定字符串组合,或者需要转换大小写,也可以在CONCAT函数外层嵌套其他字符串函数,比如:
-- 拼接后添加固定后缀,同时转换为大写
SELECT
id,
CONCAT(UPPER(CONCAT(first_name, last_name)), '先生/女士') AS display_name
FROM user_info;
这样拼接后的全名会先转换为大写,再添加先生/女士的后缀,满足不同的业务输出需求。