SQL视图是数据库中的虚拟表,它本身不存储实际数据,而是保存了一条查询语句的逻辑,当查询视图时,数据库会执行视图对应的查询逻辑返回结果。对于需要频繁执行的复杂查询,创建视图可以把复杂的查询逻辑封装起来,后续只需要查询视图名称就能获取所需数据,不需要重复编写冗长的SQL语句。

SQL视图创建基础语法
创建视图的核心语法如下,不同数据库的差异很小,大部分场景可以通用:
-- 基础创建视图语法 CREATE VIEW 视图名称 AS SELECT 列1, 列2, 聚合函数(列3) 别名 FROM 表名 WHERE 过滤条件 GROUP BY 分组列 ORDER BY 排序列;
需要注意,视图名称在数据库中需要唯一,不能和已有的表名、视图名重复。如果希望替换已经存在的视图,可以使用CREATE OR REPLACE VIEW语法,避免先删除再创建的繁琐操作。
用视图简化多表关联查询
多表关联是复杂查询的常见场景,比如需要同时查询用户表、订单表、商品表的信息,每次编写关联语句都很繁琐,用视图封装后就可以简化操作。
假设存在三张表:
- user表:存储用户id、用户名、手机号
- order表:存储订单id、用户id、商品id、下单时间
- product表:存储商品id、商品名称、商品价格
如果需要频繁查询用户的订单及对应商品信息,可以先创建视图:
-- 创建用户订单商品关联视图
CREATE OR REPLACE VIEW user_order_product_view AS
SELECT
u.user_id,
u.user_name,
u.phone,
o.order_id,
o.order_time,
p.product_name,
p.product_price
FROM `user` u
INNER JOIN `order` o ON u.user_id = o.user_id
INNER JOIN product p ON o.product_id = p.product_id;后续需要查询相关数据的时候,只需要执行简单的查询语句即可:
-- 查询用户张三的所有订单信息 SELECT * FROM user_order_product_view WHERE user_name = '张三';
用视图简化聚合统计查询
聚合统计类查询通常包含GROUP BY、SUM、COUNT等逻辑,编写起来较长,用视图封装后也能大幅提升效率。
比如需要统计每个用户的订单总数和总消费金额,创建视图的语句如下:
-- 创建用户订单统计视图
CREATE OR REPLACE VIEW user_order_stat_view AS
SELECT
u.user_id,
u.user_name,
COUNT(o.order_id) AS order_count,
SUM(p.product_price) AS total_amount
FROM `user` u
LEFT JOIN `order` o ON u.user_id = o.user_id
LEFT JOIN product p ON o.product_id = p.product_id
GROUP BY u.user_id, u.user_name;后续查询某个用户的消费统计时,直接查询视图即可:
-- 查询用户李四的订单统计信息 SELECT * FROM user_order_stat_view WHERE user_name = '李四';
视图的修改与删除
如果视图的查询逻辑需要调整,除了使用CREATE OR REPLACE VIEW替换,也可以用ALTER VIEW修改:
-- 修改视图逻辑,新增手机号字段
ALTER VIEW user_order_product_view AS
SELECT
u.user_id,
u.user_name,
u.phone,
o.order_id,
o.order_time,
p.product_name,
p.product_price
FROM `user` u
INNER JOIN `order` o ON u.user_id = o.user_id
INNER JOIN product p ON o.product_id = p.product_id
WHERE o.order_time >= '2024-01-01';如果视图不再使用,可以用DROP VIEW语句删除:
-- 删除视图 DROP VIEW IF EXISTS user_order_product_view;
视图使用注意事项
- 视图是虚拟表,不会存储实际数据,查询视图时本质是执行对应的查询语句,因此复杂视图的查询性能不会比直接执行原查询更高,适合简化逻辑而不是提升性能。
- 部分数据库支持可更新视图,也就是可以通过视图修改基表数据,但包含聚合函数、GROUP BY、多表关联的视图通常不支持更新,使用时需要注意对应数据库的规则。
- 不要过度创建视图,尤其是基于视图再创建视图的嵌套操作,会导致查询逻辑难以维护,出现问题的时候排查成本很高。