MySQL與Oracle視圖:深入解析與全面對比

視圖概念

????????視圖在 MySQL 與Oracle中本質上是一種虛擬表,其數據并非實際存儲,而是基于一個或多個基礎表的查詢結果動態生成。它像是對復雜查詢的一種封裝,極大地簡化了數據的查詢操作。例如,當我們需要頻繁從多個關聯表中獲取特定數據時,如果每次都編寫復雜的 JOIN 查詢語句,不僅繁瑣,而且容易出錯。通過創建視圖,將這些復雜查詢邏輯封裝起來,后續只需像查詢普通表一樣查詢視圖,就能輕松獲取所需數據,大大提高了開發效率。?

同時,視圖在數據安全方面也發揮著重要作用。我們可以通過視圖只向用戶暴露部分數據,隱藏基礎表中的敏感信息,如用戶表中的密碼字段等。此外,視圖還提供了邏輯抽象,即使底層表結構發生變化,只要視圖定義不變,應用程序對數據的訪問方式就無需改變,增強了系統的穩定性和可維護性。

視圖作用

? ? ? ? 1.使操作簡單化

????????視圖需要達到的目的就是所見即所需。視圖不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部條件。(視圖存放的是查詢語句,通過查詢視圖可以直接查看到該查詢語句查詢出的結果,不必再次輸入查詢語句,即操作簡單化。)

? ? ? ? 2.增加數據的安全性

? ? ? ? 通過視圖,用戶只能查詢和修改指定的數據。指定數據之外的信息,用戶接觸不到。這樣可以防止敏感信息被未授權的用戶查看,增強機密信息的安全性。

? ? ? ? 3.提高表的邏輯獨立性

? ? ? ? 視圖可以屏蔽原有表結構變化帶來的影響。例如:原有表增加列或刪除未被引用的列,對視圖不會造成影響。同樣,如果修改表中的某些列,可以使用修改視圖來解決這些列帶來的影響。

視圖基本操作?

(視圖操作前置代碼)

