SQLite 的表达式(Expression)是 SQL 语句中可计算出值的任何合法组合,包括常量、列名、函数、运算符、子查询等。表达式广泛用于 SELECT、WHERE、ORDER BY、INSERT、UPDATE 等子句。
表达式分类
| 类型 | 说明 | 示例 |
|---|---|---|
| 常量表达式 | 字面量 | 'hello'、 100、 3.14、 NULL |
| 列表达式 | 表中的字段 | salary、name || '@company.com' |
| 运算符表达式 | 算术、逻辑、比较、位运算 | salary * 1.1、age > 18 |
| 函数表达式 | 内置或自定义函数 | UPPER(name)、ROUND(salary) |
| 子查询表达式 | 作为标量值(返回单行单列) | (SELECT MAX(salary) FROM employees) |
| CASE 表达式 | 条件判断 | CASE WHEN ... THEN ... END |
1. 常量表达式
SELECT 'Singapore' AS country, 100 AS bonus;
2. 列 + 运算符表达式
-- 涨薪 10%
SELECT name, salary, salary * 1.1 AS new_salary FROM employees;
-- 拼接姓名和邮箱
SELECT name \|\| ' <' \|\| email \|\| '>' AS full_contact FROM users;
3. 函数表达式
常用内置函数
| 类别 | 函数 | 示例 |
|---|---|---|
| 字符串 | LENGTH(), UPPER(), LOWER(), TRIM(), SUBSTR() | LENGTH(name) |
| 数值 | ABS(), ROUND(), RANDOM() | ROUND(salary, -3) |
| 日期时间 | DATE(), DATETIME(), STRFTIME(), JULIANDAY() | STRFTIME('%Y-%m', hire_date) |
| 聚合 | COUNT(), SUM(), AVG(), MAX(), MIN() | AVG(salary) |
| 条件 | COALESCE(), NULLIF() | COALESCE(phone, '未知') |
-- 格式化薪资为千位分隔(SQLite 无 FORMAT,需拼接)
SELECT name,
SUBSTR('000000' \|\| CAST(salary AS TEXT), -6) AS padded_salary
FROM employees;
4. CASE 条件表达式(最强大的表达式)
SELECT name, salary,
CASE
WHEN salary >= 9000 THEN 'A'
WHEN salary >= 7000 THEN 'B'
WHEN salary >= 5000 THEN 'C'
ELSE 'D'
END AS grade,
CASE WHEN active = 1 THEN '在职' ELSE '离职' END AS status
FROM employees;
5. 子查询作为表达式(标量子查询)
-- 对比部门平均薪资
SELECT name, salary,
salary - (SELECT AVG(salary) FROM employees WHERE department = e.department) AS diff_from_avg
FROM employees e;
注意:子查询必须返回 单值(一行一列),否则报错。
6. 布尔表达式(返回 1/0/NULL)
SQLite 中没有 BOOLEAN 类型,TRUE=1,FALSE=0。
SELECT name, (age >= 18) AS is_adult FROM users;
-- is_adult 列值为 1 或 0
-- 逻辑组合
SELECT * FROM orders
WHERE (status = 'paid') AND (amount > 0 OR discount IS NOT NULL);
7. 复杂表达式组合
SELECT
UPPER(name) AS NAME,
ROUND(salary * 1.1, 2) AS new_salary,
CASE
WHEN hire_date > '2024-01-01' THEN '新人'
ELSE '老员工'
END AS tag,
(salary > (SELECT AVG(salary) FROM employees)) AS above_avg
FROM employees
WHERE department IN ('IT', 'Finance')
ORDER BY salary DESC
LIMIT 5;
8. 在其他语句中使用表达式
UPDATE
UPDATE employees
SET salary = salary * 1.05
WHERE hire_date < '2023-01-01';
INSERT
INSERT INTO summary (dept, avg_salary, headcount)
SELECT department,
AVG(salary),
COUNT(*)
FROM employees
GROUP BY department;
WHERE / HAVING
SELECT department, AVG(salary) AS avg_sal
FROM employees
GROUP BY department
HAVING AVG(salary) > 6000;
性能提示
- 表达式中的函数可能阻止索引使用(如
UPPER(name) = 'ABC'无法用name索引) - 优先写成:
name = 'abc' AND UPPER(name) = 'ABC'(仅在必要时) - 使用
EXPLAIN QUERY PLAN检查是否走索引
自定义函数(高级)
你可以用 C 或 Python(通过扩展)注册函数:
-- 假设注册了函数 reverse_str()
SELECT reverse_str(name) FROM users;
总结:表达式使用场景
| 场景 | 示例 |
|---|---|
| 列计算 | salary * 12 |
| 条件判断 | age BETWEEN 20 AND 30 |
| 排序 | ORDER BY LENGTH(name) |
| 分组键 | GROUP BY STRFTIME('%Y', created_at) |
| 过滤 | WHERE COALESCE(email, '') != '' |
| 显示格式 | name || ' (' || department || ')' |
需要我根据你的表写具体表达式示例吗?
请贴出 CREATE TABLE 语句或字段说明!