-- 示例1:创建简单视图 CREATEVIEW v_employee_basic AS SELECT id, name, department_id, position, salary FROM tb_employee WHERE status =1;
-- 示例2:创建多表关联视图 CREATEVIEW v_employee_detail AS SELECT e.id, e.name, e.position, e.salary, d.department_name, d.location FROM tb_employee e INNERJOIN tb_department d ON e.department_id = d.id;
-- 示例3:创建带计算的视图 CREATEVIEW v_employee_salary AS SELECT id, name, salary, salary *12AS annual_salary, salary *0.1AS bonus, salary *1.1AS total_income FROM tb_employee WHERE status =1;
-- 示例4:创建聚合视图(统计各部门信息) CREATEVIEW v_department_stats AS SELECT d.id AS department_id, d.department_name, COUNT(e.id) AS employee_count, ROUND(AVG(e.salary), 2) AS avg_salary, MAX(e.salary) AS max_salary, MIN(e.salary) AS min_salary FROM tb_department d LEFTJOIN tb_employee e ON d.id = e.department_id GROUPBY d.id, d.department_name;
-- 查看数据库中所有视图 SHOWFULL TABLES WHERE Table_type ='VIEW';
-- 查看视图定义 SHOWCREATEVIEW v_employee_detail;
-- 查看视图结构(像表一样) DESCRIBE v_employee_detail;
-- 修改视图(使用 OR REPLACE) CREATEOR REPLACE VIEW v_employee_basic AS SELECT id, name, department_id, position, salary, hire_date FROM tb_employee WHERE status =1;
-- 删除视图 DROPVIEW IF EXISTS v_employee_basic;
-- 删除多个视图 DROPVIEW IF EXISTS v_employee_basic, v_employee_detail;
1.4 视图的数据操作
1 2 3 4 5 6 7 8 9 10 11 12 13
-- 通过视图查询数据(和查询表一样) SELECT*FROM v_employee_basic WHERE salary >5000;
-- 通过视图插入数据(需满足视图和基表的约束) INSERT INTO v_employee_basic (id, name, department_id, position, salary) VALUES (100, '王五', 1, '工程师', 8000); -- 注意:插入的数据必须满足视图的 WHERE 条件(status=1)
-- 通过视图更新数据 UPDATE v_employee_basic SET salary =9000WHERE id =100;
-- 通过视图删除数据 DELETEFROM v_employee_basic WHERE id =100;
-- 场景:数据安全 - 创建不显示敏感信息的视图 CREATEVIEW v_employee_public AS SELECT id, name, department_id, position, hire_date FROM tb_employee; -- 此视图不包含 salary、email、phone 等敏感信息
-- 场景:简化报表查询 CREATEVIEW v_monthly_report AS SELECT DATE_FORMAT(o.create_time, '%Y-%m') ASmonth, COUNT(*) AS order_count, SUM(o.total_amount) AS total_amount, COUNT(DISTINCT o.user_id) AS unique_users FROM tb_order o WHERE o.status ='已完成' GROUPBY DATE_FORMAT(o.create_time, '%Y-%m');
-- 1. 创建按部门过滤的视图 CREATEVIEW v_employee_dept AS SELECT*FROM tb_employee WHERE department_id = ( SELECT department_id FROM tb_employee WHERE id = CURRENT_USER_ID() -- 假设有函数获取当前用户ID );