-- MySQL
-- 創建學生表,表名改為 stu
CREATE TABLE stu (sid INT AUTO_INCREMENT PRIMARY KEY,  -- 學生IDsname VARCHAR(100) NOT NULL,         -- 學生姓名gender ENUM('Male', 'Female') NOT NULL, -- 性別dob DATE                             -- 出生日期
);-- 插入示例數據到學生表
INSERT INTO stu (sname, gender, dob) VALUES
('Alice', 'Female', '2001-05-12'),
('Bob', 'Male', '2000-08-23'),
('Charlie', 'Male', '2002-01-30');-- 創建課程表,表名改為 co
CREATE TABLE co (cid INT AUTO_INCREMENT PRIMARY KEY,  -- 課程IDcname VARCHAR(100) NOT NULL,         -- 課程名稱credits INT NOT NULL                 -- 學分
);-- 插入示例數據到課程表
INSERT INTO co (cname, credits) VALUES
('Mathematics', 4),
('Physics', 3),
('Chemistry', 3);-- 創建成績表,表名改為 sc
CREATE TABLE sc (scid INT AUTO_INCREMENT PRIMARY KEY, -- 成績IDsid INT NOT NULL,                    -- 學生IDcid INT NOT NULL,                    -- 課程ID成績 DECIMAL(3,1),                   -- 成績(數字類型)FOREIGN KEY (sid) REFERENCES stu(sid),FOREIGN KEY (cid) REFERENCES co(cid)
);-- 插入示例數據到成績表
INSERT INTO sc (sid, cid, score) VALUES
(1, 1, 90.5),
(1, 2, 85.0),
(2, 1, 82.0),
(2, 3, 88.5),
(3, 2, 78.5),
(3, 3, 85.0);-- Oracle
-- 創建學生表,表名 stu
CREATE TABLE stu (sid NUMBER PRIMARY KEY,              -- 學生ID(序列生成)sname VARCHAR2(100) NOT NULL,        -- 學生姓名gender VARCHAR2(10) NOT NULL,        -- 性別(使用 VARCHAR2 替代 ENUM)dob DATE                             -- 出生日期
);-- 創建序列用于生成學生ID
CREATE SEQUENCE stu_seq START WITH 1 INCREMENT BY 1;-- 創建觸發器自動填充學生ID
CREATE OR REPLACE TRIGGER stu_before_insert
BEFORE INSERT ON stu
FOR EACH ROW
BEGINSELECT stu_seq.NEXTVAL INTO :NEW.sid FROM DUAL;
END;
/-- 插入示例數據到學生表
INSERT INTO stu (sname, gender, dob) VALUES
('Alice', 'Female', TO_DATE('2001-05-12', 'YYYY-MM-DD')),
('Bob', 'Male', TO_DATE('2000-08-23', 'YYYY-MM-DD')),
('Charlie', 'Male', TO_DATE('2002-01-30', 'YYYY-MM-DD'));-- 創建課程表,表名 co
CREATE TABLE co (cid NUMBER PRIMARY KEY,              -- 課程ID(序列生成)cname VARCHAR2(100) NOT NULL,        -- 課程名稱credits NUMBER NOT NULL              -- 學分
);-- 創建序列用于生成課程ID
CREATE SEQUENCE co_seq START WITH 1 INCREMENT BY 1;-- 創建觸發器自動填充課程ID
CREATE OR REPLACE TRIGGER co_before_insert
BEFORE INSERT ON co
FOR EACH ROW
BEGINSELECT co_seq.NEXTVAL INTO :NEW.cid FROM DUAL;
END;
/-- 插入示例數據到課程表
INSERT INTO co (cname, credits) VALUES
('Mathematics', 4),
('Physics', 3),
('Chemistry', 3);-- 創建成績表,表名 sc
CREATE TABLE sc (scid NUMBER PRIMARY KEY,             -- 成績ID(序列生成)sid NUMBER NOT NULL,                 -- 學生IDcid NUMBER NOT NULL,                 -- 課程IDscore NUMBER(3,1),                   -- 成績(修改列名并使用 NUMBER 類型)FOREIGN KEY (sid) REFERENCES stu(sid),FOREIGN KEY (cid) REFERENCES co(cid)
);-- 創建序列用于生成成績ID
CREATE SEQUENCE sc_seq START WITH 1 INCREMENT BY 1;-- 創建觸發器自動填充成績ID
CREATE OR REPLACE TRIGGER sc_before_insert
BEFORE INSERT ON sc
FOR EACH ROW
BEGINSELECT sc_seq.NEXTVAL INTO :NEW.scid FROM DUAL;
END;
/-- 插入示例數據到成績表
INSERT INTO sc (sid, cid, score) VALUES
(1, 1, 90.5),
(1, 2, 85.0),
(2, 1, 82.0),
(2, 3, 88.5),
(3, 2, 78.5),
(3, 3, 85.0);

查看創建視圖的權限

MySQL

????????創建視圖需要具有CREATE VIEW權限。同時具有涉及的列的SELECT權限。可以使用SELECT語句來查詢這些權限信息。

SELECT Select_priv,Create_view_priv FROM mysql.user WHERE user='用戶名';

參數說明

(1)Select_priv:屬性表示用戶是否具有SELECT權限,Y表示擁有SELECT權限,N表示沒有。

(2)Create_view_priv:屬性表示用戶是否具有CREATE VIEW權限;

(3)mysql.user:表示MySQL數據庫下面的user表。

(4)用戶名:參數表示要查詢是否擁有權限的用戶,該參數需要用單引號引起來。

Oracle

在 Oracle 中,查看和管理創建視圖的權限涉及系統權限、角色和對象權限的綜合查詢。

-- 1. 檢查用戶是否有CREATE VIEW系統權限
SELECT privilege
FROM dba_sys_privs
WHERE grantee = '用戶名'AND privilege IN ('CREATE VIEW', 'CREATE ANY VIEW');-- 2. 檢查用戶是否通過角色獲得權限
SELECT rp.grantee, rp.role, sp.privilege
FROM dba_role_privs rp
JOIN dba_sys_privs sp ON rp.granted_role = sp.grantee
WHERE rp.grantee = '用戶名'AND sp.privilege IN ('CREATE VIEW', 'CREATE ANY VIEW');

創建視圖語句

MySQL

create [or replace] [algorithm={undefied|merge|temptable}]
view 視圖名 [(屬性清單)]
as select 語句
[with [cascaded|local] check option];

參數說明:

