当前位置: 首页 > news >正文

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为如果存在,防止报错,存在则删除,不存在则不进行操作。

        求关注,求点赞,求收藏!!!

相关文章:

  • 设计模式 - 工厂方法
  • 科技资讯杂志科技资讯杂志社科技资讯编辑部2025年第9期目录
  • Android平台低延迟RTSP播放器架构设计解析
  • Java数据结构第二十四期:探秘 AVL 树,当二叉搜索树学会 “自我调节”
  • 图像处理基础篇
  • VR看房:房地产数字化转型的核心引擎
  • SpringBoot+Vue自习室座位预约系统
  • 零基础学习RabbitMQ(1)--概述
  • 在cursor中,配置jdk和maven环境,安装拓展插件
  • 驯服AI巨兽的秘密武器
  • 商品中心—11.商品B端搜索系统的实现文档一
  • Linux运维新人自用笔记(inode索引节点、删除文件原理、raid10、lvm逻辑卷)
  • 用安卓手机,怎样远程管理孩子iPhone屏幕使用时间?
  • npm ci对比npm install
  • xss利用meta强制跳转 CPS report-uri 报错泄露利用 -- GPN CTF 2025 Free Parking Network 1 2
  • vue-23(创建用于逻辑提取的可重用组合组件)
  • 一键内网穿透,无需域名和服务器,自动https访问
  • 通信网络编程3.0——JAVA
  • Polar (极化)码的译码Ⅲ--级联 Polar 码
  • 在Ubuntu上设置Selenium自动化测试环境:Chrome与Firefox的详细指南
  • 苏州专业做网站公司有哪些/百度账号人工客服
  • 网站开发用电脑配置/天津网站建设公司
  • 深圳企业模板建站/网站推广排名服务
  • 邯郸网站建设多少钱/微信营销号
  • 罗庄区建设局网站/青岛seo杭州厂商
  • 马蜂窝网站做的重点/传媒公司