数据库视图view简介

来源:互联网 发布:防sql注入攻击 编辑:程序博客网 时间:2024/06/03 04:51

基本定义

    视图是一个虚拟表,其内容由查询定义。

    同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

    对其中所引用的基础表来说,视图的作用类似于筛选,基于数据表(可为多个表)的查询结果来筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。

    视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:手机联系人表,可以用视图只显示姓名,电话号码,而不显示住址和职位等,另一原因是可使复杂的查询易于理解和使用,自由组合增强可读性。


视图:查看图形或文档的方式

    视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。

    所以,视图不是真实存在的基础表,而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的真实创建的表中。

    视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。

当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中,自动同步的。


视图的优点

视图有很多优点,主要表现在:

  • 视点集中

    视图集中,即是使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务。这样通过只允许用户看到视图中所定义的数据而不是视图引用表中的数据而提高了数据的安全性。

  • 简化操作

    视图大大简化了用户对数据的操作。因为在定义视图时,若视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作,即内部联表查询。

  • 定制数据

    视图能够实现让不同的用户以不同的方式看到不同或相同的数据集。因此,当有许多不同水平的用户共用同一数据库时,这显得极为重要,实现参考1。

  • 合并分割数据

    在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。

  • 安全性

    视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其它数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。

    从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于试图,例如查询,插入,修改,删除操作等。

    即使数据库表中存在的数据,在视图中也可以选择不让用户查询到这一列的值,隐藏这一列的值,实现方式为:创建view时,select中去掉要隐藏的列。


视图的功能

视图有以下几方面的功能:

视图的安全性

视图的安全性可以防止未授权用户查看特定的行或列,是用户只能看到表中特定行的方法如下:

  1. 在表中增加一个标志用户名的列;
  2. 建立视图,是用户只能看到标有自己用户名的行;
  3. 把视图授权给其他用户。

逻辑数据独立性

视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立:

  1. 如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。
  2. 如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。
  3. 如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而应用程序可以不动。
  4. 如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而数据库可以不动。

视图的书写格式

CREATE VIEW <视图名>[(列名组)]AS <子查询>DROP VIEW <索引名>

注意:视图可以和基本表一样被查询,但是利用视图进行数据增,删,改操作,会受到一定的限制。

  • 由两个以上的基本表导出的视图
  • 视图的字段来自字段表达式函数
  • 视图定义中有嵌套查询
  • 在一个不允许更新的视图上定义的视图

  • 例子android联系人数据库:
  • String rawContactsSelect = "SELECT "
                    + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + ","
                    + RawContacts.CONTACT_ID + ", "
                    + RawContacts.AGGREGATION_MODE + ", "
                    + RawContacts.DELETED + ", "
                    + RawContacts.PRIVPHO + ", "
                    + RawContacts.PRIVSMS + ", "
                    + RawContacts.DISPLAY_NAME_SOURCE  + ", "
                    + RawContacts.DISPLAY_NAME_PRIMARY  + ", "
                    + RawContacts.DISPLAY_NAME_ALTERNATIVE  + ", "
                    + RawContacts.PHONETIC_NAME  + ", "
                    + RawContacts.PHONETIC_NAME_STYLE  + ", "
                    + RawContacts.SORT_KEY_PRIMARY  + ", "
                    + RawContacts.SORT_KEY_ALTERNATIVE + ", "
                    + rawContactOptionColumns + ", "
                    + syncColumns
                    + " FROM " + Tables.RAW_CONTACTS;


            db.execSQL("CREATE VIEW view_raw_contacts AS " + rawContactsSelect);
            db.execSQL("CREATE VIEW view_raw_contacts_restricted AS " + rawContactsSelect
                    + " WHERE " + RawContacts.IS_RESTRICTED + "=0");
String dataSelect = "SELECT "
                + DataColumns.CONCRETE_ID + " AS " + Data._ID + ","
                + Data.RAW_CONTACT_ID + ", "
                + RawContactsColumns.CONCRETE_CONTACT_ID + " AS " + RawContacts.CONTACT_ID + ", "
                + syncColumns + ", "
                + dataColumns + ", "
                + contactOptionColumns + ", "
                + contactNameColumns + ", "
                + Contacts.LOOKUP_KEY + ", "
                + Contacts.PHOTO_ID + ", "
                + Contacts.NAME_RAW_CONTACT_ID + ","
                + ContactsColumns.LAST_STATUS_UPDATE_ID + ", "
                + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID
                + " FROM " + Tables.DATA
                + " JOIN " + Tables.MIMETYPES + " ON ("
                +   DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")"
                + " JOIN " + Tables.RAW_CONTACTS + " ON ("
                +   DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")"
                + " JOIN " + Tables.CONTACTS + " ON ("
                +   RawContactsColumns.CONCRETE_CONTACT_ID + "=" + ContactsColumns.CONCRETE_ID + ")"
                + " JOIN " + Tables.RAW_CONTACTS + " AS name_raw_contact ON("
                +   Contacts.NAME_RAW_CONTACT_ID + "=name_raw_contact." + RawContacts._ID + ")"
                + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON ("
                +   DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")"
                + " LEFT OUTER JOIN " + Tables.GROUPS + " ON ("
                +   MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE
                +   "' AND " + GroupsColumns.CONCRETE_ID + "="
                        + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")";


        db.execSQL("CREATE VIEW " + Views.DATA_ALL + " AS " + dataSelect);
        db.execSQL("CREATE VIEW " + Views.DATA_RESTRICTED + " AS " + dataSelect + " WHERE "
                + RawContactsColumns.CONCRETE_IS_RESTRICTED + "=0");

参考:http://www.nowamagic.net/librarys/veda/detail/360


0 0