(1)algorithm:可選項,表示視圖選擇的算法。

(2)視圖名:表示要創建的視圖名稱。

(3)屬性清單:可選項,指定視圖中各個屬性的名詞,默認與select 語句中的查詢的屬性相同。

(4)select語句:表示一個完整的查詢語句,將查詢記錄導入視圖中。

(5)with check option:可選項,表示更新視圖時要保證在該視圖的權限范圍內。

Oracle

CREATE [OR REPLACE] 
VIEW 視圖名 [(列名1, 列名2, ...)]
AS 
SELECT 查詢語句
[WITH CHECK OPTION [CONSTRAINT 約束名]];

與MySQL對比:

  1. ALGORITHM 子句
    ????????Oracle 不支持 MySQL 的?ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}?選項。Oracle 會自動優化視圖執行計劃,無需手動指定算法。

  2. CHECK OPTION 語法

    • Oracle 支持?WITH CHECK OPTION,但沒有?CASCADED/LOCAL?關鍵字。
    • 可通過?CONSTRAINT?為檢查約束命名(可選)。
  3. 視圖列命名
    與 MySQL 相同,可在視圖名后顯式指定列名列表。

例:創建視圖

-- MySQL  Oracle
create view v1 as SELECT s.sname, c.cname, sc.成績
FROM sc
JOIN stu s ON sc.sid = s.sid
JOIN co c ON sc.cid = c.cid;

? ? ? ? 創建視圖時指定屬性清單

-- MySQL  Oracle
create [or replace] view v1 (sname,cname,score)as 
-- []內內容為可選項,代表如果視圖已存在進行重載
SELECT s.sname, c.cname, sc.score
FROM sc
JOIN stu s ON sc.sid = s.sid
JOIN co c ON sc.cid = c.cid;

?

(1)運行創建視圖的語句需要用戶具有創建視圖(create view)的權限,若加了[or replace]時,還需要用戶具有刪除視圖[drop view]的權限。

(2)select語句不能包含from字句中的子查詢。

(3)select語句不能引用系統或用戶變量。

(4)select語句不能引用預處理語句參數。

(5)在存儲子程序內,定義不能引用子程序參數或局部變量。

(6)在定義中引用的表或視圖必須存在。但是,創建了視圖后,能夠舍棄定義引用的表或視圖。要想檢查視圖定義是否存在此類問題,可使用check table語句。

(7)在定義中不能引用temporary表,不能創建temporary視圖。

(8)在視圖定義中命名的表必須已存在。

(9)不能將觸發程序與視圖關聯在一起。

(10)在視圖定義中允許使用order by,但是,如果從特定視圖進行了選擇,而該視圖使用了具有自己order by的語句,它將被忽略。

修改視圖

????????修改視圖是指修改數據庫中已存在的表的定義。當基本表的某些字段發生改變時,可以通過修改視圖來保持視圖和基本表之間一致。在MySQL中通過create or replace view語句和alter view語句來修改視圖。Oracle中只能通過create or replace view語句來修改,無法用alter view修改。

create or replace view修改視圖

-- MySQL  Oracle
create or replace 
view v1 (sname , cname , score) as
select s.sname,c.cname,sc.score
from sc
join stu s on sc.sid=s.sid
joinco  c on sc.cid=c.cid;

????????該語句與創建視圖語句幾乎相同,但是增加了 or replace 代表創建v1視圖,若視圖已存在,則重載,所以盡管已經有v1視圖,我們仍然可以使用該語句進行創建或修改v1視圖。

alter view修改視圖

-- MySQL
alter view v1 as 
select sid , sname from stu;

查看視圖

????????查看視圖是指查看數據庫中已存在的視圖的定義。使用describe關鍵字。

-- MySQL Oracle
describe v1;

刪除視圖

????????刪除視圖是指刪除數據庫中已存在的視圖,刪除視圖時,只能刪除視圖的定義,不會刪除數據。MySQL中,使用drop view語句刪除視圖,同時,用戶必須擁有drop權限。

-- MySQL
drop view if exists v1;-- Oracle
-- 先查詢視圖是否存在
SELECT * FROM all_views WHERE view_name = 'V1';-- 若有結果,再執行刪除
DROP VIEW V1;

????????if exists為如果存在,防止報錯,存在則刪除,不存在則不進行操作。

