MySQL中視圖

来源:https://www.cnblogs.com/duanrantao/archive/2018/07/18/9330651.html
-Advertisement-
Play Games

轉載自:http://www.cnblogs.com/chenpi/p/5133648.html 什麼是視圖 通俗的講,視圖就是一條SELECT語句執行後返回的結果集。所以我們在創建視圖的時候,主要的工作就落在創建這條SQL查詢語句上。 視圖的特性 視圖是對若幹張基本表的引用,一張虛表,查詢語句執行 ...


轉載自:http://www.cnblogs.com/chenpi/p/5133648.html

什麼是視圖

通俗的講,視圖就是一條SELECT語句執行後返回的結果集。所以我們在創建視圖的時候,主要的工作就落在創建這條SQL查詢語句上。

視圖的特性

視圖是對若幹張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變);

可以跟基本表一樣,進行增刪改查操作(ps:增刪改操作有條件限制);

視圖的作用

方便操作,特別是查詢操作,減少複雜的SQL語句,增強可讀性;

更加安全,資料庫授權命令不能限定到特定行和特定列,但是通過合理創建視圖,可以把許可權限定到行列級別;

使用場合

許可權控制的時候,不希望用戶訪問表中某些含敏感信息的列,比如salary...

關鍵信息來源於多個複雜關聯表,可以創建視圖提取我們需要的信息,簡化操作;

視圖實例1-創建視圖及查詢數據操作

現有三張表:用戶(user)、課程(course)、用戶課程中間表(user_course),表結構及數據如下:

表定義:

 1 -- ----------------------------
 2 -- Table structure for `course`
 3 -- ----------------------------
 4 DROP TABLE IF EXISTS `course`;
 5 CREATE TABLE `course` (
 6   `id` bigint(20) NOT NULL AUTO_INCREMENT,
 7   `name` varchar(200) NOT NULL,
 8   `description` varchar(500) NOT NULL,
 9   PRIMARY KEY (`id`)
10 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
11 
12 -- ----------------------------
13 -- Records of course
14 -- ----------------------------
15 INSERT INTO `course` VALUES ('1', 'JAVA', 'JAVA課程');
16 INSERT INTO `course` VALUES ('2', 'C++', 'C++課程');
17 INSERT INTO `course` VALUES ('3', 'C語言', 'C語言課程');
18 
19 -- ----------------------------
20 -- Table structure for `user`
21 -- ----------------------------
22 DROP TABLE IF EXISTS `user`;
23 CREATE TABLE `user` (
24   `id` bigint(20) NOT NULL AUTO_INCREMENT,
25   `account` varchar(255) NOT NULL,
26   `name` varchar(255) NOT NULL,
27   `address` varchar(255) DEFAULT NULL,
28   `others` varchar(200) DEFAULT NULL,
29   `others2` varchar(200) DEFAULT NULL,
30   PRIMARY KEY (`id`)
31 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
32 
33 -- ----------------------------
34 -- Records of user
35 -- ----------------------------
36 INSERT INTO `user` VALUES ('1', 'user1', '小陳', '美國', '1', '1');
37 INSERT INTO `user` VALUES ('2', 'user2', '小張', '日本', '2', '2');
38 INSERT INTO `user` VALUES ('3', 'user3', '小王', '中國', '3', '3');
39 
40 -- ----------------------------
41 -- Table structure for `user_course`
42 -- ----------------------------
43 DROP TABLE IF EXISTS `user_course`;
44 CREATE TABLE `user_course` (
45   `id` bigint(20) NOT NULL AUTO_INCREMENT,
46   `userid` bigint(20) NOT NULL,
47   `courseid` bigint(20) NOT NULL,
48   PRIMARY KEY (`id`)
49 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
50 
51 -- ----------------------------
52 -- Records of user_course
53 -- ----------------------------
54 INSERT INTO `user_course` VALUES ('1', '1', '2');
55 INSERT INTO `user_course` VALUES ('2', '1', '3');
56 INSERT INTO `user_course` VALUES ('3', '2', '1');
57 INSERT INTO `user_course` VALUES ('4', '2', '2');
58 INSERT INTO `user_course` VALUES ('5', '2', '3');
59 INSERT INTO `user_course` VALUES ('6', '3', '2');
View Code

表數據:

這時,當我們想要查詢小張上的所以課程相關信息的時候,需要這樣寫一條長長的SQL語句,如下:

複製代碼
SELECT
    `uc`.`id` AS `id`,
    `u`.`name` AS `username`,
    `c`.`name` AS `coursename`
FROM
    `user` `u`
LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))
LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))
WHERE
    u.`name` = '小張'
複製代碼

但是我們可以通過視圖簡化操作,例如我們創建視圖view_user_course如下:

複製代碼
-- ----------------------------
-- View structure for `view_user_course`
-- ----------------------------
DROP VIEW
IF EXISTS `view_user_course`;

CREATE ALGORITHM = UNDEFINED 
DEFINER = `root`@`localhost` 
SQL SECURITY DEFINER VIEW `view_user_course` AS ( SELECT `uc`.`id` AS `id`, `u`.`name` AS `username`, `c`.`name` AS `coursename` FROM ( ( `user` `u` LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`)) ) LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`)) ) );
複製代碼

幾點說明(MySQL中的視圖在標準SQL的基礎之上做了擴展):

ALGORITHM=UNDEFINED:指定視圖的處理演算法;

DEFINER=`root`@`localhost`:指定視圖創建者;

