课程 3.2 · 阅读时间:~8 分钟
在本课程中,您将学习 SQL 字符串函数,这些函数有助于在查询中直接清理和转换文本。我们将讨论何时使用 UPPER、LOWER、TRIM、SUBSTRING、CONCAT 和其他函数,并通过实际示例进行讲解。到课程结束时,您将能够自信地处理实际任务中的文本字段。
SQL 中的核心字符串函数
在上一课中,您了解了 SQL 内置函数的整体概念。现在我们将重点关注字符串函数,因为文本字段通常需要额外的处理:大小写规范化、去除不必要的字符、组合值和提取片段。
这些操作在分析、报告和数据准备中很常见。您对字符串函数的了解越深入,您在 SQL 之外所需的手动后处理就越少。
字符串函数是什么
字符串函数处理文本并返回一个字符串、一个数字或一个子字符串位置。当您需要时,它们非常有用:
- 将文本格式化为一致的格式;
- 清理嘈杂的值;
- 提取字符串的一部分(例如,电子邮件域);
- 为报告构建可读的输出。
基本语法
FUNCTION_NAME(string_expression, ...)
在大多数情况下,参数是表列、字符串字面量或另一个函数的结果。
核心字符串函数
UPPER() 和 LOWER()
用于规范化文本大小写。
SELECT
customer_id,
UPPER(last_name) AS last_name_upper,
LOWER(first_name) AS first_name_lower
FROM customer
LIMIT 5;
结果:姓氏以大写显示,名字以小写显示。
CHAR_LENGTH() 和 LENGTH()
这两个函数测量字符串长度,但不总是以相同的方式:
CHAR_LENGTH()通常返回字符计数;LENGTH()在 MySQL 中返回字节计数。
SELECT
title,
CHAR_LENGTH(title) AS title_chars,
LENGTH(title) AS title_bytes
FROM film
LIMIT 5;
注意:对于多字节字符,字节计数可能大于字符计数。
SUBSTRING()、LEFT()、RIGHT()
这些函数提取字符串的一部分。
SELECT
email,
SUBSTRING(email, 1, 5) AS email_start,
LEFT(email, 3) AS first_3,
RIGHT(email, 10) AS last_10
FROM customer
LIMIT 5;
结果:提取不同的电子邮件片段以进行分析和格式检查。
CONCAT() 和 CONCAT_WS()
这些函数将多个值组合成一个字符串:
CONCAT()直接连接参数;CONCAT_WS(separator, ...)插入分隔符,通常在报告中更实用。
SELECT
customer_id,
CONCAT(first_name, ' ', last_name) AS full_name,
CONCAT_WS(' | ', first_name, last_name, email) AS customer_label
FROM customer
LIMIT 5;
注意:与 NULL 的行为取决于 DBMS,因此请始终检查您的系统文档。
TRIM() 和 REPLACE()
用于清理文本值。
SELECT
address,
TRIM(address) AS address_trimmed,
REPLACE(address, 'Street', 'St.') AS address_short
FROM address
LIMIT 5;
结果:去除多余的空格并替换重复的文本模式。
子字符串搜索:POSITION() / INSTR() / CHARINDEX()
函数名称取决于 DBMS,但思路是相同的:查找字符串内部的子字符串位置。
SELECT
email,
INSTR(email, '@') AS at_pos
FROM customer
LIMIT 5;
结果:返回 @ 的位置,这对于电子邮件验证很有用。
注意事项
- 检查 DBMS 差异:函数名称和行为可能会有所不同。
- 小心处理
NULL:它通常会改变字符串表达式的结果。 - 对于西里尔字母和表情符号文本,选择长度函数时要有意识(字符与字节)。
- 避免在一个查询中深度嵌套过多函数;尽可能将逻辑分解为多个步骤。
实际示例:为电子邮件活动准备客户数据
以下查询准备一个干净的客户列表:规范化姓名、规范化电子邮件并提取域名。
SELECT
c.customer_id,
TRIM(CONCAT_WS(' ', c.first_name, c.last_name)) AS full_name,
LOWER(TRIM(c.email)) AS email_normalized,
SUBSTRING_INDEX(LOWER(TRIM(c.email)), '@', -1) AS email_domain
FROM customer AS c
WHERE c.email IS NOT NULL
ORDER BY c.customer_id
LIMIT 20;
结果:您将获得一组干净、一致的文本字段,准备进行分析或导出。
本课的关键要点:
- SQL 字符串函数帮助直接在查询中清理、规范化和格式化文本。
UPPER、LOWER、TRIM、REPLACE、SUBSTRING、LEFT、RIGHT和CONCAT涵盖了大多数常见任务。- 对于字符串长度,区分字符和字节非常重要。
- 在组合字符串时,请考虑 DBMS 中的
NULL行为。 - 字符串函数的实际价值在于真实的数据准备工作流中最为明显。
面试问题
CHAR_LENGTH() 和 LENGTH() 之间有什么区别,为什么这很重要?
CHAR_LENGTH() 通常返回 字符 的数量,而 LENGTH() 在 MySQL 中返回 字节 的数量。对于西里尔字母和其他多字节字符,结果可能会有所不同。这在验证字段长度和强制业务规则时很重要。
如果一个字段可能为 NULL,您将如何安全地构建全名?
CONCAT_WS() 通常更受欢迎,因为它在用分隔符组合字符串时更实用。通常还会显式处理空值,使用 COALESCE() 以在不同场景中获得可预测的输出。
在分析之前,您会使用哪些字符串函数来清理电子邮件值?
一种常见的方法是 TRIM() + LOWER() 来去除多余的空格并规范化大小写。要验证结构,您还可以使用 INSTR() 或其在您的 DBMS 中的等效函数检查 @。
在下一课中,我们将转向 SQL 数学函数,学习如何在查询中执行数值计算。