数据库的视图和索引

1.视图
视图(View)作为一种数据库对象,为用户提供了一个 可以检索数据表中的数据方式。用户通过视图来浏览数据表中感兴趣的部分或全部数据,而数据的物理存储位置仍然在表中。
视图是一个虚拟表,并不代表任何物理数据,只是用来查看数据的窗口而已。视图并不是以一组数据的形式存储在数据库中,数据库中只存储视图的定义,而不存储视图对应的数据,这些数据仍存储在导出视图的基本表中。当基本表中的数据发生变化时,从视图中查询出来的数据也随之改变。
视图中的数据行和列都是来自于基本表,是在视图被引用时动态生成的。使用视图可以集中、简化和制定用户的数据库显示,用户可以通过视图来访问数据,而不必直接去访问该视图的基本表。
视图由视图名和视图定义两个部分组成。 视图是从一个或多个表导出来的表,它实际上是一个查询结果,视图的名字和视图对应的查询存储在数据字典中

视图的优点
1.数据安全性。
对不同的用户定义不同的视图,使用户只能看到与自己有关的数据。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
2.查询简单化。
为复杂的查询建立一个视图,用户不必输入复杂的查询语句,只需针对此视图做简单的查询即可。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
3.逻辑数据独立性。
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
对于视图的操作,例如,查询只依赖于视图的定义,当构成视图的基本表需要修改时,只需要修改视图定义中的子查询部分,而基于视图的查询不用改变。

视图的缺点
1.性能。
SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
2.修改限制。
当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的,这些视图有如下特征:
  a.有UNIQUE等集合操作符的视图。
  b.有GROUP BY子句的视图。
  c.有诸如AVG\SUM\MAX等聚合函数的视图。
  d.使用DISTINCT关键字的视图。
  e.连接表的视图(其中有些例外)
3.创建视图的限制:
在创建视图时,还要注意试图必须满足以下几点限制:
(1).不能将规则或者DEFAULT定义关联于视图。
(2).定义视图的查询中不能含有ORDER BY\COMPURER\COMPUTER BY 子句和INTO关键字
(3).如果视图中某一列是一个算术表达式、构造函数或者常数,而且视图中两个或者更多的不同列拥有一个相同的名字(这种情况通常是因为在视图的定义中有一个连接,而且这两个或者多个来自不同表的列拥有相同的名字),此时,用户需要为视图的每一列指定列的名称。

创建视图:
create  view viewName(参数列表/可以不写这样就是默认和下面的select一样) as select * from   表名;

例:
(1)、create  table viewdemo(id int primary key , name char(10),score  float);
(2)、create  view  view1 as select* from  viewdemo;
(3)、create view view2(name,score) as select name ,score from  viewdemo;

修改视图:
alter  view  viewname (columns)  as  select columns from   tableName ;

例:
 alter view  view2 (id ,name)  as select  id,name from  viewdemo ;

删除视图:
 drop  view if exists  view  name;

列:
drop   view  view2;


2.索引
1、 索引是以表列为基础的数据库对象,它 保存着表中排序的索引列,并且记录了索引列在数据表中的物理存储位置,实现了表中数据的逻辑排序,其主要目的是提高SQL Server系统的性能,加快数据的查询速度和减少系统的响应时间。索引通过记录表中的关键值指向表中的记录,这样数据库引擎就不用扫描整个表而定位到相关的记录。相反,如果没有索引,则会导致SQL Server搜索表中的所有记录,以获取匹配结果。
索引除了可以提高查询表内数据的速度以外,还可以使表和表之间的连接速度加快。例如,在实现数据参照完整性时,可以将表的外键制作为索引,这样将加速表与表之间的连接。

索引,可以理解为是一本书的目录,它记录了数据在数据库中存放的位置,就像一本书的目录,记录了,某一页在这本书的那个位置。相同地,索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据库表里所有记录的引用指针。


2、索引的好处
  适当使用索引能提升数据库查询速度!

3、实例:
在创建表的时候创建索引
CREATE   TABLE  表名  [  列名称  数据类型 ]  [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ]    [  索引名称  ]   ( 列名称  [  length  ]  )  [  ASC | DESC ]
说明:  UNIQUE  、 FULLTEXT  为可选参数,分别表示唯一索引、全文索引;INDEX 与 KEY为同义词,两者的作用相同,用来指定索引;

(1)、 普通索引(index): 普通索引是MySQL的基本索引类型,允许在定义索引的列中插入重复值和空值
例:
CREATE  TABLE book
(
bookid   INT  NOT  NULL,
bookname VARCHAR(100)  NOT  NULL,
authors  VARCHAR(100)  NOT  NULL,
info  VARCHAR(500) NULL,
year_publication   YEAR  NOT  NULL,
INDEX(year_publication)
);

(2)、 唯一索引(unique):唯一索引列的值必须唯一,但允许有空值。主键索引是一种特殊的唯一索引,不允许有空值。
例:
CREATE TABLE  book
(
  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  UNIQUE  INDEX   UniqueIdx(id)
);

(3)、 联合索引:组合索引即是在多个列上创建索引。查询时,只有在查询条件中使用了这些字段(创建组合索引的时候指定的哪些列)的最左边字段时,索引才会被使用。
CREATE TABLE student
(
  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  age  INT  NOT  NULL,
  info  VARCHAR(200),
  INDEX   MultiIdx(id,name,age)

);


(4)、 全文索引:MySQL只有MyISAM存储引擎支持FULLTEXT索引,并且类类型为CHAR、TEXT、VARCHAR。 并且需要指定表的存储引擎为MyISAM。
例:
CREATE TABLE t4
(
  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  age  INT  NOT  NULL,
  info  VARCHAR(200),
  FULLTEXT INDEX   FullindexName(info)

) ENGINE = MyISAM ;


在已经存在的表上创建索引:
语法:
ALTER  TABLE  table_name  ADD   [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ] 
[  inex_name  ]  (col_name [ length ] ,...)  [ASC | DESC ]


(1)、普通索引:ALTER  TABLE  book  ADD  INDEX        indexName( bookname(30) );
(2)、唯一索引:ALTER  TABLE  book  ADD UNIQUE INDEX  UniqueIdx( bookid );
(3)、组合索引:ALTER  TABLE  book  ADD  INDEX  BkAndInfoIdx( authors(20), info(50) );
(4)、全文索引:ALTER TABLE t6  ADD  FULLTEXT  INDEX infiIdx(info);(前提是这个表的存储引擎为 MyISAM)

使用 create  index  创建索引:
语法:
CREATE    [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ]  INDEX  index_name
ON   table_name ( col_name[ length ] , ... )  [ASC | DESC ]

例:在表book的bookname字段上建立名为BkNameIdx的索引。
CREATE INDEX  BkNameIdx   ON   book (bookname);
例: 在book表的bookId字段上建立唯一索引。
CREATE   UNIQUE    INDEX  UniqueIdx    ON   book (bookId);

4、 删除索引:
(1)、ALTER   TABLE  table_name   DROP   INDEX  index_name;
(2)、DROP    INDEX     index_name   ON  table_name ;


猜你喜欢

转载自blog.csdn.net/panjieer/article/details/80069882