创建视图,查询所有学生信息
对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦
解决:定义视图
视图本质就是对查询的封装。
定义
视图的基本使用 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦 解决:定义视图 视图本质就是对查询的封装。 定义视图,建议以v_开头 创建视图,查询所有学生信息 试试写一下: 查看视图:查看表会将所有的视图也列出来 我们发现视图是跟表在一起的。 使用:视图的用途就是查询。使用如下: 删除视图 操作的数据表都是一些真实存在的表,其实,数据库还有一种虚拟表,它同真实表一样,都包含一系列带有名称和列的数据,这种表被称为视图。 细节扩展: 视图概述: 视图是从一个或多个表中导出来的,它是一种虚拟存在的表,并且表的结构和数据都依赖于基本表。通过视图不仅可以看到存放在基本表中的数据,并且还可以像操作基本表一样,对视图中存放的数据进行查询、修改和删除。与直接操作基本表相比,视图具有以下优点: 简化查询语句: 视图不仅可以简化用户对数据的理解,也可以简化对数据的操作。日常开发中可以将经常使用的查询定义为视图,从而使用户避免大量重复的操作。 安全性: 通过视图用户只能查询和修改他们所能见到的数据,数据库中的其他数据则既看不到也取不到,数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。 逻辑数据独立性: 视图可以帮助用户屏蔽真实表结构变化带来的影响。 综上所述,在操作数据库时,由于视图是在基本表上建立的表,它的结构和数据都来自于基本表,因此,诸如更新数据等操作,都可以在视图上进行。 视图管理: 创建视图: 视图中包含select查询的结果,因此视图的创建基于select语句和已经存在的数据表。视图可以建立在一张表上,也可以建立在多张表上。 语法: create [or replace] [algorithm={undefined | merge | temptable}] view view_name [{column_list}] as select_statement [with [cascaded|local] check option] 解释如下: create表示创建视图的关键字。 or replace如果给定了此子句,表示该语句能够替换已有视图。 algorithm可选,表示视图选择的算法。 undefined表示mysql将自动选择所要使用的算法。 merge表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。 temptable表示将视图的结果存入临时表,然后使用临时表执行语句。 view_name表示要创建的视图名称。 column_list可选mssql 使用视图,表示属性清单。指定了视图中各个属性的名,默认情况下,与select语句中查询的属性相同。 as表示指定视图要执行的操作。 select_statement是一个完整的查询语句,表示从某个表或视图中查出某些满足条件的记录,将这些记录导入视图中。 with check option可选,表示创建视图时要保证在该视图的权限范围之内。 cascaded可选,表示创建视图时需要满足跟该视图有关的所有相关视图和表的条件,该参数为默认值。 local可选,表示创建视图时,只要满足该视图本身定义的条件即可。 创建视图时要求具有针对视图的create view权限,以及针对由select语句选择的每一列上的某些权限。对于在select语句中其他地方使用的列,必须具有select权限。如果还有or replace子句,必须在视图上具有drop权限。 需要注意的是:视图属于数据库,在默认情况下,将在当前数据库创建新视图,要想在给定数据库中明确创建视图,创建时应将名称指定为db_name.view_name。 在单表上创建视图: 准备工作: 在student表上创建view_stu视图: 则会生成一个view_stu视图,接下使用select语句查看view_stu视图,查询结果如下: 在student表上创建view_stu2视图,并自定义字段名称。 在实际开发中,用户可以根据自己的需要通过使用视图的方式获取基本表中自己需要的数据,这样既能满足用户的需求,也不需要破坏基本表原来的结构,从而保证了基本表中数据的安全性。 在多表上创建视图: 准备工作: 创建stu_class视图: create view stu_class (id, name, glass) as select student.s_id, student.name, stu_info.class from student, stu_info where student.s_id = stu_info.s_id; 查看视图的结构: 使用describe语句查看视图(简写为desc): null表示该列是否可以存储null值。 key表示该列是否已经编制索引。 default表示该列是否有默认值。 extra表示获取到的与给定列相关的附加信息。 使用show table status语句查看视图: comment项的值为view,说明所查的stu_class是一个视图,存储引擎、数据长度等信息都显示为null,说明视图是虚拟表。同样使用show table status语句查看student表的信息: comment项没有信息,说明这个表不是视图,这就是视图和普通表最直接的区别。 使用show create view查看视图: 修改视图: 所谓修改视图是指修改数据库中存在的视图的定义,比如,当基本表中的某些字段发生变化时,可以通过修改视图的方式来保持视图与基本表的一致性。 使用create or replace view语句修改视图: 修改view_stu视图,修改之前先来查询下: 上述结果显示了view_stu视图修改后的字段信息与student表中的字段信息完全相同。 使用alter语句修改视图: 上述结果显示了view_stu视图修改后的信息,修改后只剩下一个chinese字段。 更新视图: 更新视图是指通过视图来更新、插入、删除基本表中的数据。因为视图是一个虚拟表,其中没有数据,当通过视图更新数据时其实是在更新基本表中的数据,如果对视图中的数据进行增加或者删除操作时,实际上就是在对其基本表中的数据进行增加或者删除操作。 使用update语句更新视图: 更新之前,先来查询一下: 使用insert语句更新视图: 总结:当基本表中的数据发生变化之后,与基本表对应的视图数据也会一同改变。 使用delete语句更新视图: 需要注意的是:尽管更新视图有多种方式,但是并非所有情况下都能执行视图的更新操作。当视图中包含如下内容时,视图的更新操作将不能被执行。 视图中包含基本表中被定义为非空的列。 在定义视图的select语句后的字段列表中使用了数学表达式。 在定义视图的select语句后的字段列表中使用了聚合函数。 在定义视图的select语句中使用了distinct、union、top、group、by、having子句。 删除视图: 视图名称可以添加多个,各个名称之间使用逗号隔开,删除视图必须拥有drop权限。 综合案例----视图的应用 案例的目的: 掌握视图的创建、查询、更新和删除操作。 假如:有来自河北和山东的三个理科学生报考北京大学(Peking University)和清华大学(Tsinghua University),现在需要对其考试的结果进行查询和管理。清华大学的录取分数线为725,北京大学的录取分数线为720。需要创建三个表对学生的信息进行管理,分别是学生表、报名表、成绩表,这三个表的主键s_id是统一的。 创建学生表,stu并插入数据: 创建报名表sign并插入数据: 创建成绩表stu_mark,插入三条记录: 创建考上北京大学(Peking University)学生视图: 视图的名称为beida,视图的内容包含考上北大的学生学号,姓名,成绩和报考学校名称这4个字段。 create view beida(id, name, mark, sch) as select stu_mark.s_id, stu_mark.s_name, stu_mark.mark, sign.s_sign_sch from stu_mark, sign where stu_mark.s_id = sign.s_id and stu_mark.mark >= 720 and sign.s_sign_sch = 'Peking University'; 创建考上清华大学(Tsinghua University)的学生视图: 视图的名称为qinghua,视图的内容包含考上清华的学生学号、姓名、成绩和报考学校这4个字段。 create view qinghua(id, name, mark, sch) as select stu_mark.s_id, stu_mark.s_name, stu_mark.mark, sign.s_sign_sch from stu_mark, sign where stu_mark.s_id = sign.s_id and stu_mark.mark >= 725 and sign.s_sign_sch = 'Tsinghua University'; 更新视图: huangyun的成绩在录入的时候录入错误,多录了10分,那需要进行修改,减去多录的10分,在视图中使用update语句对基本表的数据进行修改。 从执行结果可以huangyun的学生成绩减去了多录的10分,变为726分。Huangyun同学的信息依然在qinghua视图中,因为清华大学的录取分数线是725分,虽然huangyun同学减去了多录的10分,但依然以超出分数线一分的成绩,顺利被清华大学录取。 (编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |