[TOC]
# 1. 創建視圖的語法
轉載自:https://www.cnblogs.com/ljxt/p/11613167.html
****
```sql
CREATE [OR REPLACE]
[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]
```
**1. `OR REPLACE`**
表示在創建視圖時候會替換已有視圖。
**2.`ALGORITHM`**
選擇在處理定義視圖的select語句中使用的方法。
```
– UNDEFINED:MySQL將自動選擇所要使用的算法
– MERGE:將視圖的語句與視圖定義合并起來,使得視圖定義的某一部分取代語句的對應部分
– TEMPTABLE:將視圖的結果存入臨時表,然后使用臨時表執行語句
```
缺省`ALGORITHM`選項等同于`ALGORITHM = UNDEFINED`。
**3.`DEFINER`**
指出誰是視圖的創建者或定義者。
```
– definer= '用戶名'@'登錄主機'
– 如果不指定該選項,則創建視圖的用戶就是定義者,
指定關鍵字CURRENT_USER(當前用戶)和不指定該選項效果相同
```
**4.`SQL SECURITY`**
定義視圖的`select`權限,`SQL SECURITY`選項決定了執行的結果。
```
– SQL SECURITY DEFINER:定義(創建)視圖的用戶必須對視圖所訪問的表具有select權限,
也就是說將來其他用戶訪問表的時候以定義者的身份,此時其他用戶并沒有訪問權限。
– SQL SECURITY INVOKER:訪問視圖的用戶必須對視圖所訪問的表具有select權限。
```
缺省`SQL SECURITY`選項等同于`SQL SECURITY DEFINER`。
<br/>
視圖權限總結:
使用root用戶定義一個視圖(推薦使用第一種):u1、u2
1)u1作為定義者定義一個視圖,u1對基表有select權限,u2對視圖有訪問權限:u2是以定義者的身份訪問可以查詢到基表的內容;
2)u1作為定義者定義一個視圖,u1對基表沒有select權限,u2對視圖有訪問權限,u2對基表有select權限:u2訪問視圖的時候是以調用者的身份,此時調用者是u2,可以查詢到基表的內容。
**5. `select_statement`**
表示select語句。
**6. `[WITH [CASCADED | LOCAL] CHECK OPTION]`**
表示視圖在更新時保證在視圖的權限范圍之內。該選項可以保證數據的安全性,所以建議加上它。
```sql
mysql> create view view_name [(column_list)]
as select_statement
with check option;
```
<br/>
# 2. 視圖創建演示
**1. 視圖是基于已有的表創建的,所以先創建表**
```sql
drop table if exists `author`;
create table `author`(
`id` int(11) primary key not null auto_increment,
`author_name` varchar(255) default null
)engine=INNODB default charset=utf8;
insert into `author`(`id`, `author_name`) values(1, "張三");
insert into `author`(`id`, `author_name`) values(2, "李四");
insert into `author`(`id`, `author_name`) values(3, "王五");
insert into `author`(`id`, `author_name`) values(4, "趙六");
drop table if exists `blog`;
create table `blog`(
`id` int(11) primary key not null auto_increment,
`title` varchar(50) default null,
`content` varchar(255) default null,
`author_id` int(11) default null,
CONSTRAINT `fk-author` FOREIGN key (`author_id`) REFERENCES `author`(`id`)
)engine=INNODB default charset=utf8;
insert into `blog`(`id`, `title`,`content`,`author_id`) values(1, "張三博客", "張三博客內容", 1);
insert into `blog`(`id`, `title`,`content`,`author_id`) values(2, "李四博客", "李四博客內容", 2);
insert into `blog`(`id`, `title`,`content`,`author_id`) values(3, "王五博客", "王五博客內容", 3);
```
**2. 創建視圖**
```sql
# 定義視圖
mysql> create view v_author_blog
as
select a.id, a.author_name, b.title
from author a, blog b
where a.id=b.author_id
order by a.id asc
with check option;
# 查看視圖信息
mysql> desc v_author_blog;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| author_name | varchar(255) | YES | | NULL | |
| title | varchar(50) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
# 查詢視圖
mysql> select * from v_author_blog;
+----+-------------+--------------+
| id | author_name | title |
+----+-------------+--------------+
| 1 | 張三 | 張三博客 |
| 2 | 李四 | 李四博客 |
| 3 | 王五 | 王五博客 |
+----+-------------+--------------+
```
(1)可以看到視圖將我們不需要的數據過濾掉,將相關的列名用我們自定義的列名替換。
(2)如果創建視圖時不明確指定視圖的列名,那么列名就和定義視圖的`select`子句中的列名完全相同。
(3)如果顯式的指定視圖的列名就按照指定的列名。
>[warning]注意:顯示指定視圖列名,要求視圖名后面的列的數量必須匹配select子句中的列的數量。
- MySQL
- MySQL是什么
- MySQL環境搭建
- centos7-MySQL8
- windows-MySQL8
- 數據庫軟件
- sqlyog軟件安裝
- navicat軟件安裝
- powerDesigner軟件安裝
- RDBMS術語
- SQL語句組成
- 數據庫系統組成
- 數據庫操作
- 數據表操作
- 查詢語句
- 基本語法
- 子查詢
- 表連接
- 查詢語句執行順序
- 事務
- 事務是什么
- 事務的作用
- 事務的4個特性
- 事務隔離級別
- 事務的實現
- 索引
- 索引的作用
- 索引操作
- 存儲引擎
- 備份與恢復
- 視圖
- 視圖是什么
- 視圖的作用
- 創建視圖
- 查看視圖
- 更改視圖
- DML操作視圖
- 刪除視圖
- 存儲過程與函數
- 過程與函數是什么
- 存儲過程操作
- 定義存儲過程
- 調用存儲過程
- 查看存儲過程
- 刪除存儲過程
- 修改存儲過程
- 函數操作
- 過程與函數區別
- 流程控制
- if語句
- case語句
- while循環語句
- repeat循環語句
- loop循環語句
- 變量
- 處理程序
- 光標
- Redis
- 簡介
- 下載與安裝
- 命令操作redis數據庫
- 通用命令
- 數據操作
- 持久化
- Windows上的持久化操作
- 數據庫設計
- 數據庫設計過程
- ER模型圖
- MongoDB
- MongoDB是什么?
- MongoDB特性
- MongoDB 數據模型
- 安裝MongoDB
- MongoDB認證
- Database操作
- Collection操作
- Document操作
- 插入
- 查詢
- 更新
- 刪除
- buckWrite
- MongoDB索引
- 副本集
- 聚焦分析
- 事務管理
- 寫關注
- 讀關注