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

数据库造神计划第二十天---视图

  🔥个人主页:寻星探路

🎬作者简介:Java研发方向学习者

📖个人专栏: 、《

⭐️人生格言:没有人生来就会编程,但我生来倔强!!!



目录

一、什么是视图

二、创建视图

三、使用视图

1、查询用户的所有信息和考试成绩

2、查询用户的姓名和总分,(隐藏学号和各科成绩)

3、视图和真实表进行表连接查询

四、修改数据

1、通过真实表修改数据,会影响视图

2、通过视图修改数据会影响基表

3、注意事项

五、删除视图

六、视图的优点


一、什么是视图

        视图是⼀个虚拟的表(不会真正占据存储空间),它是基于⼀个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是⼀个查询的逻辑表示,物理上它依赖于基础表中的数据。

子查询:违背了编程的基本原则,把简单的给组合成复杂的了
视图:符合编程的基本原则的,把复杂的拆成简单的了,可以把复杂 SQL 的执行结果,作为视图,再通过第二个SQL对视图进一步操作,避免一次性写一个很复杂 SQL 的效果~~

二、创建视图

# 语法
CREATE VIEW view_name [(column_list)] AS select_statement

三、使用视图

-- 学生表
CREATE TABLE student (s_id INT PRIMARY KEY,s_name VARCHAR(50),s_sno VARCHAR(20),s_age INT,s_gender VARCHAR(10),s_enroll_date DATE,class_id INT
);-- 班级表
CREATE TABLE class (c_id INT PRIMARY KEY,c_name VARCHAR(50)
);-- 课程表
CREATE TABLE course (co_id INT PRIMARY KEY,co_name VARCHAR(50)
);-- 成绩表
CREATE TABLE score (sc_id INT PRIMARY KEY,student_id INT,course_id INT,sc_score DECIMAL(5, 2),FOREIGN KEY (student_id) REFERENCES student(s_id),FOREIGN KEY (course_id) REFERENCES course(co_id)
);
-- 向学生表插入数据
INSERT INTO student (s_id, s_name, s_sno, s_age, s_gender, s_enroll_date, class_id)
VALUES 
(1, '张三', 'S001', 20, '男', '2023-09-01', 1),
(2, '李四', 'S002', 21, '女', '2023-09-01', 1),
(3, '王五', 'S003', 20, '男', '2023-09-02', 2);-- 向班级表插入数据
INSERT INTO class (c_id, c_name)
VALUES 
(1, '一班'),
(2, '二班');-- 向课程表插入数据
INSERT INTO course (co_id, co_name)
VALUES 
(1, '数学'),
(2, '英语'),
(3, '语文');-- 向成绩表插入数据
INSERT INTO score (sc_id, student_id, course_id, sc_score)
VALUES 
(1, 1, 1, 85.5),
(2, 1, 2, 90.0),
(3, 2, 1, 78.5),
(4, 2, 3, 88.0),
(5, 3, 2, 92.5);

1、查询用户的所有信息和考试成绩

-- 使用真实表进行查询
SELECT s.s_id, s.s_name, s.s_sno, s.s_age, s.s_gender, s.s_enroll_date,c.c_id, c.c_name,co.co_id, co.co_name,sc.sc_id, sc.sc_score
FROM student s, class c, course co, score sc
WHERE s.class_id = c.c_idAND sc.student_id = s.s_idAND sc.course_id = co.co_id
ORDER BY s.s_id;

-- 创建视图,在select中使用别名
CREATE VIEW v_student_score AS
SELECT s.s_id, s.s_name, s.s_sno, s.s_age, s.s_gender, s.s_enroll_date,c.c_id AS class_id, c.c_name AS class_name,co.co_id AS course_id, co.co_name AS course_name, sc.sc_id AS score_id, sc.sc_score
FROM student s, class c, course co, score sc
WHERE s.class_id = c.c_idAND sc.student_id = s.s_idAND sc.course_id = co.co_id
ORDER BY s.s_id;# 查询视图
SELECT * FROM v_student_score;

-- 创建视图,指定结果集中的列名
CREATE VIEW v_student_score_v1 (id, name, sno, age, gender, enroll_date, class_id, class_name, course_id, course_name, score_id, score) AS
SELECT s.s_id, s.s_name, s.s_sno, s.s_age, s.s_gender, s.s_enroll_date, c.c_id, c.c_name, co.co_id, co.co_name, sc.sc_id, sc.sc_score
FROM student s, class c, course co, score sc
WHERE s.class_id = c.c_idAND sc.student_id = s.s_idAND sc.course_id = co.co_id;# 查询视图
SELECT * FROM v_student_score_v1;

2、查询用户的姓名和总分,(隐藏学号和各科成绩)

