跳到主要内容

SQL 子查询

以下是 SQL 子查询的三个关键知识要点的概括:

  1. 子查询的定义与基本使用:在 SQL 中,子查询是嵌套在另一个查询内的 SQL 查询。例如,在 SELECT, INSERT, UPDATE, 或 DELETE 语句中可以使用子查询。一个典型的应用是在 WHERE 子句中使用子查询来确定外部查询的过滤条件。

  2. 子查询的语法和应用场景:子查询的基本语法是在 WHERE 子句中使用 SELECT 语句。子查询可以用于多种场景,如比较特定值(如示例中使用 MAXMIN 函数的情况),或者用于 IN, EXISTS, ANY, ALL 等操作符中,用于复杂的数据过滤和比较。

  3. 子查询与 JOIN 操作的比较:虽然子查询在某些情况下可以与 JOIN 操作替换使用,但通常 JOIN 操作在性能上更优化。例如,使用 INNER JOIN 来连接两个表,并获取匹配的记录通常比在 WHERE 子句中使用子查询更有效率。

在 SQL 中,可以在一个查询内部放置另一个 SQL 查询。这个内部查询被称为子查询。

示例

SELECT first_name
FROM Customers
WHERE customer_id= (
SELECT MAX(customer_id)
FROM CUSTOMERS
);

这里,查询分为两部分:

  • 子查询从 Customers 表中选择最大的 id
  • 外部查询选择具有最大 id(由子查询返回)的客户的 first_name

SQL 子查询语法

SQL 子查询的语法是:

SELECT column FROM  table
WHERE column OPERATOR (
SELECT column FROM table
);

这里,

  • column 是要过滤的列的名称
  • OPERATOR 是连接两个查询的任何 SQL 运算符
  • table 是要从中获取列的表的名称

示例 1:SQL 子查询

SELECT *
FROM Customers
WHERE age = (
SELECT MIN(age)
FROM Customers
);

在子查询中,外部查询的结果取决于内部子查询的结果集。这就是为什么子查询也被称为嵌套查询。

这里,SQL 命令

  1. 首先执行子查询;从 Customers 表中选择最小的 age
  2. 执行外部查询;选择 age 等于子查询结果的行

如何在 SQL 中使用子查询

示例 2:SQL 子查询与 IN 运算符

假设我们想要了解下过 订单客户 的详细信息。以下是如何使用子查询来做到这一点:

SELECT customer_id, first_name
FROM Customers
WHERE customer_id IN (
SELECT customer_id
FROM Orders
);

这里,SQL 命令

  1. Orders 表中选择 customer_id
  2. Customers 表中选择 customer_id 在子查询结果集中的行

如何在 SQL 中使用子查询

SQL 子查询与 JOIN

在某些情况下,我们可以使用子查询和 JOIN 子句 获取相同的结果集。例如,

-- 将 Customers 和 Orders 表连接并选择 customer_id 值匹配的行
-- 结果集包含下订单的客户的 customer_id 和 first_name

SELECT DISTINCT Customers.customer_id, Customers.first_name
FROM Customers
INNER JOIN Orders
ON Customers.customer_id = Orders.customer_id
ORDER BY Customers.customer_id;

上面查询的结果集与下面的查询相同:

SELECT customer_id, first_name
FROM Customers
WHERE customer_id IN (
SELECT customer_id
FROM Orders
);

注意: 尽可能使用 JOIN 子句而不是子查询。这是因为 JOIN 的执行速度比子查询更优化。