是的,LEFT 是一个字符串函数。
一、LEFT 函数的基本信息
| 属性 | 说明 |
|---|---|
| 类型 | 字符串函数 |
| 全称 | LEFT(左边) |
| 作用 | 从字符串的最左边(开头) 截取指定数量的字符 |
| 语法 | LEFT(字符串, 截取长度) |
| 返回值 | 截取出来的子字符串 |
二、词源角度
text
LEFT ← 古英语 lyft(弱的、笨的) ↓ 现代英语 left(左边的、剩余的) ↓ 计算机科学 left(字符串左侧)
为什么用 LEFT 表示“从开头截取”?
因为英语书写习惯是从左到右:
字符串的“左边” = 开头
字符串的“右边” = 结尾
所以:
LEFT()= 从开头取RIGHT()= 从结尾取
类比:
中文说“前三个字” = 英文说 "left 3 characters"
中文说“后三个字” = 英文说 "right 3 characters"
三、LEFT(name,1) 的含义
sql
LEFT(name, 1) │ │ └─ 截取长度:1 个字符 │ └──── 要截取的字符串:name 列的值 └─────────── 函数名:从左边开始取
完整意思:
从
name列的值中,取出最左边的 1 个字符
示例
| name 的值 | LEFT(name,1) 的结果 |
|---|---|
'张三' | '张' |
'李四' | '李' |
'欧阳锋' | '欧' |
'ABC' | 'A' |
'123' | '1' |
'aBcDe' | 'a' |
''(空字符串) | ''(空字符串) |
NULL | NULL |
四、LEFT 函数的家族
SQL Server 中有一族字符串截取函数:
| 函数 | 作用 | 示例 | 结果 |
|---|---|---|---|
LEFT(字符串, n) | 从左边取 n 个字符 | LEFT('Hello', 2) | 'He' |
RIGHT(字符串, n) | 从右边取 n 个字符 | RIGHT('Hello', 2) | 'lo' |
SUBSTRING(字符串, 开始, 长度) | 从指定位置取 | SUBSTRING('Hello', 2, 3) | 'ell' |
对比示例
sql
DECLARE @name VARCHAR(20) = '欧阳锋';SELECT LEFT(@name, 1) AS 左边一个, -- '欧' RIGHT(@name, 1) AS 右边一个, -- '锋' SUBSTRING(@name, 2, 1) AS 中间一个; -- '阳'
五、LEFT 函数的常见用法
1. 提取首字母/首字符
sql
-- 按姓氏分组SELECT LEFT(name, 1) AS 姓氏, COUNT(*) AS 人数FROM usersGROUP BY LEFT(name, 1);
2. 条件过滤
sql
-- 找出所有姓“张”的人SELECT * FROM usersWHERE LEFT(name, 1) = '张';
3. 数据脱敏(隐藏部分信息)
sql
-- 手机号显示前3位 + **** + 后4位SELECT LEFT(phone, 3) + '****' + RIGHT(phone, 4) AS 脱敏手机号FROM users;
4. 排序(你之前看到的)
sql
-- 按首字符笔画排序SELECT * FROM goodsORDER BY LEFT(goods_name, 1) COLLATE Chinese_PRC_Stroke_CI_AS;
六、注意事项和坑
1. 长度参数不能为负数
sql
-- ❌ 错误:长度不能是负数SELECT LEFT('Hello', -1);-- ✅ 正确SELECT LEFT('Hello', 0); -- 返回空字符串 ''SELECT LEFT('Hello', 100); -- 长度超过字符串长度,返回完整字符串 'Hello'2. 处理 NULL
sql
SELECT LEFT(NULL, 1); -- 返回 NULL
3. 中文字符
sql
-- SQL Server 中,1 个中文也算 1 个字符SELECT LEFT('中华人民共和国', 2); -- 返回 '中华'4. 与 LEN 配合
sql
-- 取除了最后一个字符之外的所有字符SELECT LEFT(name, LEN(name) - 1) FROM users;
七、性能考虑
| 使用场景 | 性能影响 |
|---|---|
WHERE LEFT(name,1) = '张' | ❌ 无法使用索引(函数会让索引失效) |
WHERE name LIKE '张%' | ✅ 可以使用索引 |
ORDER BY LEFT(name,1) | ❌ 无法使用索引,需要全表排序 |
优化建议:
sql
-- 不好(函数)SELECT * FROM users WHERE LEFT(name,1) = '张';-- 更好(LIKE 可以利用索引)SELECT * FROM users WHERE name LIKE '张%';
八、总结
| 问题 | 答案 |
|---|---|
LEFT 是函数吗? | 是,字符串函数 |
| 词源 | 英语 left(左边),因为英语从左到右书写 |
| 作用 | 从字符串开头截取指定数量的字符 |
| 语法 | LEFT(字符串, 长度) |
| 返回值 | 截取出来的子字符串 |
| 兄弟函数 | RIGHT()、SUBSTRING() |
一句话:LEFT(name,1) 就是从 name 列中取出第一个字符,它是一个简单、常用、但会导致索引失效的字符串函数