学习查询中的SQL LEFT函数

3,974 阅读5分钟

在这篇文章中,我们将通过简单的例子来学习如何使用SQL LEFT函数。

什么是SQL LEFT函数?

在大多数情况下,我们需要在查询中处理字符数据类型,我们可以从SQL Server的内置字符串函数中受益。LEFT函数是内置的字符串函数之一,根据指定的字符数返回输入字符串的左边部分。现在我们将做一个非常基本的例子,然后我们将看一眼这个字符串函数的参数和其他细节。在下面的例子中,我们输入的字符串参数是**'SAVE THE GREEN'** ,我们想从左边提取前四个字符。

SELECT LEFT('SAVE THE GREEN',4) AS Result

How to use LEFT function in SQL

正如我们所看到的,LEFT函数只接受两个参数,然后从左边返回字符串的前4个字符。

What does do the SQL LEFT function?

语法

LEFT函数的语法如下。

LEFT(string,number_of_characters)

参数

  • string:希望被提取的字符串表达式
  • number_of_characters:将从字符串左侧提取的字符数。这个数字必须是一个正的整数。

返回类型。

  • 当字符串参数为非Unicode字符数据类型时,LEFT函数的返回类型为varchar
  • 当字符串参数为Unicode字符数据类型时,LEFT函数的返回类型是nvarchar。

如何在表列中使用SQL LEFT函数

我们可以使用LEFT函数来提取一个表列的字符。下面的例子返回Person表的FirstName列的最左边的4个字符。

SELECT FirstName,LEFT(FirstName,3) AS NickName 
FROM Person.Person

Usage details of the LEFT function to parse table column

如何在字面字符串中使用SQL LEFT函数

字面字符串是用单引号或双引号括起来的字符表达式。例如,下面的LEFT函数将返回字符串表达式中最左边的5个字符。

SELECT LEFT('Peace will save the World',5) AS Result

Get a left part of the literal string in SQL

如果number_of_characters超过了字符串参数的字符数,LEFT函数将返回所有字符串。例如'SAVE THE GREEN'表达式的字符数是14,当我们设置参数number_of_characters为15时,函数将返回整个字符串。

SELECT LEFT('SAVE THE GREEN',15) AS Result

Parse the left part of the literal string in SQL

现在,我们将尝试向LEFT函数传递一个负数。在这种情况下,该函数将返回一个错误。

SELECT LEFT('SAVE THE GREEN',-1) AS Result

Invalid parameter error in SQL

如何用变量使用SQL LEFT函数

本地变量是用来保存指定数据类型的单一数值的。我们可以使用LEFT函数来提取分配给它们的值。下面的例子显示了LEFT函数与变量的用法。

DECLARE @Txt AS VARCHAR(100)
SET @Txt = 'Save Water Save Life'
SELECT LEFT('Save Water Save Life',4) AS Result

Variables and LEFT function

我们可以使用SELECT INTO语句将LEFT函数的结果插入到一个临时表中。

DECLARE @Txt AS VARCHAR(100)
DECLARE @UnicodeTxt NCHAR(100)
SET @Txt = 'Save Water Save Life'
SET @UnicodeTxt= N'Green Earth'
SELECT LEFT('Save Water Save Life',4) AS Result,
LEFT(@UnicodeTxt,5) AS ResultUnicode INTO
#TempList
 
SELECT * FROM #TempList

How to use LEFT function with variables

#TempList表的列数据类型将等于LEFT函数的返回类型。为了找到列的数据类型,我们可以使用 INFORMATION_SCHEMA.COLUMNS 视图。

SQL temporary tables data types

正如上面所看到的,列的数据类型是参考变量数据类型自动生成的。

SQL LEFT函数和查询性能

SQL Server索引有助于提高查询的性能,但由于查询写得不好,但在某些情况下,由于查询写得不正确,查询优化器不能有效地使用索引。一般来说,最常见的错误是在where子句后使用标量函数。在这些情况下,SQL Server不能有效地使用索引,也不能生成一个最佳的查询计划。现在让我们考虑一下下面这个查询。这个查询从Person表中获取记录,其中FirstName列最左边的3个字符为 "Kim"。

SELECT FirstName,LEFT(FirstName,3) AS NickName 
	FROM Person.Person
	WHERE LEFT(FirstName,3)='Kim'

当我们看这个查询的执行计划时,它执行了一个非群集的索引扫描操作。索引扫描操作者执行的是读取所有的索引页来找到符合条件的行。因此,数据引擎读取人表的全部记录,然后过滤符合where条件的行。这个过程不是一个有效的方法,会造成过多的资源消耗。

Query performance and LEFT function

关于这个执行计划的另一个有趣的点是与计算标量运算符有关。这个操作符将LEFT函数转换为SUBSTRING函数。

Execution plan and string functions

现在,我们将改变我们的查询,删除LEFT函数,使用LIKE操作符。这种改变不会影响查询结果集。

SELECT FirstName,LEFT(FirstName,3) AS NickName 
FROM Person.Person
WHERE 'Kim%'

在这个时候,优化器提出了一个索引建议,这个建议可以在执行计划中看到。

LIKE operator can improve query performance

我们将创建索引并重新执行相同的查询。

CREATE NONCLUSTERED INDEX [NewTestIndex_FirstName]
ON [Person].[Person] ([FirstName])

在创建索引之后,涉及到LIKE操作符的查询会执行一个索引查找操作。这意味着它使用索引的B树结构快速找到合格的行。与索引扫描操作相比,索引搜索是最有效的操作。索引搜索比索引扫描操作更有效。

Execution plan index seek

现在,我们将执行我们的第一个示例查询,在where子句后使用LEFT函数。

SELECT FirstName,LEFT(FirstName,3) AS NickName 
FROM Person.Person
WHERE LEFT(FirstName,3)='Kim'

LEFT function affects the query performance

正如我们所看到的,由于查询中缺少LEFT函数的使用,该查询仍然执行了一个非聚类索引扫描。正如我们所学到的,我们可以在where子句后使用LIKE操作符而不是LEFT函数。

总结

在这篇文章中,我们已经学习了SQL LEFT函数的使用细节。这个函数有助于从左侧提取字符串。