首页 > 数据库 > 数据库开发技术 > 《MySQL 入门教程》第 29 篇 视图
替代复杂查询,减少复杂性。将复杂的查询语句定义为视图,然后使用视图进行查询,可以隐藏具体的实现;
提供一致性接口,实现业务规则。在视图的定义中增加业务逻辑,对外提供统一的接口;当底层表结构发生变化时,只需要修改视图接口,而不需要修改外部应用,可以简化代码的维护并减少错误;
控制对于表的访问,提高安全性。通过视图为用户提供数据访问,而不是直接访问表;同时可以限制允许访问某些敏感信息,例如身份证号、工资等。
CREATE [OR REPLACE] VIEW view_name [(column1, column2, ...)]
AS select_statement;
CREATE OR REPLACE VIEW developerASSELECT emp_id, emp_name, sex, manager, hire_date, job_id, emailFROM employeeWHERE dept_id = 4;
CREATE OR REPLACE VIEW developer_count(jobtitle, sex, num)AS SELECT j.job_title, d.sex, COUNT(*)FROM developer dJOIN job j ON (j.job_id = d.job_id)GROUP BY j.job_title, d.sex;
SELECT jobtitle, sex, numFROM developer_countORDER BY num DESC;jobtitle |sex |num|---------|----|---|程序员 |男 | 7|开发经理 |男 | 1|程序员 |女 | 1|
SHOW FULL TABLES WHERE table_type = 'VIEW';Tables_in_hrdb |Table_type|--------------------|----------|developer |VIEW |developer_count |VIEW |emp_details_view |VIEW |
SHOW CREATE VIEW developer;View |Create View |character_set_client|collation_connection|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------|--------------------|developer|CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `developer` AS select `employee`.`emp_id` AS `emp_id`,`employee`.`emp_name` AS `emp_name`,`employee`.`sex` AS `sex`,`employee`.`manager` AS `manager`,`employee`.`hire_date` AS `hire_d|utf8mb4 |utf8mb4_0900_ai_ci |
SELECT view_definition
FROM information_schema.viewsWHERE table_schema = 'hrdb'AND table_name = 'developer';VIEW_DEFINITION |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|select `hrdb`.`employee`.`emp_id` AS `emp_id`,`hrdb`.`employee`.`emp_name` AS `emp_name`,`hrdb`.`employee`.`sex` AS `sex`,`hrdb`.`employee`.`manager` AS `manager`,`hrdb`.`employee`.`hire_date` AS `hire_date`,`hrdb`.`employee`.`job_id` AS `job_id`,`hrdb`.`|
ALTER VIEW view_name [(column1, column2, ...)]
AS select_statement;
ALTER VIEW developerASSELECT emp_id, emp_name, sex, manager, hire_date, job_id, emailFROM employeeWHERE dept_id = 4;
RENAME TABLE developer_count TO developer_job_count;
CREATE [OR REPLACE] ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED} VIEW view_name [(column1, column2, ...)]
AS select_statement;
CREATE OR REPLACE ALGORITHM = MERGE VIEW developerASSELECT emp_id, emp_name, sex, manager, hire_date, job_id, emailFROM employeeWHERE dept_id = 4;
SELECT *FROM developerWHERE sex = '女';
SELECT *FROM employeeWHERE dept_id = 4AND sex = '女';
CREATE OR REPLACE ALGORITHM = TEMPTABLE VIEW developerASSELECT emp_id, emp_name, sex, manager, hire_date, job_id, emailFROM employeeWHERE dept_id = 4;
EXPLAIN ANALYZESELECT *FROM developerWHERE sex = '女';EXPLAIN |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-> Index lookup on developer using <auto_key0> (sex='女') (actual time=0.006..0.008 rows=1 loops=1)
-> Materialize (actual time=0.407..0.409 rows=1 loops=1)
-> Index lookup on employee using idx_emp_dept (dept_id=4) (cost=1.62 rows=9) (actual time=0.194..0.215 rows=9 loops=1)|
聚合函数或窗口函数,例如 AVG、SUM、COUNT 等;
DISTINCT、GROUP BY、HAVING 子句;
集合运算符 UNION 和 UNION ALL;
SELECT 列表中的子查询。非关联子查询不支持 INSERT,但是支持 UPDATE 和 DELETE;关联子查询不支持所有的 DML 语句;
外连接查询;
在 FROM 子句中引用其他不可更新视图;
WHERE 子句中的子查询引用 FROM 子句中的表;
视图只引用了常量值(没有使用任何基础表);
ALGORITHM = TEMPTABLE,使用临时表的视图;
多次引用基础表中的某个字段(不支持 INSERT,但是可以 UPDATE 或者 DELETE);
CREATE OR REPLACE VIEW developer_updatableASSELECT emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, emailFROM employeeWHERE dept_id = 4;
UPDATE developer_updatableSET email = 'zhaoshi@shuguo.net'WHERE emp_name = '赵氏';SELECT emp_name, emailFROM employeeWHERE emp_name = '赵氏';emp_name|email |--------|------------------|赵氏 |zhaoshi@shuguo.net|
UPDATE developer_updatableSET bonus = 2000WHERE emp_name = '赵氏';ERROR 1054 (42S22): Unknown column 'bonus' in 'field list'
INSERT INTO developer_updatable(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, email)VALUES (30, '孙七七', '女', 5, 18, '2020-09-10', 10, 6000, 'sunqiqi@shuguo.com');
SELECT emp_id, emp_name, sexFROM employeeWHERE emp_name = '孙七七';emp_id|emp_name|sex|------|--------|---|
30|孙七七 |女 |SELECT emp_id, emp_name, sexFROM developer_updatableWHERE emp_name = '孙七七';emp_id|emp_name|sex|------|--------|---|
CREATE OR REPLACE VIEW developer_updatableASSELECT emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, emailFROM employeeWHERE dept_id = 4 WITH CHECK OPTION;
INSERT INTO developer_updatable(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, email)VALUES (30, '孙七七', '女', 5, 18, '2020-09-10', 10, 6000, 'sunqiqi@shuguo.com');SQL Error [1369] [HY000]: CHECK OPTION failed 'hrdb.developer_updatable'
SELECT table_name, is_updatable, check_optionFROM information_schema.viewsWHERE table_schema = 'hrdb';TABLE_NAME |IS_UPDATABLE|CHECK_OPTION|-------------------|------------|------------|developer |NO |NONE |developer_count |NO |NONE |developer_updatable|YES |CASCADED |emp_details_view |YES |NONE |
DROP VIEW [IF EXISTS] view_name;
DROP VIEW developer;
原文作者:SQL编程思想;如有侵权,请联系管理员删除。