Appearance
值表达式
什么是值表达式?
值表达式是 SQL 中用于计算单个值的公式。这些表达式在 SQL 的各个地方都能看到,比如:
- SELECT 语句中选择哪些数据
- UPDATE 语句中设置新值
- WHERE 子句中的条件判断
值表达式的结果通常是一个单一的值(也称为"标量"),这与返回多行多列的表表达式不同。
值表达式的类型
1. 常量或字面值
最简单的值表达式就是直接写出的值。
sql
-- 数字常量
SELECT 42;
-- 字符串常量
SELECT 'Hello, SQL!';
-- 日期常量
SELECT DATE '2023-05-01';
2. 列引用
引用表中的列。
sql
SELECT first_name FROM employees;
3. 参数引用
在函数或预处理语句中使用的位置参数。
sql
-- 在预处理语句中使用$1引用第一个参数
PREPARE my_query AS SELECT * FROM products WHERE price < $1;
4. 下标表达式
访问数组元素。
sql
-- 获取数组的第1个元素(PostgreSQL从1开始计数)
SELECT my_array[1] FROM table_with_arrays;
5. 字段选择表达式
从复合类型(如记录或JSON)中选择字段。
sql
-- 从复合类型中选择字段
SELECT (row_value).field_name;
-- 从JSON中选择字段
SELECT data->'user'->'name' FROM json_table;
6. 操作符调用
使用操作符(如+, -, *, /等)组合值。
sql
-- 算术运算
SELECT price * quantity AS total_cost FROM orders;
-- 比较运算
SELECT * FROM students WHERE score >= 60;
7. 函数调用
调用SQL函数处理数据。
sql
-- 字符串函数
SELECT UPPER(name) FROM customers;
-- 日期函数
SELECT EXTRACT(YEAR FROM order_date) AS order_year FROM orders;
8. 聚合表达式
对一组行执行计算并返回单个值。
sql
-- 计算总和
SELECT SUM(amount) FROM transactions;
-- 计算平均值
SELECT AVG(score) AS average_score FROM exams;
9. 窗口函数调用
在相关行的"窗口"中执行计算。
sql
-- 计算每个部门员工工资的排名
SELECT name, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC)
FROM employees;
10. 类型转换
将一种数据类型转换为另一种类型。
sql
-- 显式类型转换
SELECT CAST(price AS INTEGER) FROM products;
-- 简写形式
SELECT price::INTEGER FROM products;
11. 排序表达式
在ORDER BY中使用的特殊表达式。
sql
-- 按姓名首字母倒序排列
SELECT * FROM users ORDER BY name DESC;
-- 按计算结果排序
SELECT * FROM products ORDER BY price * discount;
12. 子查询
嵌套在另一个查询中的查询,返回单个值。
sql
-- 查找价格高于平均价格的产品
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);
13. 数组构造器
创建数组值。
sql
-- 使用数组构造器
SELECT ARRAY[1, 2, 3] AS my_array;
14. 行构造器
创建行值(复合值)。
sql
-- 构造一个行
SELECT ROW(1, 'apple', 9.99) AS product_row;
15. 括号表达式
用括号分组以控制计算顺序。
sql
-- 使用括号改变计算顺序
SELECT (2 + 3) * 4; -- 结果是 20
SELECT 2 + (3 * 4); -- 结果是 14
值表达式的应用场景
应用场景 | 示例 | 说明 |
---|---|---|
SELECT子句 | SELECT first_name, last_name, salary * 1.1 | 选择和计算要显示的数据 |
WHERE子句 | WHERE age > 18 AND department = 'IT' | 筛选满足条件的行 |
ORDER BY子句 | ORDER BY hire_date DESC | 对结果进行排序 |
GROUP BY子句 | GROUP BY EXTRACT(YEAR FROM date) | 分组聚合数据 |
HAVING子句 | HAVING COUNT(*) > 5 | 筛选分组后的结果 |
UPDATE语句 | SET salary = salary * 1.05 | 更新数据时计算新值 |
INSERT语句 | VALUES (1, 'John', CURRENT_DATE) | 插入计算得到的值 |
小贴士
- 值表达式可以嵌套:你可以在一个表达式中使用另一个表达式
- 注意数据类型:不同类型之间的运算可能需要类型转换
- 使用括号来明确计算顺序,提高代码可读性
- 复杂表达式可以分解为多个简单步骤,使用临时列或CTE(公用表表达式)
- PostgreSQL中一些特殊构造(如
IS NULL
)虽然也是表达式,但有其特殊的语法规则
通过理解和灵活运用值表达式,你可以构建出强大而精确的SQL查询,满足各种复杂的数据处理需求。