SQL - 子查询

你好,有抱负的SQL爱好者们!我很高兴能成为你们在这激动人心的SQL子查询世界中的向导。作为一位有着多年计算机科学教学经验的人,我可以告诉你们,子查询就像是秘密酱料,能让你的SQL技能从优秀变为卓越。那么,让我们一起深入探讨子查询的神秘之处吧!

SQL - Sub Queries

SQL 子查询

子查询是什么?

想象一下你在做三明治。面包是你的主查询,但让它真正美味的是里面的填充物——那就是你的子查询!在SQL术语中,子查询是嵌套在另一个查询中的查询。就像在问题中提出另一个问题,让你能够执行单个查询可能无法完成的复杂操作。

让我们看一个简单的例子:

SELECT employee_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Marketing');

在这个查询中,括号内的部分是我们的子查询。它找到了市场部门(Marketing)的department_id,然后外部查询使用这个结果来找到该部门的所有员工。

需要遵循的规则

在我们深入探讨之前,先来回顾一些使用子查询的重要规则:

  1. 子查询必须用括号括起来。
  2. 子查询的SELECT子句只能有一个列,除非主查询用于比较的列有多个。
  3. 子查询中不能使用ORDER BY命令,尽管主查询可以使用ORDER BY。
  4. 返回多行的子查询只能与多值操作符一起使用,例如IN操作符。

下面是一个总结这些规则的便捷表格:

规则 描述
括号 子查询必须用括号括起来
单列 子查询SELECT通常只返回一个列
无ORDER BY 子查询中不能使用ORDER BY
多行 返回多行的子查询只能与多值操作符一起使用

与SELECT语句一起使用的子查询

子查询最常与SELECT语句一起使用。它们在根据动态条件检索数据时非常强大。让我们看一个更复杂的例子:

SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);

这个查询选择了所有价格高于所有产品平均价格的产品。子查询计算平均价格,主查询使用这个结果来过滤产品。

下面是另一个在SELECT子句中使用子查询的例子:

SELECT
employee_name,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;

这个查询不仅检索每个员工的姓名和薪水,还包括了所有员工平均薪水在每个行中。就像为每个员工提供了一个迷你报告!

与INSERT语句一起使用的子查询

子查询也可以与INSERT语句一起使用,以便从另一个表填充表数据。下面是一个例子:

INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);

这个查询将所有薪水超过平均薪水1.5倍的员工插入到high_salary_employees表中。就像创建了一个顶级赚钱者的VIP名单!

与UPDATE语句一起使用的子查询

子查询可以使你的UPDATE语句更加强大。下面是一个例子:

UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');

这个查询将所有电子产品类别的产品价格提高10%。子查询找到“Electronics”类别的category_id,然后主查询使用这个结果来更新正确的产品。

与DELETE语句一起使用的子查询

最后,让我们看看子查询如何与DELETE语句一起使用:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);

这个查询删除了所有在过去一年内没有下订单的客户的订单。子查询找到所有这样的客户,主查询删除他们的订单。

就这样,伙计们!我们一起穿越了SQL子查询的土地,从基本概念到更高级的应用。记住,熟能生巧,所以不要害怕在你们自己的数据库中尝试这些查询。

就像我总是对我的学生说的,SQL就像瑞士军刀——而子查询就是那个隐藏的刀片,可以帮你摆脱困境。所以继续探索,继续查询,最重要的是,保持学习!

Credits: Image by storyset