【MySQL】视图

ops/2024/11/26 8:33:02/

1.表格形式展示视图的作用

作用详细解释示例场景
简化复杂查询将复杂的SQL查询封装成视图,用户通过简单的查询访问结果,减少重复书写复杂SQL。一个复杂的销售报表统计查询,可以创建为视图,用户只需查询视图名称即可获得结果。
提高数据安全性可以限制用户访问某些敏感数据,仅通过视图提供必要字段,而不暴露整个表的数据。一个包含员工工资信息的表,可通过视图只提供员工姓名和部门,不暴露工资信息。
提高查询可读性使用视图可以为复杂的表或计算结果定义更直观的别名,提高查询的可读性。多表关联后字段名复杂,可以在视图中为这些字段定义更易理解的别名。
数据抽象层通过视图隐藏底层表结构变化,当表结构发生变化时,只需修改视图,不影响使用视图的应用程序或用户查询。数据库表调整列名,但应用系统仍可通过视图使用旧列名,不需要更新应用程序代码。
实现数据聚合与分组可以通过视图封装聚合计算逻辑(如SUM、AVG等),直接为用户提供聚合后的数据。一个销售表中,创建按月统计销售总额的视图,为报表展示提供支持。
简化多表关联将复杂的多表关联逻辑封装到视图中,简化开发和维护工作。订单表和客户表的关联查询可以定义为视图,只需查询视图即可获得完整的订单信息。

2.视图的基本语法与with cascaded/local check option黑马案例演示

数据准备

create table student(id   int auto_increment comment '主键ID' primary key,name varchar(10) null comment '姓名',no   varchar(10) null comment '学号'
)comment '学生表';INSERT INTO student (name, no) VALUES ('黛绮丝', '2000100101');
INSERT INTO student (name, no) VALUES ('谢逊', '2000100102');
INSERT INTO student (name, no) VALUES ('殷天正', '2000100103');
INSERT INTO student (name, no) VALUES ('韦一笑', '2000100104');create table course(id int auto_increment comment '主键ID' primary key,name varchar(10) null comment '课程名称'
)comment '课程表';INSERT INTO course (name) VALUES ('Java');
INSERT INTO course (name) VALUES ('PHP');
INSERT INTO course (name) VALUES ('MySQL');
INSERT INTO course (name) VALUES ('Hadoop');create table student_course(id int auto_increment comment '主键' primary key,studentid int not null comment '学生ID',courseid  int not null comment '课程ID',constraint fk_courseid foreign key (courseid) references course (id),constraint fk_studentid foreign key (studentid) references student (id)
)comment '学生课程中间表';INSERT INTO student_course (studentid, courseid) VALUES (1, 1);
INSERT INTO student_course (studentid, courseid) VALUES (1, 2);
INSERT INTO student_course (studentid, courseid) VALUES (1, 3);
INSERT INTO student_course (studentid, courseid) VALUES (2, 2);
INSERT INTO student_course (studentid, courseid) VALUES (2, 3);
INSERT INTO student_course (studentid, courseid) VALUES (3, 4);

视图操作sql语句

