SQLite - 子查询:初学者指南

你好,有抱负的程序员们!今天,我们将踏上一段激动人心的旅程,探索SQLite子查询的世界。别担心如果你是编程新手——我将作为你友好的向导,一步步解释所有内容。让我们开始吧!

SQLite - Subqueries

子查询是什么?

在我们深入了解之前,先来了解一下子查询是什么。想象你正在计划一个聚会,需要创建一个宾客名单。你可能会先列出所有朋友,然后缩小到那些住得近的人。在SQL中,子查询就像第二步——一个查询内的查询,帮助你精炼结果。

在SELECT语句中使用子查询

让我们从子查询最常见的使用开始——在SELECT语句中。

基本子查询示例

SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

在这个例子中,我们在寻找那些薪水高于平均水平的员工。内部查询 (SELECT AVG(salary) FROM employees) 计算平均薪水,外部查询使用这个结果来筛选员工。

FROM子句中的子查询

SELECT department, avg_salary
FROM (
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
) AS dept_salaries
WHERE avg_salary > 50000;

在这里,我们创建了一个包含每个部门平均薪水的临时表,然后选择平均薪水超过50,000的部门。

在INSERT语句中使用子查询

子查询还可以用来根据现有信息插入数据。

INSERT INTO high_earners (employee_id, name)
SELECT id, name
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);

这个查询将那些薪水超过平均薪水1.5倍的员工插入到 'high_earners' 表中。

在UPDATE语句中使用子查询

根据子查询更新数据是另一个强大的功能。

UPDATE employees
SET bonus = salary * 0.1
WHERE department_id IN (
SELECT id
FROM departments
WHERE performance_rating > 8
);

这个查询会给表现优异部门的员工发放10%的奖金。

在DELETE语句中使用子查询

最后,让我们看看子查询如何帮助删除数据。

DELETE FROM products
WHERE id NOT IN (
SELECT product_id
FROM orders
WHERE order_date > DATE('now', '-1 year')
);

这个查询会删除在过去一年内没有被订单的产品。

子查询方法

下面是一个总结我们所涵盖的不同方法的表格:

方法 描述 示例
带子查询的SELECT 使用子查询来过滤或为主查询计算值 SELECT ... WHERE column > (SELECT AVG(...))
FROM中的子查询 创建一个派生表以供查询 SELECT ... FROM (SELECT ...) AS derived_table
带子查询的INSERT 根据子查询插入数据 INSERT INTO ... SELECT ... WHERE ...
带子查询的UPDATE 根据子查询更新数据 UPDATE ... SET ... WHERE column IN (SELECT ...)
带子查询的DELETE 根据子查询删除数据 DELETE FROM ... WHERE column NOT IN (SELECT ...)

结论

恭喜你!你已经迈出了进入SQLite子查询世界的第一步。记住,就像学习骑自行车一样,掌握子查询需要练习。如果一开始没有立即掌握,不要气馁——继续尝试不同的查询,很快你就能轻松编写复杂的子查询了。

在我们结束之前,让我分享一段我的教学经验:我曾经有一个学生在子查询上挣扎。她把子查询比作俄罗斯套娃——查询中的查询。这个类比帮助她形象化了这个概念,很快她就成为了班上写子查询最厉害的学生之一。

所以,无论你将子查询看作是套娃,还是可能是一条寻宝之旅,每个查询都引导你更接近宝藏,都要继续练习和探索。数据的世界是广阔而激动人心的,子查询就是解锁其秘密的钥匙!

快乐查询,记住——在数据库的世界里,好奇心是最好的朋友。不断提问,你就会不断找到答案!

Credits: Image by storyset