想要在 SQL 中连接两个或多个字符串列?了解如何使用 SQL CONCAT 函数连接字符串。
查询数据库表时,您可能需要连接多个文本/字符串列,而不是从单个列中检索数据。当您想要易于解释和阅读的输出时,这非常有用。
例如,您可以通过连接first_name和last_name字段来选择full_name字段。同样,您可以通过连接街道地址、城市、州和其他必填字段来获取full_address 。
在 SQL 中,您可以使用 CONCAT 函数连接字符串。本指南涵盖:
- SQL CONCAT 函数语法
- 使用示例
- 连接时处理一列或多列中的 NULL 值
让我们开始吧!

SQL CONCAT 函数语法
使用 SQL CONCAT 函数的语法是:
CONCAT(string_1, string_2, ..., string_n);这里, string_1 , string_2 , …, string n表示要连接的字符串。这些可以是字符串文字、列或两者的组合。

使用 CONCAT 连接字符串文字
CONCAT 函数还可以用于连接字符串文字,所以让我们编写一个简单的示例。
这里,字符串“Hello”和“world!”被连接起来。作为greeting字符串:
SELECT CONCAT('Hello, ', 'world!') AS greeting;运行上述查询会产生以下输出:
+---------------+
| greeting |
+---------------+
| Hello, world! |
+---------------+
1 row in set (0.00 sec)然而,实际上,您可能希望连接数据库表中所需的列而不是字符串文字。现在让我们使用 SQL 中的 CONCAT 函数编写一些示例。