# 使⽤真实表进⾏查询
SELECT s.s_name, SUM(sc.sc_score) AS total
FROM student s, score sc
WHERE s.s_id = sc.student_id
GROUP BY sc.student_id
ORDER BY s.s_id;

-- 创建视图
CREATE VIEW v_student_total_points AS
SELECT s.s_id, s.s_name, SUM(sc.sc_score) AS total
FROM student s, score sc
WHERE s.s_id = sc.student_id
GROUP BY s.s_id
ORDER BY s.s_id;-- 使⽤视图查询,只能查到学⽣姓名和总分,不能再添加查询字段
SELECT * FROM v_student_total_points;

3、视图和真实表进行表连接查询

-- 视图和真实表进行表连接查询
SELECT * FROM v_student_total_points v, student s WHERE v.id = s.s_id;

四、修改数据

1、通过真实表修改数据,会影响视图

-- 修改学生(假设 student_id = 1,course_id = 1 对应 Java 课程)的成绩为99分
UPDATE score 
SET sc_score = 99 
WHERE student_id = 1 AND course_id = 1;-- 查询视图,查看数据是否已被修改
SELECT * FROM v_student_score WHERE s_id = 1 AND course_id = 1;

2、通过视图修改数据会影响基表

-- 尝试修改视图 v_student_score 中 score_id = 3 的成绩为99分(因视图创建时用了 ORDER BY,会报错)
UPDATE v_student_score 
SET score = 99 
WHERE score_id = 3;

-- 修改视图 v_student_score_v1 中 score_id = 3 的成绩为99分
UPDATE v_student_score_v1 
SET score = 99 
WHERE score_id = 3;-- 查看真实表(score)数据是否被修改
SELECT * 
FROM score 
WHERE student_id = 1 AND course_id = 1; -- 假设 score_id = 3 对应 student_id = 1,course_id = 1

        update 视图, 就相当于是按照 视图的构建规则,给 update 语句添加了一些条件实际上还是在修改原始的表

3、注意事项

(1)修改真实表会影响视图,修改视图同样也会影响真实表

(2)以下视图不可更新:

                创建视图时使用聚合函数的视图

                创建视图时使用 DISTINCT

                创建视图时使用 GROUP BY 以及

                创建视图时使用 HAVING 子句 UNION 或 UNION ALL

                查询列表中使用子查询

                在FROM子句中引用不可更新视图

五、删除视图

# 语法
drop view view_name;

六、视图的优点

1、简单性:视图可以将复杂的查询封装成⼀个简单的查询。例如,针对⼀个复杂的多表连接查询,可以创建⼀个视图,用户只需查询视图而无需了解底层的复杂逻辑。

2、安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的用户表中,可以创建⼀个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。

3、逻辑数据独立性:视图提供了⼀种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦

4、重命名列:视图允许用户重命名列名,以增强数据可读性。

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

相关文章:

  • Java 异步支付的 “不安全” 风险点控制
  • 百饮X 北森 | 康师傅百饮事业AI领导力教练Mr. Sen落地实践分享
  • 第十四章:数据分析基础库NumPy(二)
  • AI 算力加速指南:让短视频去水印更加方便
  • 神经网络架构搜索(NAS)概述:如何让AI自动设计AI模型?
  • LoRA微调技术:大模型时代的“乐高式“参数改造指南
  • 数据建模和设计章节考试考点及关系梳理
  • pytorch工具箱
  • Spark源码中的CAS思想
  • webpack-dev-server使用
  • 现有项目添加CMake
  • c语言学习_数组使用_扫雷2
  • 轻量级KVM管理工具 —— 筑梦之路
  • 第十四章:数据分析基础库NumPy(一)
  • 课题学习——SimCSE
  • gitee.com 有raw.githubusercontent.com一样的机制吗?
  • AI原生未来:新商业机会全景洞察与商业模式深度解构
  • Spark源码中的volatile
  • IDEA运行/调试配置找不到对应脚本的命令
  • 测试duckdb的C插件模板的编译加工和加载
  • 如何用AI工具开发一个轻量化CRM系统(二):需求分析
  • ARM架构学习9——LM75温度传感器+ADC转换器
  • 再见,Windows 10:升级 Windows 11 的必要性!
  • 数据结构从入门到实战——算法的时间复杂度
  • Rust字符串
  • 【图文详解】强化学习最新进展以及核心技术突破方向、核心技术架构
  • Linux SSH 安全加固与批量管理:密钥认证 + 自动化脚本 + OpenSSH 升级
  • 一个可以直接跑满本地带宽文件分享工具 开箱即用,可用于局域网内分享文件和文件夹
  • 探索AI无人直播技术:自动化带来的新机遇
  • Codeforces Round 1051 (Div. 2) D1题 题解记录