在 WHERE 子句中编写子查询
在这一步中,你将学习如何在 SQL 查询的 WHERE
子句中使用子查询。子查询,也称为内部查询或嵌套查询,是嵌入在另一个查询中的查询。子查询用于返回将在主查询中用作条件的数据,以进一步限制要检索的数据。
理解 WHERE 子句中的子查询
WHERE
子句中的子查询通常用于将列的值与子查询的结果进行比较。子查询首先执行,然后其结果被外部查询使用。
基本语法:
SELECT column1, column2
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);
在这里,子查询 (SELECT column_name FROM another_table WHERE condition)
返回一组值。然后,外部查询从 table_name
中选择 column_name
在该集合中的行。
场景:
假设你有两个表:employees
(员工)和 departments
(部门)。employees
表包含有关员工的信息,包括他们的 employee_id
(员工 ID)、employee_name
(员工姓名)和 department_id
(部门 ID)。departments
表包含有关部门的信息,包括他们的 department_id
(部门 ID)和 department_name
(部门名称)。
我们想要找到所有在 'Sales'(销售)部门工作的员工。
步骤 1:创建表并插入数据
首先,使用 postgres
用户连接到 PostgreSQL 数据库:
sudo -u postgres psql
接下来,创建 departments
表:
CREATE TABLE departments (
department_id SERIAL PRIMARY KEY,
department_name VARCHAR(50)
);
将一些示例数据插入到 departments
表中:
INSERT INTO departments (department_name) VALUES
('Sales'),
('Marketing'),
('Engineering');
现在,创建 employees
表:
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
employee_name VARCHAR(50),
department_id INTEGER REFERENCES departments(department_id)
);
将一些示例数据插入到 employees
表中:
INSERT INTO employees (employee_name, department_id) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 1),
('David', 3),
('Eve', 2);
步骤 2:编写子查询
现在,让我们编写查询,以使用 WHERE
子句中的子查询来查找所有在 'Sales'(销售)部门工作的员工。
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Sales');
解释:
- 子查询
(SELECT department_id FROM departments WHERE department_name = 'Sales')
从 departments
表中选择 department_name
为 'Sales' 的 department_id
。在这种情况下,它将返回 1
。
- 然后,外部查询从
employees
表中选择 department_id
在子查询返回的集合(仅为 1
)中的 employee_name
。
步骤 3:执行查询并查看结果
在你的 psql
终端中执行查询。你应该看到以下输出:
employee_name
---------------
Alice
Charlie
(2 rows)
这表明 Alice 和 Charlie 是在 'Sales'(销售)部门工作的员工。
步骤 4:将 EXISTS
与子查询一起使用
在 WHERE
子句中使用子查询的另一种方法是使用 EXISTS
运算符。 EXISTS
运算符测试子查询中行的存在。如果子查询返回任何行,则返回 true,否则返回 false。
以下是使用 EXISTS
获得相同结果的示例:
SELECT employee_name
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
AND d.department_name = 'Sales'
);
此查询实现与前一个查询相同的结果,但使用 EXISTS
运算符而不是 IN
。
解释:
- 子查询
SELECT 1 FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'Sales'
检查是否存在一个部门名称为 'Sales',并且具有与当前员工相同的 department_id
。
- 如果子查询返回任何行(表示存在一个 'Sales' 部门,其
department_id
相同),则 EXISTS
运算符返回 true,并选择员工的姓名。
在你的 psql
终端中执行查询。你应该看到与之前相同的输出:
employee_name
---------------
Alice
Charlie
(2 rows)
你现在已成功地在 WHERE
子句中使用子查询,以根据另一个表中的条件来过滤数据。你还学习了如何将 EXISTS
运算符与子查询一起使用。