视图
视图是基于查询定义的虚拟表,不存储数据,每次访问时动态执行底层查询。
视图可以从一张或多张基表、甚至其他视图中创建。你可以像查询普通表一样 SELECT * FROM 视图名,数据库引擎会在背后执行视图的底层 SQL,返回最新数据。视图支持 INSERT、UPDATE、DELETE 操作,但有限制——只有当视图满足一定条件(比如直接映射到单表、不含聚合函数、不含 DISTINCT 等)时才允许写操作。
视图的核心价值是封装复杂查询和安全控制。飞翔科技的 HR 系统可能需要频繁查询"技术部员工工资汇总",这个查询涉及多表 JOIN 和聚合计算。把它封装成视图 v_tech_salary 后,后续只需 SELECT * FROM v_tech_salary 即可,代码简洁且复用性高。
另一个重要用途是权限隔离:你可以创建一个只暴露部分列的视图,把敏感数据(如工资明细)隐藏起来,然后授权普通用户访问这个视图而非原始表。这样既满足了查询需求,又保护了数据安全。
标准写法:
-- 创建视图
CREATE VIEW 视图名 AS
SELECT 列名 FROM 表名 WHERE 条件;
-- 替换已有视图
CREATE OR REPLACE VIEW 视图名 AS
SELECT ...;
-- 删除视图
DROP VIEW 视图名;
以飞翔科技为例。工资汇总和商品库存两个场景的视图:
-- 创建视图:技术部员工工资汇总
CREATE VIEW v_tech_salary AS
SELECT
emp_name,
basic_salary,
performance_bonus,
basic_salary + performance_bonus - social_security - personal_tax AS actual_salary,
salary_grade
FROM employees
WHERE dept_code = 2;
-- 查询视图(和查普通表一样)
SELECT * FROM v_tech_salary
WHERE actual_salary > 20000;
-- 创建视图:飞翔小店商品库存概览
CREATE VIEW v_feixiang_products AS
SELECT
product_name,
price,
stock,
CASE
WHEN stock > 500 THEN '充足'
WHEN stock BETWEEN 1 AND 500 THEN '紧张'
ELSE '缺货'
END AS stock_status
FROM products
WHERE shop_name = '飞翔小店';
-- 查询库存紧张的商品
SELECT * FROM v_feixiang_products
WHERE stock_status = '紧张';
v_tech_salary 把复杂的工资计算公式封装起来,调用方不用关心社保、个税怎么扣;v_feixiang_products 把库存状态的计算逻辑固化在视图里,避免每次查询都写一遍 CASE WHEN。视图让 SQL 代码更模块化、更易维护,是数据库设计中的高级技巧。不过要注意:频繁更新的基表上不宜创建过多嵌套视图,每次查询视图都会重新执行底层 SQL,复杂视图可能影响性能。