如何在 SQL 中连接列
现在让我们继续查询数据库表。
📑 本教程中的所有示例查询都是在MySQL数据库表上执行的。但是,您也可以使用您选择的其他 RDBMS。
创建包含记录的数据库表
让我们创建一个可用的数据库。
CREATE DATABASE db1; use db1;让我们在数据库db1中创建employees表。为此,请使用以下列和相应的数据类型运行CREATE TABLE语句:
CREATE TABLE employees (
ID INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
street VARCHAR(100),
city VARCHAR(50),
state VARCHAR(2),
username VARCHAR(20)
);接下来,让我们向employees表中插入一些记录。
INSERT INTO employees (first_name, last_name, street, city, state, username) VALUES
('John', 'Smith', '123 Main St', 'New York', 'NY', 'john123'),
('Alice', 'Johnson', '456 Elm St', 'Boston', 'MA', 'alice456'),
('Bob', 'Williams', '789 Oak St', 'Chicago', 'IL', 'bob789'),
('Mary', 'Davis', '321 Pine St', 'Houston', 'TX', 'mary456'),
('James', 'Brown', '555 Cedar St', 'Seattle', 'WA', 'james789'),
('Emily', 'Jones', '777 Maple St', 'Atlanta', 'GA', 'emily123'),
('Michael', 'Miller', '999 Birch St', 'Miami', 'FL', 'michael456'),
('Jessica', 'Wilson', '111 Walnut St', 'Dallas', 'TX', 'jessica789'),
('William', 'Taylor', '222 Cherry St', 'Denver', 'CO', 'william123'),
('Sarah', 'Martinez', '444 Pine St', 'Phoenix', 'AZ', 'sarah456'); 示例1:显示全名
作为第一个示例,让我们连接first_name和last_name列以获取full_name 。为此,请在 SELECT 查询中使用 SQL CONCAT 函数:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;您应该得到以下输出:
+----------------+
| full_name |
+----------------+
| John Smith |
| Alice Johnson |
| Bob Williams |
| Mary Davis |
| James Brown |
| Emily Jones |
| Michael Miller |
| Jessica Wilson |
| William Taylor |
| Sarah Martinez |
+----------------+
10 rows in set (0.00 sec)
请注意,除了first_name和last_name之外,我们还使用空格作为文字字符串“”中指定的分隔符。
示例2:建立地址
现在让我们看另一个例子。
employees表有street 、 city和state列。因此,您可以通过将这三个字段以逗号作为分隔符连接来选择full_address 。
SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;输出是:
+---------------------------+
| full_address |
+---------------------------+
| 123 Main St, New York, NY |
| 456 Elm St, Boston, MA |
| 789 Oak St, Chicago, IL |
| 321 Pine St, Houston, TX |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ |
+---------------------------+
10 rows in set (0.00 sec) 示例3:创建个人资料 URL
回想一下, employees表有一个username段。
假设您有一个根域https://www.example.com/和一个位于https://www.example.com/user的用户配置文件。您可以使用 CONCAT 函数生成profile_url ,如下所示:
SELECT CONCAT('https://www.example.com/user/', username) AS profile_url
FROM employees;如您所见,我们获取了所有员工的个人资料 URL。
+-----------------------------------------+
| profile_url |
+-----------------------------------------+
| https://www.example.com/user/john123 |
| https://www.example.com/user/alice456 |
| https://www.example.com/user/bob789 |
| https://www.example.com/user/mary456 |
| https://www.example.com/user/james789 |
| https://www.example.com/user/emily123 |
| https://www.example.com/user/michael456 |
| https://www.example.com/user/jessica789 |
| https://www.example.com/user/william123 |
| https://www.example.com/user/sarah456 |
+-----------------------------------------+
10 rows in set (0.00 sec) 
处理 NULL 值
在员工表中,每条记录都有所有字段。但是,如果您有一个或多个具有 NULL 值的字段怎么办?
我们来举一个这个案例的例子。这里,我们更新 ID = 2 对应的记录,并将街道地址列设置为 NULL。
UPDATE employees
SET street = NULL
WHERE ID = 2; -- Update the record with ID 2 Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0然后使用 CONCAT 选择full_address 。
SELECT CONCAT(street, ', ', city, ', ', state) AS full_address FROM employees;输出是:
+---------------------------+
| full_address |
+---------------------------+
| 123 Main St, New York, NY |
| NULL |
| 789 Oak St, Chicago, IL |
| 321 Pine St, Houston, TX |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ |
+---------------------------+
10 rows in set (0.00 sec)请注意,结果集的第二个元素为 NULL。
但是,我希望输出是city state列的串联,以便大致了解地址。如果您有此类 NULL 值,则可以使用CONCAT_WS而不是 CONCAT 函数。让我们看看它是如何工作的。
使用 CONCAT_WS 连接时处理 NULL 值
CONCAT_WS 是 CONCAT 的替代方案,如果您怀疑一个或多个字段包含 NULL 值,则可以使用它。
CONCAT_WS 函数可以按如下方式使用:
CONCAT_WS(separator, string_1, string_2,..., string_n)然后运行以下 SELECT 查询。
SELECT CONCAT_WS(', ', street, city, state) AS full_address FROM employees;我得到以下输出:
+---------------------------+
| full_address |
+---------------------------+
| 123 Main St, New York, NY |
| Boston, MA |
| 789 Oak St, Chicago, IL |
| 321 Pine St, Houston, TX |
| 555 Cedar St, Seattle, WA |
| 777 Maple St, Atlanta, GA |
| 999 Birch St, Miami, FL |
| 111 Walnut St, Dallas, TX |
| 222 Cherry St, Denver, CO |
| 444 Pine St, Phoenix, AZ |
+---------------------------+
10 rows in set (0.01 sec)正如您所看到的,在结果集中的第二项中,我们得到“Boston MA”,因为street字段为 NULL。
⚠ 使用 CONCAT_WS 时,必须指定分隔符。如果未指定分隔符且一列或多列为 NULL,则结果为 NULL(类似于 CONCAT)。
概括
让我们回顾一下到目前为止我们所学到的知识。
- 当查询数据库表来检索数据时,您可以连接多个字符串列以获得更有用且更易于解释的查询结果。为此,请在 SQL 中使用 CONCAT 函数,其语法为
CONCAT(string_1, string_2, ..., string_n)。 - 您可以连接字符串文字、列或两者的组合。但是,如果存在一个或多个 NULL 值,则该特定记录的结果将为 NULL。要处理此问题,您可以使用
CONCAT_WS和语法CONCAT_WS(separator, string_1, string_2, ..., string_n)。 -
CONCAT_WS通过使用指定的分隔符仅连接现有字符串来更好地处理 NULL 值。
将此 SQL 备忘单添加为书签,以便快速查看 SQL 命令及其用法。




![2021 年如何设置 Raspberry Pi Web 服务器 [指南]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)

