📜  PostgreSQL-子查询(1)

📅  最后修改于: 2023-12-03 15:33:45.840000             🧑  作者: Mango

PostgreSQL子查询

在 PostgreSQL 中,子查询是指将一个 SQL 查询嵌套在另一个 SQL 查询中的查询。子查询在编写 SQL 查询时非常有用,因为它允许您在查询中使用动态生成的数据,这些数据在运行时动态生成。

子查询语法

子查询的语法如下:

SELECT column1, column2, ...
FROM table1
WHERE column1 OPERATOR (SELECT column1 FROM table2 WHERE condition);

关键字 SELECT 后面的括号中包含第二个查询。该查询是在主查询中嵌套的查询,对于每个主查询的行,都会使用该查询来计算值。括号中的子查询称为嵌套查询。

示例

让我们看一个使用子查询的例子。

假设我们有两个表格:customersorderscustomers 表格包含客户信息,orders 表格包含订单信息。

CREATE TABLE customers (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  email TEXT NOT NULL
);

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  order_date DATE NOT NULL
);

INSERT INTO customers (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com');

INSERT INTO orders (customer_id, order_date) VALUES
(1, '2020-01-01'),
(2, '2020-02-01'),
(1, '2020-03-01'),
(3, '2020-04-01'),
(1, '2020-05-01');

我们想要列出每个客户的姓名和他们最近一次下订单的日期。我们可以使用子查询来完成这个任务。

SELECT name, (
  SELECT MAX(order_date)
  FROM orders
  WHERE customer_id = customers.id
) AS latest_order
FROM customers;

输出:

  name   | latest_order
---------+-------------
 Alice   | 2020-05-01
 Bob     | 2020-02-01
 Charlie | 2020-04-01

在这个示例中,我们在主查询中选择了 customers 表格的 name 列,并在主查询中使用子查询来选择每个客户的最近一次订单的日期。

注意事项
  • 子查询速度较慢,因为需要为每个行执行多个查询。如果可能,尽量使用联接来完成同样的任务,因为联接通常比子查询快得多。
  • 如果嵌套查询的结果集很大,则可能会在内存和 CPU 方面对性能造成负面影响。因此,请谨慎使用子查询。
  • 子查询可以嵌套到任意深度中,但要记得缩进,以便您可以很容易地阅读和更新代码。