字符串处理函数

1. CONCAT()

函数功能:将两个或多个字符串合并成一个字符串。

函数语法:

CONCAT(string1, string2, ...)

string1string2 等的数量可以是零个或多个,分别表示需要合并的字符串。

使用示例:

假设现在有一个名为 employees 的表格,其中包含员工的名字(first_namelast_name),需要将它们合并为一个字段(full_name)。

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

输出:

+---------------------+
|      full_name      |
+---------------------+
|      John Smith     |
|    Barbara Johnson  |
|      Mark Davis     |
+---------------------+

此示例使用了 CONCAT() 函数将 first_namelast_name 合并为一个名为 full_name 的新字段,并在两个字符串之间添加一个空格。

2. SUBSTRING()

函数功能:用于从字符串中提取子字符串。

函数语法:

SUBSTRING(string, start_position, length)

string 表示需要从中提取字符的字符串,start_position 表示子字符串在原始字符串中的起始位置(从 1 开始),length (可选) 表示需要提取的字符数。

如果省略 length 参数,则会提取从 start_position 开始的所有字符。

使用示例:

假设现在有一个名为 students 的表格,其中包含学生的姓名(name),需要从姓名字段中提取出每个学生的姓氏。

SELECT SUBSTRING(name, 1, 3) AS last_name FROM students;

输出:

+-----------+
| last_name |
+-----------+
|  Li       |
|  Wang     |
|  Zhang    |
+-----------+

此示例使用了 SUBSTRING() 函数从 name 字段中提取每个学生的姓氏,并将其作为新的 last_name 字段输出。

3. LOWER()UPPER()

LOWER() 函数用于将字符串中的所有字母转换为小写字母。UPPER() 函数用于将字符串中的所有字母转换为大写字母。

函数语法:

LOWER(string)
UPPER(string)

string 表示需要转换的字符串。

使用示例:

假设现在有一个名为 users 的表格,其中包含用户的名字(name),需要将它们转换为小写。

SELECT LOWER(name) AS lowercase_name FROM users;

输出:

+-----------------------+
|    lowercase_name     |
+-----------------------+
|       john smith      |
|     barbara johnson   |
|       mark davis      |
+-----------------------+

此示例使用了 LOWER() 函数将 name 中的所有字符转换为小写,并将结果存储在名为 lowercase_name 的新字段中。

4. LEFT()RIGHT()

函数功能:从左侧或右侧提取字符串中的字符。

函数语法:

LEFT(string, length)
RIGHT(string, length)

string 表示需要提取字符的字符串,length 表示从字符串左边或右边提取的字符数量。

使用示例:

假设现在有一个名为 books 的表格,其中包含书的标题(title),需要提取它们的前三个字符以及最后三个字符。

SELECT LEFT(title, 3) AS beginning, RIGHT(title, 3) AS end FROM books;

输出:

+-----------+--------+
| beginning |  end   |
+-----------+--------+
|   The     | man.   |
|   Mak     | must.  |
|   Pra     | be.    |
+-----------+--------+

此示例使用了 LEFT() 函数提取每个书的标题前三个字符,并使用 RIGHT() 函数提取标题的最后三个字符,并将它们分别存储在由 beginningend 组成的新字段中。

5. REVERSE()

函数功能:将一个字符串反转。

函数语法:

REVERSE(string)

string 表示需要反转的字符串。

使用示例:

假设现在有一个名为 words 的表格,其中包含单词(word),需要将它们反转。

SELECT REVERSE(word) AS reversed_word FROM words;

输出:

+------------------+
|  reversed_word   |
+------------------+
|       gninrom    |
|       raebdnas   |
|       loopkcalb  |
+------------------+

此示例使用了 REVERSE() 函数将每个单词反转,并将结果存储在名为 reversed_word 的新字段中。

6. LIKE

函数功能:用于在 WHERE 子句中筛选特定模式的数据。

函数语法:

SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern

column_name 表示需要搜索的列名,table_name 表示需要搜索的表格名,pattern 表示需要匹配的模式,模式可以包括百分号(%)和下划线(_)。

% 表示匹配零个或多个字符。例如,“ %s” 会匹配以“s”结尾的任何字符串,例如“dogs”、“cats”、“bats”等。

_ 表示匹配一个字符。例如,“__a%” 会匹配长度为至少三个字符且以“a”作为第三个字符的任何字符串,如“lava”、“wava”、“mamma”、“papa”等。

使用示例:

假设现在有一个名为 products 的表格,其中包含产品的名称(product_name)和是否存在缺货的布尔值(out_of_stock),需要找出所有名称以“car”开头且没有缺货的产品。

SELECT product_name FROM products WHERE product_name LIKE 'car%' AND out_of_stock = 0;

输出:

+------------------+
|   product_name   |
+------------------+
|    Car Charger   |
|   Car Accessories|
+------------------+

