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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…