-- 视图
-- 创建视图
-- 创建时 or replace可以不加,但是修改时要加
create or replace view stu_v_1 as select id, name from student where id <= 10;-- 查询视图
show create view stu_v_1;
select * from stu_v_1;
select * from stu_v_1 where id < 3;-- 修改视图
create or replace view stu_v_1 as select id, name, no from student where id <= 10;alter view stu_v_1 as select id, name from student where id <= 10;
-- 删除视图
drop view if exists stu_v_1;-- 视图检查选项 with cascaded/local check option
-- local 只约束本视图
show create view stu_v_1;
create or replace view stu_v_1 as select id, name from student where id <= 20 with local check option;select * from stu_v_1;
insert into stu_v_1 values(6, 'Tom');
insert into stu_v_1 values(30, 'Tom');  -- 因为插入检查选项的作用,不允许插入id>20的数据-- cascaded 约束本视图及其依赖视图
create or replace view stu_v_1 as select id, name from student where id <= 20;
show create view stu_v_1;
select * from stu_v_1;
insert into stu_v_1 values(5, 'Tom');
insert into stu_v_1 values(25, 'Tom'); -- 这里25被插入了student表
delete from stu_v_1 where id = 7;create or replace view stu_v_2 as select id, name from stu_v_1 where id >= 10 with cascaded check option;
insert into stu_v_2 values(7, 'Tom');-- 不可以插
insert into stu_v_2 values(26, 'Tom');-- 不可以插,虽然满足>=10,但是不满足所依赖视图的<=20条件
insert into stu_v_2 values(15, 'Tom');-- 可以插-- 那么再基于v2创建一个没有加检查选项的视图,又会怎么样?
-- 只要加了cascaded 就会检查当前视图,以及其依赖的所有视图,
create or replace view stu_v_3 as select id, name from stu_v_2 where id <= 15;-- 没有加检查,所以这里where不会约束向v1,v2加数据insert into stu_v_3 values(11, 'Tom');-- 可以插    但是受到v1,v2的约束,因为v2加了cascaded,且v2依赖于v1
insert into stu_v_3 values(17, 'Tom');-- 可以插
insert into stu_v_3 values(28, 'Tom');-- 不可以插 不满足v2,v1-- local-----
create or replace view stu_v_4 as select id, name from student where id <= 15 with local check option;
show create view stu_v_1;
select * from stu_v_1;insert into stu_v_4 values(5, 'Tom');
insert into stu_v_4 values(16, 'Tom');
delete from stu_v_4 where id = 7;create or replace view stu_v_5 as select id, name from stu_v_4 where id >= 10 with local check option;
insert into stu_v_5 values(13, 'Tom');-- 可以插
insert into stu_v_5 values(17, 'Tom');-- 可以插
insert into stu_v_5 values(18, 'Tom');-- 不可以插-- 那么再基于v2创建一个没有加检查选项的视图,又会怎么样?
-- 只要加了cascaded 就会检查当前视图,以及其依赖的所有视图,
create or replace view stu_v_6 as select id, name from stu_v_5 where id < 20;-- 没有加检查,所以这里where不会约束向v1,v2加数据insert into stu_v_6 values(14, 'Tom');-- 可以插    但是受到v1,v2的约束,因为v2加了cascaded,且v2依赖于v1
insert into stu_v_6 values(17, 'Tom');-- 可以插
insert into stu_v_6 values(28, 'Tom');-- 不可以插 不满足v2,v1-- local与cascaded区别,插local时检查local如果依赖的图有local也检查
-- 插cascaded时检查cascaded,且检查其依赖视图,无论有无cascaded-- 视图的插入与更新
-- 要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。/*1.为了保证数据库表的安全性,开发人员在操作tb user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个
字段。*/
select * from tb_users;
create or replace view tb_user_view as select id, name, profession, age, gender, status, createtime from tb_users;
select * from tb_user_view;
/*
2.
查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视
图。*/select s.name, s.no, c.name from student s, student_course sc, course c where s.id = sc.studentid and sc.courseid = c.id;create or replace view tb_stu_course_view as select s.name 学生名字, s.no, c.name from student s, student_course sc, course c where s.id = sc.studentid and sc.courseid = c.id;-- 后续就可以依赖这个视图进行查询,而不必要,每次都写后面的子查询
-- 通过视图简化多表联查操作
select * from tb_stu_course_view;

http://www.ppmy.cn/ops/136788.html

相关文章

GitLab 使用过程中常见问题及解决方案

开发人员常见问题及解决方案 合并请求被拒绝 原因&#xff1a;代码质量问题、安全漏洞或流水线失败。解决方案&#xff1a; 使用 Code Quality 工具检查代码质量。查看流水线日志&#xff0c;修复单元测试、编译错误或扫描问题。优化静态分析&#xff08;SAST&#xff09;结果&…

认识网络安全

一 网络攻击链 踩点-工具准备-载荷投递-漏洞利用-释放载荷-建立通道-目标达成 简化下&#xff1a; 目标侦察&#xff1a;准确识别目标&#xff0c;收集目标详细信息&#xff0c;比如 网络、 邮箱、员工、社会关系、对外提供服务、漏洞 信息等&#xff0c;为 后续攻击做准备。…

企业OA管理系统:Spring Boot技术框架与实践

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…

RabbitMQ5:Fanout交换机、Direct交换机、Topic交换机

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题

本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…

apache、iis规则设置防盗链

Linux下规则文件.htaccess(手工创建.htaccess文件到站点根目录) <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} !baidu.com [NC] RewriteCond %{HTTP_REFERER} !google.com [NC] RewriteCond %{HTTP_REFERER} !xxx.net [NC] #RewriteCond %{…

Jackson 对象与json数据互转工具类JacksonUtil

下面是一个基于 Jackson 的工具类 JacksonUtil&#xff0c;用于在 Java 项目中实现对象与 JSON 数据之间的互相转换。该工具类具有简洁、易用、通用的特点。 package com.fy.common.util;import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core…

反向代理服务器的用途

代理服务器在网络中扮演着重要的角色&#xff0c;它们可以优化流量、保护服务器以及提高安全性。在代理服务器中&#xff0c;反向代理服务器是一种特殊类型&#xff0c;常用于Web服务器前&#xff0c;它具备多种功能&#xff0c;能够确保网络流量的顺畅传输。那么&#xff0c;让…