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

零基础学SQL(十一、视图)

目录

 前置建表

一、什么是视图

二、为什么使用视图

三、视图的规则和限制

四、视图的增删改查

 五、视图数据的更新


前置建表

CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT '主键',code varchar(255) NOT NULL COMMENT '学号',name varchar(255) DEFAULT NULL COMMENT '姓名',sex enum('男','女') DEFAULT NULL COMMENT '性别',age  int(0)  NULL COMMENT '年龄',PRIMARY KEY (`id`)
);INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (1, '20220101', '张三', '男', 12);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (2, '202202', '李四', '男', 14);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (3, '202203', '王五', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (4, '202204', '张三飞', '男', 20);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (5, '202205', '小丽', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (6, '202206', '小明', '男', 11);CREATE TABLE `score` (`id` int NOT NULL AUTO_INCREMENT,`studentcode` int DEFAULT NULL,`score` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (1, 20220101, 70);
INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (2, 202202, 99);
INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (3, 202203, 100);
INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (6, 202206, 69);

数据如下

     ​​​​​​

一、什么是视图

        视图是一种简单的数据查询机制。不同于表,视图不涉及数据存储,因此读者不用担心视图会充满磁盘空间。读者可以先通过命名select 语句来创建视图,然后将这个查询保存起来供其他用户使用,而其他用户使用这个视图时就像他们自己在直接查询数据。视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

二、为什么使用视图

1、重用SQL语句。 
2、简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。
3、使用表的组成部分而不是整个表。
4、保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。
5、更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据

三、视图的规则和限制

1、与表一样,视图必须唯一命名(不能给视图取与别的视图或表相同的名字)。
2、对于可以创建的视图数目没有限制。
3、为了创建视图,必须具有足够的访问权限。这些限制通常由数据库管理人员授予。
4、视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。
5、ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图中的ORDER BY将被覆盖。
6、视图不能索引,也不能有关联的触发器或默认值。
7、视图可以和表一起使用。例如,编写一条联结表和视图的SELECT语句。

四、视图的增删改查

1、视图用CREATE VIEW语句来创建。
2、使用SHOW CREATE VIEW viewname;来查看创建视图的语句。
3、用DROP删除视图,其语法为DROP VIEW viewname;。
4、更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR  REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图。

--创建一个名为stu_score 的视图用于保存学生和成绩信息
CREATE VIEW stu_score as SELECT a.code,a.name,a.sex,a.age,b.score FROM student a LEFT join  score b on a.code=b.studentcode ;

 这个时候score给张三飞增加一个成绩记录为90分,可以看到视图也进行了变化

 五、视图数据的更新

如果提供给用户一系列视图作为检索数据使用,那么用户也需要修改同一数据怎么办?强迫用户使用视图检索,又允许他们使用update或insert 语句自己修改基础数据。这似乎有点奇怪。为此,MySQL、Oracle数据库和SQL Server都允许用户在遵守特定规则的前提下通过视图修改数据。对于MySQL来说,如果下面的条件能够满足,那么视图就是可更新的:
1、没有使用聚合函数(max()、min()和 avg()等);
2、视图没有使用group by或having子句;
3、select或from子句中不存在子查询,并且 where子句中的任何子查询都不引用from子句中的表;
4、视图没有使用union、union all和 distinct;from子句包括不止一个表或可更新视图;
5、如果有不止一个表或视图,那么from子句只使用内连接。

比如创建一个简单的视图

CREATE VIEW stu_test as SELECT a.code,a.name,a.sex,a.age  FROM student a   ;

然后更新一条数据

update stu_test  set age=101 where code='202205'

更新后的视图数据

更新视图后的student表数据也会跟着变更

 

http://www.lryc.cn/news/24716.html

相关文章:

  • web,h5海康视频接入监控视频流记录三(后台node取流)
  • 网络安全从入门到精通:30天速成教程到底有多狠?你能坚持下来么?
  • 世界上最流行的编程语言,用户数超过Python,Java,JavaScript,C的总和!
  • 杂谈:created中两次数据修改,会触发几次页面更新?
  • 原生JS实现拖拽排序
  • Coredump-N: corrupted double-linked list
  • 5个好用的视频素材网站
  • 使用码匠连接一切|二
  • 3.1.1 表的相关设计
  • Vue3 企业级项目实战:认识 Spring Boot
  • Swagger2实现配置Header请求头
  • 4-1 SpringCloud快速开发入门:RestTemplate类详细解读
  • 【IDEA】【工具】幸福感UP!开发常用的工具 插件/网站/软件
  • 【蓝桥杯集训·每日一题】AcWing 1562. 微博转发
  • [busybox] busybox生成一个最精简rootfs(下)
  • Java奠基】运算符的讲解与使用
  • 开发一个会员管理系统
  • 华为OD机试题【找出通过车辆最多颜色】用 C++ 进行编码 (2023.Q1)
  • 如何根据子网掩码计算出网络前缀(prefix)
  • 【FATE联邦学习】Fateboard的使用
  • 解决vue3没有this造成的无法使用vue2
  • 百度前端二面vue面试题指南
  • 【备战面试】每日10道面试题打卡-Day1
  • 服务器重启后jar包自动重启
  • Ubuntu 交叉编译工具链安装
  • Vue3中ref、reactive、toRef、toRefs基本用法和区别
  • python hash 不一致踩坑总结
  • qt5.15 快速安装 国内源
  • JavaScript 对象
  • 数据库设计三大范式