PostgreSQL - AND & OR 子句
PostgreSQL:使用 AND、OR 和 NOT 组合条件
Section titled “PostgreSQL:使用 AND、OR 和 NOT 组合条件”在实际查询中,您通常需要根据多个条件来过滤数据。PostgreSQL 提供了 AND、OR 和 NOT 逻辑运算符来构建强大而精确的 WHERE 子句。
设置:示例 ‘employees’ 表
Section titled “设置:示例 ‘employees’ 表”在我们的示例中,我们将使用一个更真实的 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 运算符
Section titled “AND 运算符”AND 运算符仅在所有通过 AND 连接的条件都为 true 时才返回行。它用于缩小搜索结果。
SELECT column_listFROM table_nameWHERE [condition1] AND [condition2] AND ... [conditionN];示例:查找高收入工程师
Section titled “示例:查找高收入工程师”让我们查找所有在 ‘Engineering’ 部门且薪资高于 100,000 美元的员工。
SELECT first_name, last_name, salaryFROM employeesWHERE department = 'Engineering' AND salary > 100000.00;此查询将返回:
first_name | last_name | salary------------+-----------+------------ Bob | Johnson | 115000.00(1 row)OR 运算符
Section titled “OR 运算符”OR 运算符在至少一个通过 OR 连接的条件为 true 时返回行。它用于扩展搜索结果。
SELECT column_listFROM table_nameWHERE [condition1] OR [condition2] OR ... [conditionN];示例:查找人力资源员工或 2023 年入职的员工
Section titled “示例:查找人力资源员工或 2023 年入职的员工”让我们查找所有在 ‘HR’ 部门或在 2023 年入职的员工。
SELECT first_name, department, hire_dateFROM employeesWHERE 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:运算符优先级
Section titled “组合 AND 和 OR:运算符优先级”混合使用 AND 和 OR 而不理解优先级是常见的错误来源。PostgreSQL 会在 OR 运算符之前评估 AND 运算符。为确保逻辑正确,始终使用括号 ()。
示例:查找薪资超过 10 万美元的销售人员,或任何工程师
Section titled “示例:查找薪资超过 10 万美元的销售人员,或任何工程师”让我们查找那些(在 ‘Sales’ 部门且薪资超过 100,000 美元)或(在 ‘Engineering’ 部门)的员工。
SELECT first_name, department, salaryFROM employeesWHERE (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 将首先被评估,从而导致与我们目标不符的错误结果。
最佳实践和常见陷阱
Section titled “最佳实践和常见陷阱”- 始终使用括号:混合使用
AND和OR时,请使用括号使您的查询逻辑清晰明确,易于阅读。 - 处理 NULL 值:涉及
NULL的逻辑运算符可能很棘手。例如,NULL AND TRUE的结果是NULL,而不是FALSE。WHERE子句只包含评估为TRUE的行。评估为FALSE或NULL的行将被排除。 - 可读性:对于非常复杂的条件,请使用换行符和缩进格式化您的
WHERE子句,以提高您和队友的可读性。