? ? ? ? 求關注,求點贊,求收藏!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/911829.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/911829.shtml
英文地址,請注明出處:http://en.pswp.cn/news/911829.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp通過webview套h5時使用plus調取藍牙/usb打印

安卓使用usb調取打印機 /*** 安卓usb調取打印機*param { string | bytes[] } html 傳入的打印內容*傳入一段文本或一個bytes數組* returns*/ export const printUsb (html) > {return new Promise((resolve, reject) > {if (!window.plus) return reject(new Error(&qu…

吃透 Golang 基礎:基于共享變量的并發

文章目錄 sync.Mutex 互斥鎖sync.RWMutex 讀寫鎖sync.Once 惰性初始化Goroutine 與線程動態棧Goroutine 調度GOMAXPROCSGoroutine 沒有 ID 號 上一篇文章當中我們已經系統性地回顧了在 Go 當中基于 Goroutine 和 Channel 進行并發控制的方法,Goroutine 指的是 Golan…

智紳科技丨如何選擇一家好的養老機構?

居家養老、社區養老和機構養老是我們在養老相關消息中常常聽到的3個詞。在地方文件中,居家養老和社區養老還經常被統稱為居家社區養老或 社區居家養老。那么,這三者之間到底有什么不同呢? 居家養老服務涵蓋生活照料、家政服務、康復護理、醫…

【支持向量機】SVM線性支持向量機學習算法——軟間隔最大化支持向量機

支特向量機(support vector machines, SVM)是一種二類分類模型。它的基本模型是定義在特征空間上的間隔最大的線性分類器。包含線性可分支持向量機、 線性支持向量機、非線性支持向量機。 當訓練數據近似線性可分時,通過軟間隔最大化學習線性分類器, 即為…

面試 — 預準備 — 面試前準備攻略

好記憶不如爛筆頭,能記下點東西,就記下點,有時間拿出來看看,也會發覺不一樣的感受. 只講干貨,不羅里吧嗦! 作為一個軟件從業者,在面試前的準備工作至關重要,能大幅提升你的求職成功…

Oracle停庫shutdown長時間無反應

Oracle停庫shutdown長時間無反應 現象:Oracle停庫卡住,長時間沒有反應。 SQL> shutdown immediate;注:此時切記不可Ctrl+C直接取消!切記不可Ctrl+C直接取消!切記不可Ctrl+C直接取消! 檢查alert_SID.log日志看是哪些會話進程導致的: Shutting down instance (immed…

使用ZYNQ芯片和LVGL框架實現用戶高刷新UI設計系列教程(第十八講

列表部件基本上是一個采用垂直布局的矩形,可向其中添加按鈕和文本。 部件包含: LV_PART_MAIN - 主要的屬性,大部分是這個部件。 LV_PART_SCROLLBAR - 滾動條的屬性。 (1) 添加文本 lv_obj_t * lv_list_add_text(lv_o…

Android Navigation 原理解析

1. nav_graph.xml 如何生成路由表 NavGraph 解析流程與原理 關鍵技術點&#xff1a; XML 解析&#xff1a; 使用 XmlResourceParser 解析 XML 文件 遍歷所有節點&#xff08;<fragment>, <activity>, <navigation>等&#xff09; Destination 創建&#…

HarmonyOS 應用權限管控流程

HarmonyOS 應用權限管控流程詳解 一、權限管控概述 HarmonyOS 通過多層次的安全機制保護用戶數據和系統資源&#xff0c;其中應用權限管控是核心組成部分。系統通過以下機制實現權限管控&#xff1a; 應用沙箱&#xff1a;每個應用運行在獨立沙箱中&#xff0c;通過TokenID識…

Python訓練營-Day33

import torch torch.cudaimport torch# 檢查CUDA是否可用 if torch.cuda.is_available():print("CUDA可用&#xff01;")# 獲取可用的CUDA設備數量device_count torch.cuda.device_count()print(f"可用的CUDA設備數量: {device_count}")# 獲取當前使用的C…

【STM32】中斷優先級管理 NVIC

這篇文章是對 Cortex-M3 內核中斷系統 和 STM32F1 系列 NVIC(嵌套向量中斷控制器) 的解析說明。我將從結構清晰、層次分明的角度,對 NVIC 中斷優先級分組的概念和 STM32F103 的實際情況做一個系統性的總結與敘述。 參考資料: STM32F1xx官方資料:《STM32中文參考手冊V10》…

Angular2--高級特性(TODO)

1 基礎 關于Angular的基礎部分&#xff0c;幾個核心部分和框架&#xff0c;在之前都寫過了。Angular1--Hello-CSDN博客 Angular的幾個核心部分和框架&#xff1a; 模板就是組件中的template&#xff0c;對應MVC的V。 組件類就是Component類&#xff0c;對應對應MVC的C。 服…

pikachu靶場通關筆記44 SSRF關卡02-file_get_content(三種方法滲透)

目錄 一、SSRF 1、簡介 2、原理 二、file_get_contents函數 1、功能 2、參數 3、返回值 4、file_get_contents與SSRF 三、滲透實戰 1、基本探測 2、http協議 &#xff08;1&#xff09;訪問upload-labs靶場 &#xff08;2&#xff09;訪問yijuhua.txt 3、file協議…

Android 控件 - EditText 的 Hint(Hint 基本用法、Hint 進階用法、單獨設置 Hint 的大小)

一、EditText 的 Hint 1、基本介紹 在 Android 開發中&#xff0c;EditText 的 Hint 用于顯示提示文本 提示文本當用戶沒有輸入任何內容時顯示&#xff0c;輸入內容后自動消失 2、基本使用 &#xff08;1&#xff09;在 XML 布局文件中設置 在 XML 布局文件中設置 Hint …

PostgreSQL(知識片):索引關聯度indexCorrelation

索引關聯度的絕對值越大&#xff0c;說明這個索引數據越好。絕對值最大為1。 首先我們創建一個表&#xff1a;tbl_corr&#xff0c;包含列&#xff1a;col、col_asc、col_desc、col_rand、data&#xff0c;col_asc存儲順序數據&#xff0c;col_desc存儲降序數據&#xff0c;col…

React純函數和hooks原理

純函數 JS 若滿足其下條件 &#xff0c;被稱為純函數 1。確定的輸入一定產生確定的輸出 2 不產生副作用 另外redux中的reducer也要求是純函數 Fiber 架構和hooks原理 useRef 在組件的整個聲明周期內保持不變 用法&#xff1a;1綁定dom元素 或者 綁定一個類組件 因為函數式…

養老專業實訓室虛擬仿真建設方案:助力人才培養與教育教學革新

隨著我國老齡化程度加深&#xff0c;養老服務行業人才需求激增。養老專業實訓室虛擬仿真建設方案憑借虛擬仿真技術&#xff0c;為養老專業教育教學帶來革新&#xff0c;對人才培養意義重大。點擊獲取實訓室建設方案 一、構建多元化虛擬場景&#xff0c;豐富實踐教學內容 模擬居…

LangChain 提示詞工程:語法結構詳解與完整實戰指南

LangChain 提示詞工程&#xff1a;語法結構詳解與完整實戰指南 我將為您系統性地解析 LangChain 中各類提示模板的核心語法結構&#xff0c;通過清晰展示語法與對應代碼示例&#xff0c;幫助您徹底掌握提示工程的實現方法。所有示例均圍繞報幕詞生成場景展開。 在這里插入圖片…

20250625解決在Ubuntu20.04.6LTS下編譯RK3588的Android14出現cfg80211.ko的overriding問題

Z:\14TB\versions\rk3588-android14-FriendlyElec\mkcombinedroot\res\vendor_modules.load 【拿掉/刪除這一項目&#xff01;】 cfg80211.ko 20250625解決在Ubuntu20.04.6LTS下編譯RK3588的Android14出現cfg80211.ko的overriding問題 2025/6/25 20:20 緣起&#xff1a;本文針對…

在WSL下搭建JavaWeb: JDBC學習環境

在WSL下搭建JavaWeb: JDBC學習環境 前言 ? 筆者最近打算放松一下&#xff0c;接觸一點經典的Java Web技術&#xff0c;自己在閑暇時間時玩一玩JavaWeb技術。這里開一個小系列整理一下最近學習的東西&#xff0c;以供參考和學習。 ? 筆者的計劃是使用VSCode寫代碼&#xff…