此示例使用了 LIKE 运算符,以“car%”作为模式筛选出产品名称以“car”开头的记录,以及一个布尔条件筛选出没有缺货的产品。

7. LENGTH()

函数功能:返回字符串的长度(字符数)。

函数语法:

LENGTH(string)

string 表示需要计算长度的字符串。

使用示例:

假设现在有一个名为 messages 的表格,其中包含一些电子邮件消息(message),需要计算它们的长度。

SELECT LENGTH(message) AS message_length FROM messages;

输出:

+-----------------+
| message_length  |
+-----------------+
|        234      |
|        150      |
|        442      |
|        97       |
+-----------------+

此示例使用了 LENGTH() 函数计算每个邮件消息的长度,并将结果存储在名为 message_length 的新字段中。

8. TRIM()

函数功能:用于删除字符串开头和结尾的空格或其他指定字符。

函数语法:

TRIM( [ [ BINARY ] [ LEADING | TRAILING | BOTH ] [ characters ] FROM ] string )

string 表示需要修剪的字符串,BINARY 表示该函数将针对二进制字符串进行操作,LEADING 表示仅在字符串开头删除字符,TRAILING 表示仅在字符串结尾删除字符,BOTH 表示在字符串开头和结尾都删除字符, characters 表示需要删除的字符或字符序列。

如果省略 characters 参数,则默认删除空格。

使用示例:

假设现在有一个名为 customers 的表格,其中包含客户的名称(name),需要删除在名字开头和结尾的空格。

SELECT TRIM(name) AS trimmed_name FROM customers;

输出:

+---------------------+
|     trimmed_name    |
+---------------------+
|       John Smith    |
|     Barbara Johnson |
|       Mark Davis    |
+---------------------+

此示例使用了 TRIM() 函数删除每个客户姓名开头和结尾的空格,并将结果存储在名为 trimmed_name 的新字段中。

9. REPLACE()

函数功能:用一个字符串替换另一个字符串。

函数语法:

REPLACE(string, old_string, new_string)

string 表示需要执行替换操作的字符串,old_string 表示需要被替换的子字符串,new_string 表示用于替换的新字符串。

使用示例:

假设现在有一个名为 sentences 的表格,其中包含一些句子(sentence),需要将其中每个单词“the”替换为“a”。

SELECT REPLACE(sentence, 'the', 'a') AS new_sentence FROM sentences;

输出:

+-----------------------------+
|          new_sentence        |
+-----------------------------+
|    A quick brown fox jumps   |
|    over a lazy dog.          |
|    A stitch in time saves a  |
|    nine.                     |
+-----------------------------+

此示例使用了 REPLACE() 函数替换每个句子中的单词“the”,并将替换后的新句子存储在名为 new_sentence 的新字段中。

10. LOCATE()

LOCATE() 函数用于在指定字符串中查找子字符串,并返回它在字符串中的起始位置。它的语法格式为:

LOCATE(substring, string, position)

其中,substring 表示需要查找的子字符串,string 表示被查找的原始字符串,position 表示查找的起始位置。

  • 如果找到了子字符串,则返回它在原始字符串中的起始位置,如果没有找到,则返回 0。
  • 如果省略 position 参数,则从字符串开始查找子字符串。

以下是一个 LOCATE() 函数的示例:

假设有如下的 SQL 语句:

SELECT LOCATE('cd', 'abcdefg') AS position;

执行上述语句的结果应该为:

+----------+
| position |
+----------+
|       3  |
+----------+

在该示例中,LOCATE() 函数依次传入子字符串 'cd' 和原始字符串 'abcdefg',并查找 'cd' 是否在 'abcdefg' 中出现。由于 'cd' 并不在 'abcdefg' 中出现,因此 LOCATE() 函数返回 0。

下面我们再看一个更真实的示例。假设有如下的 products 表格:

id

product_name

price

1

iPhone 13 - Jet Black

1000

2

Galaxy S21 - Phantom

900

3

Macbook Air - Silver

1200

现在我们想要分别提取 product_name 中的产品名称和颜色信息。我们可以使用 LOCATE() 函数和 SUBSTRING() 函数来实现:

SELECT SUBSTRING(product_name, 1, LOCATE(' - ', product_name)-1) AS product, 
SUBSTRING(product_name, LOCATE(' - ', product_name) + 3) AS color 
FROM products;

上述 SQL 语句将 product_name 字段分别以 ' - ' 为分隔符,提取出产品名称和颜色信息,并使用 SUBSTRING() 函数来去掉相应的分隔符。LOCATE() 函数返回分隔符在 product_name 中的起始位置,从而帮助 SUBSTRING() 函数正确提取相应的信息。执行上述 SQL 语句的结果如下:

product

color

iPhone 13

Jet Black

Galaxy S21

Phantom

Macbook Air

Silver

在上述结果中,产品名称和颜色信息已经正确分隔出来,并以不同的列分别显示。