1. 程式人生 > >MySQL:檢視

MySQL:檢視

檢視

一、檢視的概述

1. 含義:是從資料庫中一個或多個表中匯出的虛擬表
2. 作用:①簡單化 ②安全性 ③邏輯資料獨立性
3. 注意:一個表可以由多個檢視;

二、檢視的建立

1. 總的語法形式

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
  介紹
  • REPLACE:表示替換已經建立的檢視
  • ALGORITHM:表示檢視選擇的演算法
  • view_name :檢視名
  • column_list:屬性列表
  • select_statement:select語句
  • WITH [CASCADED | LOCAL] CHECK OPTION:表示檢視在更新時保證在檢視的許可權範圍內
  • CASCADED:預設值,表示更新檢視時要滿足所有相關的檢視和表的條件
  • LOCAL:表示更新檢視時滿足該檢視本身定義的條件即可。
  • UNDEFINED:表示MySQL自動選擇演算法
  • MERGE:表示將使用檢視語句與檢視定義合併起來,使得檢視定義的某一部分取代語句對應的部分 TEMPTABLE:表示將檢視的結果存入臨時表,然後用臨時表來執行語句

2. 在單表上建立檢視

語法:

CREATE VIEW 檢視名 [(檢視欄位,……,欄位n)] AS select 表字段名,……,表字段名n  from 資料表;
CREATE or replace VIEW 檢視名 [(檢視欄位,……,欄位n)] AS select 表字段名,……,表字段名n  from 資料表;
語句2,如果檢視沒有建立,則建立;如果檢視已建立,則修改檢視。

例項:

【例】
mysql>create view view_e(a,b,c,d,e,g,h) as select gkbh,yhm,mm,xm,xb,csrq,sfzh from guke;
【附,顯示】
select * from view_e;
+-------+----------+----------+------+------+------------+--------------------+
| a     | b        | c        | d    | e    | g          | h                  |
+-------+----------+----------+------+------+------------+--------------------+
| 00001 | aaaaaaaa | 12345678 | 李明 | 男   | 1990-05-06 | 111111111111111111 |
| 00002 | bbbbbbbb | 12345678 | 李逵 | 男   | 1988-05-06 | 111111111111111111 |
| 00003 | cccccccc | 12345678 | 西施 | 女   | 1990-05-06 | 111111111111111111 |
+-------+----------+----------+------+------+------------+--------------------+

(2) 注意:預設情況下建立的檢視和基本表的欄位是一樣的,也可以通過指定檢視欄位的名稱來建立檢視。

3. 在多表上建立檢視

語法:

CREATE VIEW 檢視名 [(檢視欄位,……,欄位n)] 
AS A表表名.表字段名,……,A表表名.表字段名n,
B表表名.表字段名,……,B表表名.表字段名 
from 資料A表,資料B表 
where 連線條件;

例項:

【例】
mysql> create view view_a(訂單編號,商品編號,顧客編號,訂單日期) 
as select dingdanxiangqing.ddbh,dingdanxiangqing.spbh,
dingdan.gkbh,dingdan.ddrq 
from dingdan,dingdanxiangqing 
where dingdanxiangqing.ddbh=dingdan.ddbh;
【附,效果】
mysql> select * from view_a;
+----------+----------+----------+---------------------+
| 訂單編號 | 商品編號 | 顧客編號 | 訂單日期            |
+----------+----------+----------+---------------------+
|        1 | 00000001 | 00001    | 2016-01-01 00:00:00 |
|        2 | 00000003 | 00003    | 2016-02-10 00:00:00 |
|        1 | 00000004 | 00001    | 2016-01-01 00:00:00 |
+----------+----------+----------+---------------------+

三、檢視的檢視

語法:

desc 視圖表

例項:

【例】
mysql> desc view_a;
+----------+----------+------+-----+---------+-------+
| Field    | Type     | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| 訂單編號 | int(11)  | NO   |     | 0       |       |
| 商品編號 | char(8)  | NO   |     |         |       |
| 顧客編號 | char(5)  | NO   |     | NULL    |       |
| 訂單日期 | datetime | NO   |     | NULL    |       |
+----------+----------+------+-----+---------+-------+

作用:顯示檢視的欄位定義、欄位的資料型別、是否為空、是否是主鍵\外來鍵、預設值和額外資訊

語法

 

show table status like'視圖表名’\G;

 

例項

mysql> show table status like'view_a';
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+
| Name   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+
| view_a | NULL   |    NULL | NULL       | NULL |           NULL |  NULL       |            NULL |         NULL |
+--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+
-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+
 Data_free |Auto_increment  | Create_time | Update_time | Check_time | Collation |Checksum | Create_options  |
