標籤:視圖、mysql、索引
上一張內容在結尾階段引入了MySQL資料庫的視圖概念,本章將纖細介紹視圖的集中用法。在建立視圖之前先建立學生表,學院表和學員資訊表,通過使用視圖對著三張表的操作,使我們對視圖有一個基本的認識和瞭解。
使用視圖的原則:
1、視圖名字唯一性
2、視圖的建立個數不受限制,使用者可以建立多個視圖
3、使用者建立視圖,必須從資料庫管理員得到許可權。
4、視圖可以嵌套,
5、一些資料庫管理系統禁止使用者在查詢語句中使用order by子句。
一、建立實用表資料
建立學生表
mysql> create table studenginfo(sno int(4) zerofill,sname varchar(18),sex ENUM(‘男‘,‘女‘) not null default ‘女‘,address varchar(48) default ‘北京‘,dno int(3));Query OK, 0 rows affected (0.07 sec)
建立學院表
create table recruitinfo(address varchar(18) not null,score float not null,snum int(3) not null);Query OK, 0 rows affected (0.08 sec)mysql> show create table department\G;*************************** 1. row *************************** Table: departmentCreate Table: CREATE TABLE `department` ( `dno` int(2) NOT NULL, `dname` varchar(18) NOT NULL, `dnum` int(3) NOT NULL DEFAULT ‘0‘) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)
為學生表建立索引
mysql> create index name_index on studentinfo (sname);
二、視圖:
視圖作為查詢資料的另外一種形式,利用視圖,使用者可以集中、簡化和定製資料庫,同時提供了安全保證
視圖是從一個或過個表中匯出的表,其結構和資料是建立在對標的查詢基礎之上的。就本質而言,視圖是一張虛表。
視圖建立文法:
create view <view_name> [column1,column2...] asselect <column_name> from <tb_name>;
其中[column1,column2,...]為可選項,預設是子查詢結果中的欄位名,select語句指明了視圖中的欄位機器資料。
強調:
1、視圖建立後,只在資料字典中存放視圖的定義,而其中的select語句並不執行
2、只有當使用者對視圖進行操作時,才按照視圖的定義將資料從基本表中取出。
建立視圖:
1、建立一個與studentinfo相同資訊的視圖
mysql> create view studentinfo_view as select * from studentinfo;select * from studentinfo_view;
2、為視圖建立視圖
mysql> create view boy_view as select * from studentinfo_view where sex=‘男‘;
3、為列建立視圖並查看其資訊
mysql> create view nameaddress_view as select sname,address from studentinfo;
4、建立與表具有不同欄位名的視圖
mysql> create view New_view(boy_name,boy_address) as select sname,address from studentinfo where sex=‘男‘;Query OK, 0 rows affected (0.00 sec)
5、利用視圖簡化表的複雜串連
建立一個關於學生資訊表(studentinfo)、招生資訊表(Recruitinfo)和Department的關聯。
sname、dname和dnum三個欄位。
mysql> create view join_view as select sname,dname,score from studentinfo s,department d,recruitinfo r where s.address=r.address and s.dno=d.dno;Query OK, 0 rows affected (0.00 sec)mysql> select * from join_view;+-----------+--------------------+-------+| sname | dname | score |+-----------+--------------------+-------+| 張平 | 汽車系 | 648.5 || 李山 | 電子工程系 | 560 || 王彤 | 汽車系 | 654.5 || 張偉 | 電腦工程系 | 638 || 高守傳 | 機械工程 | 650 || 劉紅 | 工程物理系 | 629.5 || 張勇 | 應用數學系 | 625 || 劉曉 | 電子工程系 | 650 || 吳軍 | 電子工程系 | 631 || 張大山 | 材料工程系 | 635 |+-----------+--------------------+-------+10 rows in set (0.03 sec)
6、視圖簡化複雜查詢的過程
6.1 給予學生表,建立boys_view視圖,包含所有男同學資訊
mysql> create view boys_view as select * from studentinfo where sex=‘男‘;
給予recruitinfo表,建立視圖score_view,包含錄取分數高於630的所有學生的資訊
mysql> create view boyscore_view as select * from score_view where sno in (select sno from boys_view);mysql> select * from boyscore_view;+------+-----------+-----+---------+------+| sno | sname | sex | address | dno |+------+-----------+-----+---------+------+| 0005 | 高守傳 | 男 | 山東 | 3 || 0004 | 張偉 | 男 | 浙江 | 1 || 0009 | 吳軍 | 男 | 山西 | 4 || 0010 | 張大山 | 男 | 陝西 | 7 |+------+-----------+-----+---------+------+4 rows in set (0.00 sec)mysql> create view result_view (sname,dname) as select boyscore_view.sname,department.dname from boyscore_view,department where boyscore_view.dno=department.dno;Query OK, 0 rows affected (0.00 sec)
刪除視圖
文法:drop view view_name
drop view studentinfo_view
注意:視圖在物理上是不存在的,只是一個查詢結果,是一個被儲存的查詢。create view語句只是儲存了視圖的定義,所以在使用drop view語句刪除視圖時,刪除的也只是視圖的定義,對實際表中的資料沒有影響。
本文出自 “小熊營運” 部落格,請務必保留此出處http://maoxiaoxiong.blog.51cto.com/11705634/1983954
7、MySQL資料庫的視圖操作