MySQL視圖簡介與操作

来源:https://www.cnblogs.com/webDepOfQWS/archive/2019/04/14/10693041.html
-Advertisement-
Play Games

MySQL視圖介紹,常見視圖操作:基於單表創建視圖,基於多表創建視圖;更新視圖結構與數據,刪除視圖。 ...


1、準備工作

在MySQL資料庫中創建兩張表balance(餘額表)和customer(客戶表)並插入數據。

create table customer(
    id int(10) primary key,
    name char(20) not null,
    role char(20) not null,
    phone char(20) not null,
    sex char(10) not null,
    address char(50) not null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

#外鍵為customerId
create table balance(
    id int(10) primary key,
    customerId int(10) not null,
    balance DECIMAL(10,2),
    foreign key(customerId) references customer(id) 

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

向客戶表和餘額表中各插入3條數據。

insert into customer values(0001,"xiaoming",'vip1','12566666','male','江寧區888號');
insert into customer values(0002,"xiaohong",'vip10','15209336760','male','建鄴區888號');
insert into customer values(0003,"xiaocui",'vip11','15309336760','female','新街口888號');

insert into balance values(1,0001,900.55);
insert into balance values(2,0002,900.55);
insert into balance values(3,0003,10000);

2、視圖簡介

視圖可以簡單理解成虛擬表,它和資料庫中真實存在數據表不同,視圖中的數據是基於真實表查詢得到的。視圖和真實表一樣具備相似的結構。真實表的更新,查詢,刪除等操作,視圖也支持。那麼為什麼需要視圖呢?

a、提升真實表的安全性:視圖是虛擬的,可以只授予用戶視圖的許可權而不授予真實表的許可權,起到保護真實表的作用。
b、定製化展示數據:基於同樣的實際表,可以通過不同的視圖來向不同需求的用戶定製化展示數據。
c、簡化數據操作:適用於查詢語句比較複雜使用頻率較高的場景,可以通過視圖來實現。
......

需要說明一點的是:視圖相關的操作需要用戶具備相應的許可權。以下操作使用root用戶,預設用戶具備操作許可權。

創建視圖語法

create view <視圖名稱>  as <select語句>;

修改視圖語法

修改視圖名稱可以先刪除,再用相同的語句創建。

#更新視圖結構
alter view <視圖名稱>  as <select語句>;
#更新視圖數據相當於更新實際表,不適用基於多表創建的視圖
update ....

註意:部分視圖的數據是無法更新,也就是無法使用update,insert等語句更新,比如:

a、select語句包含多個表
b、視圖中包含having子句
c、試圖中包含distinct關鍵字
......

刪除視圖語法

drop view <視圖名稱>

3、視圖的操作

基於單表創建視圖

mysql> create view  bal_view 
    -> as
    -> select * from  balance;
Query OK, 0 rows affected (0.22 sec)

創建完成後,查看bal_view的結構和記錄。可以發現通過視圖查詢到數據和通過真實表查詢得到的結果完全一樣。

#查詢bal_view的結構
mysql> desc bal_view;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| id         | int(10)       | NO   |     | NULL    |       |
| customerId | int(10)       | NO   |     | NULL    |       |
| balance    | decimal(10,2) | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
3 rows in set (0.07 sec)
#查詢bal_view中的記錄
mysql> select  * from bal_view;
+----+------------+----------+
| id | customerId | balance  |
+----+------------+----------+
|  1 |          1 |   900.55 |
|  2 |          2 |   900.55 |
|  3 |          3 | 10000.00 |
+----+------------+----------+
3 rows in set (0.01 sec)

通過創建視圖的語句不難得出結論:當真實表中的數據發生改變時,視圖中的數據也會隨之改變。那麼當視圖中的數據發生改變時,真實表中的數據會變化嗎?來實驗一下,修改id=1的客戶balance為2000。

mysql> update bal_view set balance=2000 where id=1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

來看一下真實表balance中的數據。

mysql> select  * from bal_view where id=1;
+----+------------+---------+
| id | customerId | balance |
+----+------------+---------+
|  1 |          1 | 2000.00 |
+----+------------+---------+
1 row in set (0.03 sec)

結論:視圖表中的數據發生變化時,真實表中的數據也會隨之改變。

基於多表創建視圖

創建視圖cus_bal,共兩個欄位客戶名稱和餘額。

mysql> create view cus_bal
    -> (cname,bal)
    -> as
    -> select customer.name,balance.balance from customer ,balance
    -> where customer.id=balance.customerId;
Query OK, 0 rows affected (0.05 sec)
#查看cus_bal中的數據
mysql> select *  from  cus_bal;
+----------+----------+
| cname    | bal      |
+----------+----------+
| xiaoming |  2000.00 |
| xiaohong |   900.55 |
| xiaocui  | 10000.00 |
+----------+----------+
3 rows in set (0.28 sec)

修改視圖

將cus_bal視圖中的cname改成cusname。

mysql> alter view  cus_bal
    -> (cusname,bal)
    -> as
    -> select customer.name,balance.balance from customer ,balance
    -> where customer.id=balance.customerId;
Query OK, 0 rows affected (0.06 sec)
#查看修改後視圖結構。
mysql> desc  cus_bal;
+---------+---------------+------+-----+---------+-------+
| Field   | Type          | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| cusname | char(20)      | NO   |     | NULL    |       |
| bal     | decimal(10,2) | YES  |     | NULL    |       |
+---------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

修改基於多表創建的視圖

mysql> insert into cus_bal(cusname,bal) values ("ee",11);
ERROR 1393 (HY000): Can not modify more than one base table through a join view 'rms.cus_bal'

刪除視圖

刪除視圖cus_bal

drop view cus_bal;
mysql> drop view cus_bal;
Query OK, 0 rows affected (0.00 sec)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim yum install zlib zlib-devel yum install openssl ...
  • HTTP的基本操作 3月17資源子網和通信子網套接字:兩類 socket:IP port IP:port Ip.port unix sock:基於文件系統通信實現 BSD發明: MTU:最大傳輸單元傳輸層協議: 面向連接的:TCP 虛連接(95%) 無連接的:UDP套接字的類型: TCP套接字 UD ...
  • 按ctrl+alt+T打開終端 spark編譯完畢 下麵開始cssserver3d的編譯 進入到rcssserver3d的目錄下 基本環境安裝完成 測試命令: 出現足球場則安裝完成!! ...
  • 我最初裝雙系統的時候也遇到了許多問題,基本上別人能遇到的問題我都遇到了,這裡整理了我當時的解決方案。(當時的ubuntu版本為16版) 當時參考的是這篇安裝教程: "Win10/Ubuntu雙系統安裝 CSDN" [TOC] 1.win10重啟無法進入BIOS 按照教程上的要求製作好了裝機U盤,可重 ...
  • 在此處只給出find的基本用法示例,都是平時我個人非常常用的搜索功能。如果有不理解的部分,則看後面的 "find運行機制詳解" 對於理論的說明,也建議在看完這些基本示例後閱讀一遍理論說明,它是本人翻譯自find的man文檔並加上了個人的理解。另外,在該理論說明結束後,還有find深入用法示例和分析。 ...
  • /etc/passwd 用戶信息文件 /etc/fstab 開機後自動掛在文件 /etc/profile 修改別名、環境變數/root/.bashrc 別名存放位置/etc/selinux/config SElinux配置/etc/sysconfig/i18n 字元集配置 export LANG=e ...
  • "多節點通過PPP連接,節點/用戶/客戶機之間互相訪問ping" 轉載註明來源: "本文鏈接" 來自 "osnosn的博客" ,寫於 2019 04 14. 有A, B, C 三台客戶機,通過ppp虛擬撥號連接到伺服器。 搜索"ppp over ssh" "VPN PPP SSH Mini HOWT ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...