理解SQL中的CONCAT函数:初学者的基础指南

想要在sql中连接两个或多个字符串列吗?学习如何使用sql concat函数来连接字符串。

当查询数据库表时,有时您可能需要连接多个文本/字符串列,而不是从单个列中检索数据。当您需要一个更容易理解和可读的输出时,这非常有帮助。

例如,您可以通过连接first_namelast_name字段来选择一个full_name字段。类似地,您可以通过连接街道、城市、州和其他必要字段来获取full_address

在sql中,您可以使用concat函数来连接字符串。在本指南中,我们将介绍:

  • sql concat函数的语法
  • 使用示例
  • 在连接过程中处理一个或多个列中的null值

让我们开始吧!

sql concat函数的语法

使用sql concat函数的语法如下:

concat(string_1, string_2, ..., string_n);

这里,string_1string_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_namelast_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_namelast_name外,还请注意我们还使用了空格作为分隔符,由字符串 ‘ ‘指定。

示例2: 构建地址

现在让我们看另一个例子。

我们在employees表中有streetcitystate列。因此,我们可以通过将这三个字段与逗号作为分隔符连接起来,选择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: 创建个人资料链接

回想一下,我们在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 行记录(0.00 秒)

处理null值

在员工表中,所有记录的字段都是有值的。但是如果您的一个或多个字段包含null值怎么办?

我们以此情况为例。这里我们将id = 2的记录的street列设置为null:

update employees
set street = null
where id = 2; -- 更新id为2的记录
查询ok,影响行数:1,更改行数:1,警告数: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 行记录(0.00 秒)

注意,结果集中的第二个元素是null。

但是我们希望输出是citystate列的连接,以获取地址的大致信息。当出现这样的null值时,您可以使用concat_ws作为concat函数的替代方案。让我们看看它是如何工作的。

使用concat_ws处理连接时的null值

如果您怀疑一个或多个字段可能包含null值,可以使用concat_ws作为concat的替代方法。

您可以像这样使用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 行记录(0.01 秒)

如图所示,对于结果集中的第二个项目,我们得到了“波士顿,马萨诸塞州”作为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速查表到书签。

类似文章