Skip to content

PostgreSQL - AND & OR 子句

PostgreSQL:使用 AND、OR 和 NOT 组合条件

Section titled “PostgreSQL:使用 AND、OR 和 NOT 组合条件”

在实际查询中,您通常需要根据多个条件来过滤数据。PostgreSQL 提供了 AND、OR 和 NOT 逻辑运算符来构建强大而精确的 WHERE 子句。

在我们的示例中,我们将使用一个更真实的 employees 表。您可以使用以下脚本创建并填充它:

CREATE TABLE employees (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
department VARCHAR(50),
salary NUMERIC(10, 2),
hire_date DATE
);
INSERT INTO employees (first_name, last_name, department, salary, hire_date) VALUES
('Alice', 'Smith', 'Engineering', 92000.00, '2022-03-15'),
('Bob', 'Johnson', 'Engineering', 115000.00, '2021-07-01'),
('Charlie', 'Brown', 'Sales', 85000.00, '2023-01-20'),
('Diana', 'Prince', 'Sales', 125000.00, '2020-11-10'),
('Eve', 'Adams', 'HR', 78000.00, '2022-09-01');

AND 运算符仅在所有通过 AND 连接的条件都为 true 时才返回行。它用于缩小搜索结果。

SELECT column_list
FROM table_name
WHERE [condition1] AND [condition2] AND ... [conditionN];

让我们查找所有在 ‘Engineering’ 部门且薪资高于 100,000 美元的员工。

SELECT first_name, last_name, salary
FROM employees
WHERE department = 'Engineering' AND salary > 100000.00;

此查询将返回:

first_name | last_name | salary
------------+-----------+------------
Bob | Johnson | 115000.00
(1 row)

OR 运算符在至少一个通过 OR 连接的条件为 true 时返回行。它用于扩展搜索结果。

SELECT column_list
FROM table_name
WHERE [condition1] OR [condition2] OR ... [conditionN];

示例:查找人力资源员工或 2023 年入职的员工

Section titled “示例:查找人力资源员工或 2023 年入职的员工”

让我们查找所有在 ‘HR’ 部门或在 2023 年入职的员工。

SELECT first_name, department, hire_date
FROM employees
WHERE department = 'HR' OR hire_date >= '2023-01-01';

此查询将返回:

first_name | department | hire_date
------------+------------+------------
Charlie | Sales | 2023-01-20
Eve | HR | 2022-09-01
(2 rows)

混合使用 AND 和 OR 而不理解优先级是常见的错误来源。PostgreSQL 会在 OR 运算符之前评估 AND 运算符。为确保逻辑正确,始终使用括号 ()。

示例:查找薪资超过 10 万美元的销售人员,或任何工程师

Section titled “示例:查找薪资超过 10 万美元的销售人员,或任何工程师”

让我们查找那些(在 ‘Sales’ 部门且薪资超过 100,000 美元)或(在 ‘Engineering’ 部门)的员工。

SELECT first_name, department, salary
FROM employees
WHERE (department = 'Sales' AND salary > 100000.00)
OR (department = 'Engineering');

此查询正确返回:

first_name | department | salary
------------+-------------+------------
Alice | Engineering | 92000.00
Bob | Engineering | 115000.00
Diana | Sales | 125000.00
(3 rows)

调试提示:没有括号会发生什么?

Section titled “调试提示:没有括号会发生什么?”

如果我们不带括号编写查询,department = 'Sales' AND salary > 100000.00 将首先被评估,从而导致与我们目标不符的错误结果。

  • 始终使用括号:混合使用 AND 和 OR 时,请使用括号使您的查询逻辑清晰明确,易于阅读。
  • 处理 NULL 值:涉及 NULL 的逻辑运算符可能很棘手。例如,NULL AND TRUE 的结果是 NULL,而不是 FALSE。WHERE 子句只包含评估为 TRUE 的行。评估为 FALSE 或 NULL 的行将被排除。
  • 可读性:对于非常复杂的条件,请使用换行符和缩进格式化您的 WHERE 子句,以提高您和队友的可读性。