我写本文主要目的,是在网上看见了
所以,文本主要探讨的问题如下,验证结果在最后面
一、修改视图,基表会跟着改吗?答案:会改变
二、修改基表,视图会变化吗?答案:会改变
视图概述
视图是由数据库中的一个表或多个表导出的虚拟表,其作用是方便用户对数据的操作。
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。同样对视图的更新,会影响到原来表的数据。
视图是存储在数据库中的查询的SQL语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,例如,员工信息表,可以用视图只显示姓名、工龄、地址,而不显示社会保险号和工资数等;另一个原因是可使复杂的查询易于理解和使用。这个视图就像一个“窗口”,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列。
一、准备工作,创建一张表,并添加数据
# 创建一个 用户表
CREATE TABLE `user` (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255),
age INT(11)
);
# 写三个用户
INSERT INTO `USER` (`name`,`age`) VALUES ('张三',18),('李四',20),('王麻子',200);
1、查看数据库文件有什么
.frm
文件保存表的结构
.ibd
文件保存表的数据
二、视图的基本操作
1、创建视图
# 创建一个视图
CREATE VIEW test_view1 as SELECT * FROM USER;
1.1、查看文件
发现只有一个
test_view1.frm
的文件,说明视图只有结构没有数据,是一个虚拟表,其内容由查询定义。
2、查询视图
# 就跟普通的查询语句一样
SELECT * FROM test_view1;
3、修改视图
修改视图,就是删除上一个记录,并录入当前记录,有两种实现语句,分别是:
CREATE OR REPLACE VIEW
和ALTER VIEW
# 新创建一个 动物表
CREATE TABLE `animal` (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255),
`master` INT(11)
);
# 写三个动物
INSERT INTO animal (`name`,`master`) VALUES ('小白',1),('小黑',1),('小黄',2);
# 修改方式1
# 修改值,并取别名
CREATE OR REPLACE VIEW test_view1 (id1,NAME1,MASTER1) AS SELECT id,NAME,MASTER FROM animal;
# 查看
SELECT * FROM test_view1;
#+-----+--------+---------+
#| id1 | NAME1 | MASTER1 |
#+-----+--------+---------+
#| 1 | 小白 | 1 |
#| 2 | 小黑 | 1 |
#| 3 | 小黄 | 2 |
#+-----+--------+---------+
#3 rows in set (0.00 sec)
# 修改方式1
# 修改回user表
ALTER VIEW test_view1 AS SELECT * FROM user;
# 查看
SELECT * FROM test_view1;
#+----+-----------+------+
#| id | name | age |
#+----+-----------+------+
#| 1 | 张三 | 18 |
#| 2 | 李四 | 20 |
#| 3 | 王麻子 | 200 |
#+----+-----------+------+
#3 rows in set (0.00 sec)
4、删除视图
DROP VIEW test_view1;
一、修改视图,基表会跟着改吗?
答案:会改变,证明如下
# 创建一个 用户表
CREATE TABLE `user` (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255),
age INT(11)
);
# 创建一个 动物表
CREATE TABLE `animal` (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255),
`master` INT(11)
);
# 写三个用户
INSERT INTO `USER` (`name`,`age`) VALUES ('张三',18),('李四',20),('王麻子',200);
# 写三个动物,并对应张三和李四两个用户
INSERT INTO animal (`name`,`master`) VALUES ('小白',1),('小黑',1),('小黄',2);
# 查找所有的用户 --------第一个查询语句---------
SELECT * FROM user;
# 创建一个多表查询的视图
CREATE VIEW test_view as SELECT u.*,a.name animal_name FROM `USER` u,animal a WHERE u.id = a.master;
# 查看视图 --------第二个查询语句---------
SELECT * FROM test_view;
# 修改视图
UPDATE test_view SET NAME = '我擦' WHERE id = 1;
# 再次查看视图,发现更改了 --------第三个查询语句---------
SELECT * FROM test_view;
# 再次查看用户,发现更改了 --------第四个查询语句---------
SELECT * FROM user;
# 删除 视图和 表格
DROP VIEW test_view;
DROP TABLE user;
DROP TABLE `animal`;
第一个查询
第二个查询
第三个查询
第四个查询
二、修改基表,视图会变化吗?
答案:会改变,证明如下
# 创建一个 用户表
CREATE TABLE `user` (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255),
age INT(11)
);
# 创建一个 动物表
CREATE TABLE `animal` (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255),
`master` INT(11)
);
# 写三个用户
INSERT INTO `USER` (`name`,`age`) VALUES ('张三',18),('李四',20),('王麻子',200);
# 写三个动物,并对应张三和李四两个用户
INSERT INTO animal (`name`,`master`) VALUES ('小白',1),('小黑',1),('小黄',2);
# 创建一个多表查询的视图
CREATE VIEW test_view as SELECT u.*,a.name animal_name FROM `USER` u,animal a WHERE u.id = a.master;
# 查看视图 --------第一个查询语句---------
SELECT * FROM test_view;
# 修改animal表
UPDATE animal SET NAME = '我也不知道取什么名字了' WHERE id = 1;
# 再次查看视图,发现更改了 --------第二个查询语句---------
SELECT * FROM test_view;
# 再次查看animal,发现更改了 --------第三个查询语句---------
SELECT * FROM animal;
# 删除 视图和 表格
DROP VIEW test_view;
DROP TABLE user;
DROP TABLE `animal`;
第一个查询
第二个查询
第三个查询