-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+
      NULL |  NULL          |NULL         | NULL        | NULL       | NULL      |    NULL  |       NULL     |
-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+
---------+
 Comment |
---------+
 VIEW    |
---------+

或者mysql>show table status like'view_a'\G;

*************************** 1. row ***************************
           Name: view_a
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW

作用:顯示檢視的儲存引擎,建立時間

語法

show create view 檢視名

例項

【例】
mysql> show create view view_a\G;
*************************** 1. row ***************************
                View: view_a
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_a` AS select `dingdanxiangqing`.`ddbh` AS `訂單編號`,`dingdanxiangqing`.`spbh` AS `商品編號`,`dingdan`.`gkbh` AS `顧客編號`,`dingdan`.`ddrq` AS `訂單日期` from (`dingdan` join `dingdanxiangqing`) where (`dingdanxiangqing`.`ddbh` = `dingdan`.`ddbh`)
character_set_client: gbk
collation_connection: gbk_chinese_ci

作用:顯示檢視的名稱和建立語句

語法

 

select * from information_schema.views\G;

 

例項

mysql> select * from information_schema.views\G;
*************************** 1. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: webshop
          TABLE_NAME: view_a
     VIEW_DEFINITION: select `webshop`.`dingdanxiangqing`.`ddbh` AS `訂單編號`,`webshop`.`dingdanxiangqing`.`spbh` AS `商品編號`,`webshop`.`dingdan`.`gkbh` AS `顧客編號`,`webshop`.`dingdan`.`ddrq` AS `訂單日期` from `webshop`.`dingdan` join `webshop`.`dingdanxiangqing` where (`webshop`.`dingdanxiangqing`.`ddbh` = `webshop`.`dingdan`.`ddbh`)
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: [email protected]
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
作用:顯示所有的資料表

四、檢視的修改

①CREATE語句
總的語法

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

簡化版

CREATE or replace view 檢視名 as select 表字段 from 表名

注意:該語法與建立語法完全一樣,當檢視不存在時,此語法是建立檢視;檢視存在時,此語法是修改檢視;

②ALTER語法
總的語法:

ALTER
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

簡化版:

ALTER view 檢視名 as select 表字段 from 表名

五、檢視的更新

注意:
①因為檢視是虛擬表所以,所以對檢視的操作,實際上是對基本表的操作;
②對其中的一個檢視更新後,其基本表也更新了,從而與這個基本表相關的視圖表的內容也更新。
③不可以更新的檢視
1.包含以下關鍵字的sql語句:聚合函式(sum、min、max、count)、distinct、group by 、having、union 或者uinon all
2.常量檢視
3.select 中包含子查詢
4.join
5.from一個不可更新的試圖
6.where字句的子查詢引用了from字句中的表
(1)更新檢視
 語法:

 

update 檢視名 set 更新資料;

 

例項:
  原資料表:
   mysql> select * from guke;
+-------+------+------------+
| gkbh  | xm   | csrq       |
+-------+------+------------+
| 00001 | 李明 | 1990-05-06 |
| 00002 | 李逵 | 1988-05-06 |
| 00003 | 西施 | 1990-05-06 |
+-------+------+------------+
   原檢視:
   mysql> select * from view_c;
+----------+------+------------+
| 顧客編號 | 姓名 | 出生日期   |
+----------+------+------------+
| 00001    | 李明 | 1990-05-06 |
| 00002    | 李逵 | 1988-05-06 |
| 00003    | 西施 | 1990-05-06 |
+----------+------+------------+
   改後:
   檢視:
   mysql> update view_c set 姓名='哈哈在笑' where 顧客編號='00002';
   mysql> select * from view_c;
+----------+----------+------------+
| 顧客編號 | 姓名     | 出生日期   |
+----------+----------+------------+
| 00001    | 哈哈一笑 | 1990-05-06 |
| 00002    | 哈哈在笑 | 1988-05-06 |
| 00003    | 哈哈一笑 | 1990-05-06 |
+----------+----------+------------+
  基本表:
  mysql> select gkbh,xm,csrq from guke;
+-------+----------+------------+
| gkbh  | xm       | csrq       |
+-------+----------+------------+
| 00001 | 哈哈一笑 | 1990-05-06 |
| 00002 | 哈哈在笑 | 1988-05-06 |
| 00003 | 哈哈一笑 | 1990-05-06 |
+-------+----------+------------+

注意:基本表已經改變
(2)插入記錄
 語法:

insert into 資料表名 values(插入的資料,……,插入的資料n);

六、檢視的刪除

1. 總的語法

DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]