SQL SECURITY DEFINER:指定視圖查詢數據時的安全驗證方式;

創建好視圖之後,我們可以直接用以下SQL語句在視圖上查詢小張上的所以課程相關信息,同樣可以得到所需結果:

複製代碼
SELECT
    vuc.username,
    vuc.coursename
FROM
    view_user_course vuc
WHERE
     vuc.username = '小張'
複製代碼

視圖實例2-增刪改數據操作

繼續,我們可以嘗試在視圖view_user_course上做增刪改數據操作,如下:

update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

遺憾的是操作失敗,提示錯誤信息如下:

[SQL] update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

[Err] 1393 - Can not modify more than one base table through a join view 'demo.view_user_course'

因為不能在一張由多張關聯表連接而成的視圖上做同時修改兩張表的操作;

那麼哪些操作可以在視圖上進行呢?

視圖與表是一對一關係情況:如果沒有其它約束(如視圖中沒有的欄位,在基本表中是必填欄位情況),是可以進行增刪改數據操作;

如我們創建用戶關鍵信息視圖view_user_keyinfo,如下:

複製代碼
-- ----------------------------
-- View structure for `view_user_keyinfo`
-- ----------------------------
DROP VIEW
IF EXISTS `view_user_keyinfo`;

CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_user_keyinfo` AS SELECT
    `u`.`id` AS `id`,
    `u`.`account` AS `account`,
    `u`.`name` AS `username`
FROM
    `user` `u`;
複製代碼

進行增刪改操作如下,操作成功(註意user表中的其它欄位要允許為空,否則操作失敗):

INSERT INTO view_user_keyinfo (account, username)
VALUES
    ('test1', 'test1');
DELETE
FROM
    view_user_keyinfo
WHERE
    username = 'test1';
UPDATE view_user_keyinfo
SET username = 'updateuser'
WHERE
    id = 1

視圖與表是一對多關係情況:如果只修改一張表的數據,且沒有其它約束(如視圖中沒有的欄位,在基本表中是必填欄位情況),是可以進行改數據操作,如以下語句,操作成功;

update view_user_course set coursename='JAVA' where id=1;
update view_user_course set username='test2' where id=3;

以下操作失敗:

delete from view_user_course where id=3;
insert into view_user_course(username, coursename) VALUES('2','3');

其它

視圖中的查詢語句性能要調到最優;

修改操作時要小心,不經意間你已經修改了基本表裡的多條數據;

其它性能相關方面待實踐體會...


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

-Advertisement-
Play Games
更多相關文章
  • SQL ROUND函數是對數據進行制定精度的取值。 第一個參數是取值的數據,第二個參數是精度,第三個參數是數據取值模式(四捨五入還是截斷),其中第三個參數是可選參數,預設是四捨五入模式。 從上面結果可以看出,數據並非只保留兩位小數,而是保留兩位有效小數。 從上面兩次可以看出,預設不使用第三個參數是四 ...
  • mysql資料庫是一個常用的關係型資料庫 關係型資料庫核心元素有哪些? 主鍵:特殊欄位,用來唯一標識記錄的唯一性 欄位:數據列 記錄:數據行 數據表:數據行的集合 資料庫:數據表的集合 安裝、啟動、停止、重啟mysql伺服器的命令 安裝:sudo apt-get install mysql-serv ...
  • 一、主從複製 使用非同步複製 一個伺服器可以有多個從伺服器 從伺服器也可以有自己的從伺服器 複製功能不會阻塞主伺服器 可以通過服務功能來上主伺服器免於持久化操作,由從伺服器去執行持久化操作即可。 以下是關於Redis複製功能的幾個重要方面: Redis使用非同步複製。從Redis 2.8開始,從伺服器會 ...
  • 一、數據類型 二、全局Key操作 例子 三、String(字元串) 應用場景 String類型有如下基本操作 普通鍵值對操作 計數器 詳細示例 增 刪 改 查 四、Hash(字典) 應用場景 示例 存數據 取數據 詳細示例 增 刪 改 查 五、LIST(列表) 應用場景 簡單示例 更多示例 增 刪 ...
  • 之前一直出現這個錯誤,使用的開發工具是IDEA 我感覺似乎是hadoop與windows的操作系統不太適合 於是在project創建 org.apache.hadoop.io.nativeio包,將NativeIO.java中的代碼導入,然後修改 修改之後項目可運行。 ...
  • 轉載自:https://www.cnblogs.com/whgk/p/6179612.html 序言 之前寫到MySQL對錶的增刪改查(查詢最為重要)後,就感覺MySQL就差不多學完了,沒有想繼續學下去的心態了,原因可能是由於別人的影響,覺得對於MySQL來說,知道了一些複雜的查詢,就夠了,但是我認 ...
  • 先檢查是否存在已安裝的MySQL 若存在刪除: yum remove 軟體名稱 CentOS 7的yum源中沒有正常安裝mysql時的mysql-sever文件,需要去官網上下載 成功安裝之後重啟mysql服務 初次安裝mysql是root賬戶是沒有密碼的 設置密碼的方法 搞定! mysql在安裝完 ...
  • 轉載自:http://www.cnblogs.com/chenpi/p/5137310.html 什麼是事件 一組SQL集,用來執行定時任務,跟觸發器很像,都是被動執行的,事件是因為時間到了觸發執行,而觸發器是因為某件事件(增刪改)觸發執行; 開啟事件 查看是否開啟: 如果顯示OFF,則輸入以下語句 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...