好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mysql学习笔记(十一)临时表+视图

临时表和视图的基本操作...

临时表与视图的使用范围...

1.临时表

  临时表:临时表,想必大家都知道这个概念的存在。。。但是我们什么时候应该使用到临时表呢?当一个数据库存在着大量的数据的时候,我们想要获取到这个数据集合的一个子集,那么我们就可以使用临时表来保存我们想要的数据。。然后对临时表进行操作就可以了...使用临时表必然是有原因的。。使用临时表会加快数据库的查询性能....

 create   temporary   table  tmp_table   //  新建一个临时表
(
    name   varchar ( 10 )  not   null  ,
    value   integer   not   null  ,
);
临时表的创建很简单,只需要加一个temporary关键字就完成了表的创建...

临时表在我们与数据库断开连接的时候,系统将会自动的删除临时表并释放其占用空间..除了这种方式,我们还可以手动进行删除。。。

  drop   table  tmp_table  //  与我们正常删除表的语句一样...

  create   temporary   table  tmp_table  select   *   from  table_name; //  将我们查询的数据直接插入到临时表当中...

  alter   table  tmp_table rename ttmp_table; //  使用alter来重命名临时表...

rename   table  tmp_table  to  ttmp_table; // rename在临时表中是不允许使用的...会发生错误。。。

  并不是我们使用了临时表数据库的查询性能一定就会得到提升,当我们的数据使用了很好的索引的时候,临时表的速度可能并不快...那么是不是任何时候都可以使用临时表呢? 临时表的使用也是有以下限制的:

i.临时表只能使用在memory,myisam,merge,innodb存储引擎下。。。

ii.临时表不支持mysql簇。。

iii.在同一个query语句中,我们只能查询一次临时表。。

iv.show table语句不会列举临时表信息..

v.不能使用rename来重命名一个临时表,但是我们可以使用alter table语句来代替...

再举一个实际的例子:

 create   table   user_info
(
     user_id   int   not   null  ,
     user_name   varchar ( 50 )  not   null  
);

  insert   into  user_info  values ( 1 , ‘  aa  ‘ ),( 2 , ‘  bb  ‘ )....... // 假设我们插入了10000条数据信息...那么我们想要查询id >  5000   and  id <  8000的数据信息,那么我们就可以使用一个临时表了...

  drop   procedure   if   exists  query_performance_test;  //  如果存在这个存储过程则删除掉...

delimiter $$   //  设置$$符号为mysql的结束符,而不是分号了...

  create   procedure   query_performance_test()
  begin      //  以begin开始
         declare  begintime;   //  声明变量
         declare   endtime;
         set  begintime = curtime();   //  设置为当前时间...
         drop   temporary   if   exists  userinfo_tmp;   //  如果临时表存在则删除掉当前临时表...
         create   temporary   table  userinfo_tmp //  新建临时表
       (
            i_userid   int   not   null  ,
            v_username   varchar ( 50 )  not   null  
       ) engine  =  memory;
         insert   into  userinfo_tmp(i_userid,v_username)  select   user_id , user_name   from  userinfo  where  userid >  5000   and  userid <  8000 ;   //  将我们想要查询的数据放置到临时表中...
         select   *   from   userinfo_tmp;
         set  endtime =  curtime();
         select  endtime -  begintime;
  end    //  存储过程定义完毕,以end结束...

delimiter;   //  将结束符号重新定义为默认的分号....

call query_profromance_test();   // 调用存储过程....

最后的结果就会输出id在5000—8000之间的数据信息,并且还会输出查询的时间信息....

2.视图

  视图分为普通视图和物化视图,普通视图是虚拟表,就是把数据库中的基础数据表的数据进行重新归类,更易于使用和理解。物化视图是实体表,除了把视图数据进行视图存储外,其他类似普通视图,但查询速度一般要比普通视图快,一般用于大数据量的视图。

优点:

1.安全性:一般来时当我们创建一个数据库的时候有一些重要的信息是不希望用户看见的,那么我们就可以建立一个视图来设置一个权限,使得用户只能查看自己的基本数据...更重要的数据用户是无法得到的...

