MySQL数据库-视图
视图
视图的概念
视图是一种虚拟存在的数据表,这个虚拟的表并不在数据库中实际存在。
作用
是将一些比较复杂的查询语句的结果,封装到一个虚拟表中。后期再有相同复杂查询时,直接查询这张虚拟表即可。
就是为了简化操作!
说白了,视图就是将一条SELECT查询语句的结果封装到了一个虚拟表中,所以我们在创建视图的时候,工作重心就要放在这条SELECT查询语句上。
例如:
有两张数据表city 与 country
需求:查询城市信息和所属国家信息
SELECT c1.id,c1.name,c2.name
FROM city c1,country c2
WHERE c1.cid=c2.cid;
查询结果如下:
但是在开发中,如果要较为经常的使用这些信息,那么将会经常使用到上述的SQL语句,这样子较为繁琐。故我们可以使用视图,将上述查询出来的结果封装到一个视图中,下次再使用就直接从视图中取数据即可,不用再使用上述的SQL查询语句了!
视图的好处
简单
对于使用视图的用户不需要关心表的结构、关联条件和筛选条件。因为这张虚拟表中保存的就是已经过滤好条件的结果集
安全
视图可以设置权限 , 致使访问视图的用户只能访问他们被允许查询的结果集
数据独立
一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响
视图数据准备 (样例)
-- 创建db7数据库
CREATE DATABASE db7;
-- 使用db7数据库
USE db7;
-- 创建country表
CREATE TABLE country(
id INT PRIMARY KEY AUTO_INCREMENT,
country_name VARCHAR(30)
);
-- 添加数据
INSERT INTO country VALUES (NULL,'中国'),
(NULL,'美国'),
(NULL,'俄罗斯');
-- 创建city表
CREATE TABLE city(
id INT PRIMARY KEY AUTO_INCREMENT,
city_name VARCHAR(30),
cid INT, -- 外键列。关联country表的主键列id
CONSTRAINT cc_fk1 FOREIGN KEY (cid) REFERENCES country(id)
);
-- 添加数据
INSERT INTO city VALUES (NULL,'北京',1),
(NULL,'上海',1),
(NULL,'纽约',2),
(NULL,'莫斯科',3);
创建了一个country表和city表。
视图的创建 (view)
创建视图语法
CREATE VIEW 视图名称 [(列名列表)] AS 查询语句;
(1)普通多表查询,查询城市和所属国家
SELECT
c1.id,
c1.city_name,
c2.country_name
FROM
city c1,
country c2
WHERE
c1.cid=c2.id;
(2)创建一个视图,将查询出来的结果保存到这张虚拟表中
经常需要查询这样的数据,就可以创建一个视图
CREATE VIEW city_country (city_id,city_name,country_name) AS
SELECT
c1.id,
c1.city_name,
c2.country_name
FROM
city c1,
country c2
WHERE
c1.cid=c2.id;
效果如下:
视图的查询
与正常的数据表的查询类似!
语法
SELECT * FROM 视图名称;
查询视图基本演示
(1)查询视图。查询这张虚拟表,就等效于查询城市和所属国家
SELECT * FROM city_country;
(2)查询所有数据表,视图也会查询出来
SHOW TABLES;
(3)查询视图创建
SHOW CREATE VIEW city_country;
视图的修改
修改视图表中的数据
UPDATE 视图名称 SET 列名=值 WHERE 条件;
(1)修改视图表中的城市名称北京为北京市
UPDATE city_country SET city_name='北京市' WHERE city_name='北京';
(2)查询视图与city表
SELECT * FROM city_country;
SELECT * FROM city;
显然修改视图的时候,实际表的数据也修改了!
修改视图表结构
ALTER VIEW 视图名称 [(列名列表)] AS 查询语句;
(1)修改视图2的列名city_id为id
ALTER VIEW
city_country (id,city_name,country_name)
AS
SELECT c1.id,c1.city_name,c2.country_name
FROM city c1,country c2
WHERE c1.cid=c2.id;
显然之前的city_id已经被修改为id了
SELECT * FROM city_country;
删除视图
DROP VIEW [IF EXISTS] 视图名称;
DROP VIEW IF EXISTS city_country;
总结
视图是一种虚拟存在的数据表
这个虚拟的表并不在数据库中实际存在
说白了,视图就是将一条SELECT查询语句的结果封装到了一个虚拟表中,所以我们在创建视图的时候,工作重心就要放在这条SELECT查询语句上
视图的好处:简单、安全、数据独立