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

Oracle视图(基本使用)

视图

视图是通过定制的方式显示一个或者多个表的数据。

视图可以视为“虚拟表”“存储的查询”

视图的优点:

  • 提供了另外一种级别的表安全性
  • 隐藏了数据的复杂性
  • 简化了用户的SQL命令
  • 隔离基表结构的改变
  • 通过重命名列,从另一个角度提供数据。

视图里面不存放数据,是在基表上建立的查询,查询的话会从基表把数据取出返回。

创建视图

sqlplus t1/t1@orcl

#查看当前用户所拥有视图
select * from user_views;

SQL> select * from tab;
TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
STUDENT                        TABLE   

SQL> desc student;
Name  Type        Nullable Default Comments 
----- ----------- -------- ------- -------- 
SNO   NUMBER(4)   Y                         
SNAME VARCHAR2(2) Y 

insert into student values(1,'wa');
#创建视图
create view view1 as 
select * from student where sno = 1;

select * from user_views;

select * from view1;

更新视图

#更新视图
update view1 set sno = 5 where sno = 1;
commit;

#注意注意!!!!更新了视图表对应被更新了!!!!
SQL> select * from student;
  SNO SNAME
----- -----
    5 wa
#视图查不到东西了!
SQL> select * from view1;
  SNO SNAME
----- -----

with check option

#创建视图
create view view2 as 
select * from student where sno = 5 with check option;

#查询视图
SQL> select * from view2;
  SNO SNAME
----- -----
    5 wa

#不让修改!with check optin为了不让减少视图结果集的操作
SQL> update view2 set sno = 10 where sno = 5;
update view2 set sno = 10 where sno = 5
ORA-01402: view WITH CHECK OPTION where-clause violation

order by

SQL> create view view3 as 
select * from student order by sno desc;

SQL> select * from view3;
  SNO SNAME
----- -----
    7 C
    6 B
    5 A
    5 wa

链接视图

SQL> select * from student;
  SNO SNAME
----- -----
    1 B
    2 C
    
SQL> select * from address;
                                     ID NAME
--------------------------------------- --------------------
                                      1 贵阳
                                      2 大连

create view view_student_address
as
	select s.sname,a.name
	from student s,address a
	where s.sno = a.id;
	
SQL> select * from view_student_address;
SNAME NAME
----- --------------------
B     贵阳
C     大连

#无法修改与非建值保存表对应的列
#无法修改任何一列,因为数据来自多张表。
#没有键保留表无法更改!
SQL> update view_student_address set name = '河南' where sname = 'B';
update view_student_address set name = '河南' where sname = 'B'
ORA-01779: cannot modify a column which maps to a non key-preserved table

键保留表

drop table student;
drop table department;
create table student(id int,name varchar2(20),deptno varchar2(20));
create table department(deptno varchar2(20),name varchar2(20));
insert into student values(1,'wang','001');
insert into student values(2,'li','001');
insert into student values(3,'zhang','002');
insert into department values('001','人工智能系');
insert into department values('002','软件工程系');
insert into department values('003','ai系');
commit;

drop view view_stu_dept;
create view view_stu_dept
as 
select s.id,s.name sname,s.deptno deptno1,d.deptno deptno2,d.name deptname
from student s,department d
where s.deptno = d.deptno;

select * from view_stu_dept;

在这里插入图片描述

# 因为student表的ID为主键 可以修改student而不能修改department
# student键保留表 department非键保留表

SQL> update view_stu_dept set sname = 'xiaoyi' where id = 1;
update view_stu_dept set sname = 'xiaoyi' where id = 1
ORA-01779: cannot modify a column which maps to a non key-preserved table

咳咳:翻车了!问题不大遇到问题需要解决!

ALTER TABLE student ADD PRIMARY KEY(id);
ALTER TABLE department ADD PRIMARY KEY(deptno);

drop view view_stu_dept;
create view view_stu_dept
as 
select s.id,s.name sname,s.deptno deptno1,d.deptno deptno2,d.name deptname
from student s,department d
where s.deptno = d.deptno;

#成功!
update view_stu_dept set sname = 'xiaoyi' where id = 1;
SQL> select * from view_stu_dept;

在这里插入图片描述

# 函数建视图

create view view_student_1 as select id,upper(name) sname from student;

SQL> select * from view_student_1;
                                     ID SNAME
--------------------------------------- --------------------
                                      1 XIAOYI
                                      2 LI
                                      3 ZHANG
                                      
select * from view_student_1 where sname = 'XIAOYI';

删除视图

drop view view_student_1;

在这里插入图片描述

http://www.dtcms.com/a/23451.html

相关文章:

  • qt实习总结
  • 内网下,Ubuntu (24.10) 离线安装docker最新版教程
  • 【踩坑实录】-Boundary Amount must be a positive integer, provided amount is: 0
  • 第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025)
  • Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)
  • VINS-mono代码笔记
  • Java 运行时常量池笔记(详细版
  • 第150场双周赛:好数字之和、分割正方形 Ⅰ、分割正方形 Ⅱ、最短匹配字符串
  • 第1章大型互联网公司的基础架构——1.2 客户端连接机房的技术1:DNS
  • Java基于 SpringBoot+Vue的微信小程序跑腿平台V2.0(附源码,文档)
  • css里flex+margin布局
  • iOS 中使用 FFmpeg 进行音视频处理
  • 机器学习数学基础:27.数字特征
  • 深入解析 iOS 视频录制(一):录制管理核心MWRecordingController 类的设计与实现
  • 网络安全不分家 网络安全不涉及什么
  • el-input无法输入0.0001的小数,自动转换为0在vue3中的bug
  • 【SpringBoot注解失效】@注解为什么不生效?
  • home assistant ddns动态域名解析插件
  • AWS上Amazon Redshift用Zoominfo API验证公司基本信息数据正确性检查设计方案
  • Vue 前端开发中的路由知识:从入门到精通
  • STM32外设SPI FLASH应用实例
  • 2.16日学习总结
  • Flutter 记一次疑难杂症
  • 【HUSTOJ 判题机源码解读系列04】判题机常见技术选择方案
  • 响应式布局学习笔记
  • BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项
  • 从零到一:Spring Boot 与 RocketMQ 的完美集成指南
  • GPT-4o悄然升级:能力与个性双突破,AI竞技场再掀波澜
  • Go 模块管理工具 `go mod tidy` 和 `go.sum` 文件详解
  • 在 Android 上自定义编译 FFmpeg