2.查询的性能有所改善...

3.对于复杂查询的需求,可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。比如进行多表查询时,我们希望使用一个统一的方式进行查询,那么我们建立一个视图,将每一个表的数据都放入到视图当中去。。。最后我们对视图进行操作,我们就可以得到想要的数据信息了....

 CREATE   TABLE  student (stuno  INT  ,stuname  NVARCHAR ( 60  ))

  CREATE   TABLE  stuinfo (stuno  INT  ,class  NVARCHAR ( 60 ),city  NVARCHAR ( 60  ))

  INSERT   INTO  student  VALUES ( 1 , ‘  wanglin  ‘ ),( 2 , ‘  gaoli  ‘ ),( 3 , ‘  zhanghai  ‘  )

  INSERT   INTO  stuinfo  VALUES ( 1 , ‘  wuban  ‘ , ‘  henan  ‘ ),( 2 , ‘  liuban  ‘ , ‘  hebei  ‘ ),( 3 , ‘  qiban  ‘ , ‘  shandong  ‘  )

  --   创建视图 
 CREATE   VIEW  stu_class(id,NAME,glass)  AS   SELECT   student.`stuno`,student.`stuname`,stuinfo.`class`
  FROM  student ,stuinfo  WHERE  student.`stuno` =  stuinfo.`stuno`

  SELECT   *   FROM  stu_class //  显示视图的结果...
  +  --  --+----------+--------+ 
 |  id  |  NAME      |  glass   | 
 +  --  --+----------+--------+ 
 |    1   |  wanglin   |  wuban   | 
 |    2   |  gaoli     |  liuban  | 
 |    3   |  zhanghai  |  qiban   | 
 +  --  --+----------+--------+ 
 
describe stu_class;  //  显示视图的基本信息...

show   table  status  like   ‘  stu_class  ‘  //  使用show方法显示视图的信息....

show   create   view  stu_class  // 显示视图的详细信息。。。显示视图名称基本信息 +  视图中内部操作的代码等等....

修改视图:
  1 .使用create  or   replace  
mysql  >  delimiter  //  
mysql  >   create   or   replace   view  `stu_class`  as   select  
     ->  `student`.`stuno`  as  `id`  from (`student`  join  `stuinfo`)  //  join将两个表格进行联合...
      ->   where  (`student`.`stuno` = `stuinfo`.`stuno`) //  
delimter;

  desc  stu_class;  //   desc   是descbibe的缩写,在数据库中写哪个都允许...

  select   *   from   stu_class;  

  2  .使用alter 。。。

  alter   view  stu_class  as   select  stuno  from   student;

更新视图。。。

  UPDATE  stu_class  SET  stuname =  ‘  xiaofang  ‘   WHERE  stuno =  2  //  很简单,没什么过多的东西。。。。

删除视图:
  drop   view   if   exists  stu_class;

更新的注意事项:

(1)视图中包含基本中被定义为非空的列

(2)定义视图的SELECT语句后的字段列表中使用了数学表达式

(3)定义视图的SELECT语句后的字段列表中使用聚合函数

(4)定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句

那么我们到底什么时候能使用到视图呢?

  在我们定义存储过程的时候,我们为了加快查询的效率,对数据进行复杂处理时,将代码封装在存储过程中,当我们调用存储过程的时候即可完成我们的查询操作...通过代码来完成对数据的操作....以便于我们在每次使用这类查询时只需要调用存储过程即可....存储过程的结构属于一个集合...

  而视图的结构是一个表,一个虚表,不进行实际的存储,但是我们在操作视图的同时,那么也就代表着操作着这个视图的基表...视图让我们看到的是我们想要的数据信息...给我的感觉,使用视图还是由于他的安全性,可以保存重要的信息。。用户只能通过视图来对自己的那部分信息进行操作,而没有权限对其他重要信息进行操作....

 

Mysql学习笔记(十一)临时表+视图

标签:

查看更多关于Mysql学习笔记(十一)临时表+视图的详细内容...

  阅读:37次