Skip to content

值表达式

什么是值表达式?

值表达式是 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查询,满足各种复杂的数据处理需求。