1.视图的概念及作用
- 视图是一种虚拟的数据表,并不在数据库中真实存在;
- 视图的作用是将一些复杂的查询语句的结果封装到一个虚拟表中以供后期再次使用;即将SELECT的查询语句封装为一个虚拟表;
- 例如,上一章多表查询的子查询中,被嵌套的语句查询的结果即可以封装为视图。
2.视图的好处
- 简单:使用视图后,这张虚拟表中已经保存的是过滤好的结果,不用关心表的结构、关联条件和筛选条件
- 安全:视图可以设置权限
- 数据独立:视图的结构确定后原表增加列对视图无影响,原表修改列名可以通过修改视图解决
3.视图测试-数据准备
CREATE DATABASE db7;
USE db7;
-- 创建country表
CREATE TABLE country(
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键id
name VARCHAR(20) -- 国家名称
);
-- 插入国家数据
INSERT INTO country VALUES (NULL,'中国'),
(NULL,'美国'),
(NULL,'俄罗斯');
-- 创建city表
CREATE TABLE city(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
cid INT, -- 外键,关联国家的主键id
CONSTRAINT cc_fk1 FOREIGN KEY (cid) REFERENCES country(id)
);
-- 插入城市数据
INSERT INTO city VALUES (NULL,'北京',1),
(NULL,'上海',1),
(NULL,'纽约',2),
(NULL,'旧金山',2),
(NULL,'莫斯科',3),
(NULL,'海参崴',3);
4.创建视图
-- 标准语法
CREATE VIEW 视图名称 [(列名列表)] AS 查询语句;
- 怎样多表查询所有的城市和所属的国家?
-- 查询城市所有信息和其所属国家
SELECT ci.*,co.name
FROM city ci,country co
WHERE ci.cid = co.id;
查询结果:
- 创建视图,并指定列名
-- 查询城市所有信息和其所属国家的结果保存到视图中
CREATE VIEW city_country(city_id,city_name,cid,country) AS
SELECT ci.*,co.name
FROM city ci,country co
WHERE ci.cid = co.id
视图保存在views里:
5.查询视图
-- 标准语法
SELECT * FROM 视图名称;
-- 查询视图。查询这张虚拟表,就等效于查询城市和所属国家
SELECT * FROM city_country;
-- 查询指定列名的视图
SELECT * FROM city_country2;
-- 查询所有数据表,视图也会查询出来
SHOW TABLES;
三条语句结果分别如下:
6.修改视图
6.1修改视图中的数据
-- 标准语法
UPDATE 视图名称 SET 列名=值 WHERE 条件;
-- 修改视图表中的城市名称北京为深圳,注意:视图表数据修改,会自动修改源表中的数据
UPDATE city_country SET city_name='深圳' WHERE city_name='北京';
-- 查询视图
SELECT * FROM city_country;
-- 查询city表,北京 修改为了 深圳
SELECT * FROM city;
6.2修改视图中的结构
-- 标准语法
ALTER VIEW 视图名称 [(列名列表)] AS 查询语句;
例如,将视图第4列的列名由country改为country_name:
-- 修改视图的表结构
ALTER VIEW city_country(city_id,city_name,cid,country_name) AS
SELECT ci.*,co.name
FROM city ci,country co
WHERE ci.cid = co.id;
结果如下:
7.删除视图
- 标准语法
DROP VIEW [IF EXISTS] 视图名称;
-- 删除视图,视图不存在则报错
DROP VIEW city_country;
-- 删除视图时加判断,如果存在则删除,不存在则不删除也不报错
DROP VIEW IF EXISTS city_country;