数据库的视图
视图又叫虚表。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
视图是从一个或多个表或视图中导出的表,这些表或视图称作该视图的基本表,视图的基本结构和数据都是建立在对基本表的查询上。视图并不是一个真实的表,只有其定义,而没有存储其空间。
视图的主要作用
1、安全,权限控制。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。
2、性能快。关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。
3、灵活,抽取即将废弃表,产生有用价值。如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。
视图的基本操作
创建视图:
create view viewName(参数列表/可以不写这样就是默认和下面的select一样)
as select * from 表名;
例1:
(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;
注意:
1.视图名须遵守规范,不能与已经有的表重名,并且对每个视图名必须是唯一
的,即对不同的用户,即使定义相同的视图,也必须使用不同的名字。
2.select 子句是用来创建视图的子句,视图的内容就是select字句所查询出
来的内容,select 语句可以非常复杂,但通常不允许有orderby和distinct
字句。
3.视图列表名是视图中所包含的列。若使用与原表或视图相同的列名时,则不必
指定列名列表。若指定列名列表,则需要全部指定不能给出一部分。
修改视图:
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 viewName;
例:
drop view view2;
视图的分类
视图可以分为三种:标准视图、索引视图和分区视图。
通常情况下的视图都是标准视图,他是一个虚拟表,不占物理存储空间。如果希望提高聚合多行数据的视图性能,可以创建索引视图。
索引视图是被物理化的视图,它包含经过计算的物理数据。
通过使用分区视图,可以连接一台或者多台服务器成员表中的分区数据,使得这些数据看起来就像来自一个表中一样。
数据库的索引
索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据库表里所有记录的引用指针。
MySQL中索引的存储类型有两种:BTREE(树)和 HASH(哈希),具体和表的存储引擎有关。MyISAM和InnoDB存储引擎只支持BTREE索引。
索引的类型:
根据索引的顺序与数据表中的顺序是否相同,可以把索引分为两种类型。一种是物理顺序与索引顺序相同的称为聚集索引,另一种称为非聚集索引。
聚集索引的特点:
1.每张表只能有一个聚集索引,因为表中物理顺序只能有一个。
2.在创建任何非聚集索引前创建聚集索引。
索引的优缺点:
优点:
1.可以大大加快数据的检索速度。
2.通过穿件唯一性索引,可以确保每一行的数据的唯一性。
3.可以加快表与表之间的联系,特别容易实习数据的参照完整性。
4.在使用分组字句和排序字句进行数据检索时,可以显著提高效率。
缺点:创建维护要花时间,索引也要占据空间。
索引的sql语句:
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 ;