Skip to content

PostgreSQL - 表达式

SQL 中的表达式是一个或多个值、运算符和函数的组合,它会计算出一个单一的值。表达式是查询的构建块,允许您执行计算、操作数据和指定复杂条件。

表达式可以在 SQL 语句的各个部分中使用,最常见的是在 SELECT 列表和 WHERE 子句中。

SELECT expression_1, expression_2, ...
FROM table_name
WHERE conditional_expression;

让我们通过现代示例来探索不同类型的 PostgreSQL 表达式。我们将使用以下示例表:

CREATE TABLE employees (
id INT PRIMARY KEY,
first_name TEXT,
last_name TEXT,
department TEXT,
salary NUMERIC(10, 2),
hire_date DATE
);
INSERT INTO employees VALUES
(1, 'Alice', 'Williams', 'Engineering', 90000.00, '2022-03-15'),
(2, 'Bob', 'Smith', 'Engineering', 85000.00, '2021-07-01'),
(3, 'Charlie', 'Brown', 'Marketing', 72000.00, '2023-01-20'),
(4, 'Diana', 'Jones', 'Sales', 95000.00, '2020-11-10');

布尔表达式求值为 TRUE(真)、FALSE(假)或 NULL(空)。它们是 WHERE 子句的基础,用于根据特定条件过滤行。

-- 查找“Engineering”部门中薪水超过 80000 的所有员工
SELECT first_name, last_name, salary
FROM employees
WHERE department = 'Engineering' AND salary > 80000.00;

此查询将产生以下结果:

first_name | last_name | salary
------------+-----------+----------
Alice | Williams | 90000.00
Bob | Smith | 85000.00
(2 rows)

数值表达式执行数学计算。它们可以在 SELECT 列表中用于计算新值,或在 WHERE 子句中用于条件逻辑。

-- 为每位员工计算 5% 的奖金
SELECT first_name, salary, salary * 0.05 AS bonus
FROM employees;

这将产生:

first_name | salary | bonus
------------+----------+----------
Alice | 90000.00 | 4500.000
Bob | 85000.00 | 4250.000
Charlie | 72000.00 | 3600.000
Diana | 95000.00 | 4750.000
(4 rows)

SUM()、AVG()、COUNT() 等聚合函数也从一组行中产生一个单一的数值。

-- 获取员工总数和平均薪水
SELECT COUNT(*) AS total_employees, AVG(salary) AS average_salary
FROM employees;

这将产生:

total_employees | average_salary
-----------------+-----------------------
4 | 85500.00000000000000
(1 row)

这些表达式用于操作日期和时间值。PostgreSQL 提供了丰富的函数和运算符用于日期算术。

-- 获取当前服务器时间戳并查找过去 2 年内雇佣的员工
SELECT first_name, hire_date
FROM employees
WHERE hire_date > (CURRENT_DATE - INTERVAL '2 years');

假设当前日期是 2024 年初,这将产生:

first_name | hire_date
------------+------------
Alice | 2022-03-15
Charlie | 2023-01-20
(2 rows)

您还可以提取日期的部分或将其格式化为字符串。

-- 提取雇佣年份并格式化雇佣日期
SELECT first_name,
EXTRACT(YEAR FROM hire_date) AS hire_year,
TO_CHAR(hire_date, 'Month DD, YYYY') AS formatted_date
FROM employees;