Skip to content

PostgreSQL - WHERE 子句

WHERE 子句是 SQL 最基本也是最重要的组成部分之一。它用于过滤记录并仅检索满足特定条件的行。它可以与 SELECT、UPDATE 和 DELETE 语句一起使用。

SELECT column1, column2, ...
FROM table_name
WHERE [condition];

[condition] 是一个计算结果为真、假或未知(unknown)的表达式。它通常涉及比较运算符(=、>、<、<>、!=)、逻辑运算符(AND、OR、NOT)以及其他专用运算符。

让我们为示例设置一个 employees 表:

CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
age INT NOT NULL,
department TEXT,
salary NUMERIC(10, 2)
);
INSERT INTO employees (name, age, department, salary) VALUES
('Alice', 32, 'Engineering', 95000.00),
('Bob', 25, 'Marketing', 60000.00),
('Charlie', 28, 'Engineering', 80000.00),
('David', 45, 'Sales', 120000.00),
('Eve', 32, 'Marketing', 68000.00),
('Frank', 38, 'Sales', 115000.00);

查找“工程”部门中年龄大于 25 岁的所有员工:

SELECT name, department, age
FROM employees
WHERE department = 'Engineering' AND age > 25;

查找“销售”部门或薪资超过 100,000 美元的员工:

SELECT name, department, salary
FROM employees
WHERE department = 'Sales' OR salary > 100000;

查找“市场”或“销售”部门的员工:

SELECT name, department
FROM employees
WHERE department IN ('Marketing', 'Sales');

查找薪资在 70,000 美元到 100,000 美元之间(含边界)的员工:

SELECT name, salary
FROM employees
WHERE salary BETWEEN 70000 AND 100000;

查找姓名以 ‘A’ 开头的员工。LIKE 区分大小写。

SELECT name FROM employees WHERE name LIKE 'A%';

PostgreSQL 提供了 ILIKE 用于不区分大小写的匹配。查找部门名称包含 ‘market’ 的员工,不区分大小写:

SELECT name, department FROM employees WHERE department ILIKE '%market%';

首先,我们添加一名没有部门的员工:

INSERT INTO employees (name, age, salary) VALUES ('Grace', 29, 72000);

查找未分配部门的员工。始终使用 IS NULL 或 IS NOT NULL,而不是 = NULL。

SELECT name, department FROM employees WHERE department IS NULL;

EXISTS 操作符检查子查询中是否存在行。这是一种不检索实际数据而检查条件的有效方法。让我们找出所有工作在一个至少有一人收入超过 100,000 美元的部门的员工。

SELECT name, department
FROM employees e1
WHERE EXISTS (
SELECT 1
FROM employees e2
WHERE e2.department = e1.department
AND e2.salary > 100000
);

此查询返回“销售”部门的所有员工,因为该部门包含高收入者(‘David’ 和 ‘Frank’)。这是一种用于复杂条件过滤的强大模式。