⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

SQL 子查询

学习在 WHERE 中使用子查询 · 难度:进阶 · +15XP

SQL 子查询

SQL 子查询 — 在查询中嵌套查询

学习前的准备

你需要一个 MySQL 数据库环境。子查询是把一个查询的结果用作另一个查询的输入——这是 SQL 从“基本操作”迈向“复杂分析”的关键一步。

什么是子查询?

子查询是嵌套在另一个查询内部的 SELECT 语句。可以放在 WHERE、FROM 或 SELECT 中。

-- 找出工资高于公司平均工资的员工
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

子查询在 WHERE 中

-- 使用 IN
SELECT name, dept FROM employees
WHERE dept IN (SELECT DISTINCT dept FROM employees WHERE salary > 8000);

-- 使用 EXISTS SELECT dept FROM (SELECT DISTINCT dept FROM employees) AS d WHERE EXISTS ( SELECT 1 FROM employees WHERE dept = d.dept AND salary > 8000 );

-- 使用 ANY SELECT name, salary FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE dept = '市场部');

子查询在 FROM 中(派生表)

SELECT dept, avg_salary
FROM (
    SELECT dept, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY dept
) AS dept_stats
WHERE avg_salary > 7500;

子查询在 SELECT 中(标量子查询)

SELECT
    name,
    salary,
    (SELECT MAX(salary) FROM employees) AS max_salary,
    (SELECT MAX(salary) FROM employees) - salary AS diff
FROM employees;

关联子查询

关联子查询依赖于外层查询的每一行,对外层的每一行都会执行一次。

-- 找出每个部门中工资最高的员工
SELECT name, dept, salary
FROM employees e1
WHERE salary = (
    SELECT MAX(salary)
    FROM employees e2
    WHERE e2.dept = e1.dept
);

小结

子查询让你能在一个查询中使用另一个查询的结果。WHERE 子查询用于条件筛选,FROM 子查询用作临时表,SELECT 子查询提供计算列。关联子查询则让子查询能根据外层的每一行动态计算。掌握子查询后,你已经能够应对 80% 的日常数据分析需求。

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 146 篇
0 完成
🔥 0