子查询(Subquery)和视图(View)都是数据库中用于封装和复用查询逻辑的重要手段,它们之间既有联系也有明显区别。
子查询是嵌套在其他 SQL 语句(SELECT、INSERT、UPDATE、DELETE 等)中的查询。
示例:
SELECT name
FROM employee
WHERE dept_id = (
SELECT id FROM department WHERE name = 'IT'
);
特点:
视图是基于 SQL 查询结果的虚拟表,本身不存数据(除非是物化视图)。
示例:
CREATE VIEW it_employees AS
SELECT * FROM employee
WHERE dept_id = (SELECT id FROM department WHERE name = 'IT');
使用:
SELECT * FROM it_employees;
特点:
视图的定义本质上就是一个 SELECT 语句,这个 SELECT 中可以包含子查询。
✅ 视图 = 命名的查询(可能包含子查询)
当一个子查询被频繁使用时,通常会把它定义成视图,以提高可读性和复用性。
子查询(临时):
SELECT * FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee);
视图(复用):
CREATE VIEW high_salary_emp AS
SELECT * FROM employee
WHERE salary > (SELECT AVG(salary) FROM employee);
视图建立后,也可以作为子查询的数据来源。
SELECT * FROM (
SELECT * FROM it_employees
) t
WHERE salary > 10000;
| 对比项 | 子查询 | 视图 |
|---|---|---|
| 是否存储 | 否 | 是(定义存储) |
| 生命周期 | 单次执行 | 长期存在 |
| 使用方式 | 嵌套在 SQL 中 | 像表一样使用 |
| 可读性 | 较低 | 高 |
| 性能 | 依实现而定 | 优化器可重用 |
子查询是“临时查询”,视图是“被保存的查询”;视图常常由子查询构成,子查询在需要时也可以变成视图。
如果你愿意,我也可以结合具体数据库(MySQL / Oracle / PostgreSQL)或性能优化角度再讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。