SQLite 表达式

SQLite 的表达式(Expression)是 SQL 语句中可计算出值的任何合法组合,包括常量、列名、函数、运算符、子查询等。表达式广泛用于 SELECTWHEREORDER BYINSERTUPDATE 等子句。


表达式分类

类型说明示例
常量表达式字面量'hello'1003.14NULL
列表达式表中的字段salaryname || '@company.com'
运算符表达式算术、逻辑、比较、位运算salary * 1.1age > 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=1FALSE=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 语句或字段说明!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部