|
什么是视图
1. 视图是一种虚拟表。
2. 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。
3. 向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
4. 视图向用户提供基表数据的另一种表现形式
视图的作用
权限控制时可以使用
- 比如,某几个列可以运行用户查询,其他列不允许,可以开通视图 查询特定的列, 起到权限控制的作用
简化复杂的多表查询
- 视图本身就是一条查询SQL,我们可以将一次复杂的查询 构建成一张视图, 用户只要查询视图就可以获取想要得到的信息(不需要再编写复杂的SQL)
- 视图主要就是为了简化多表的查询
视图的使用
数据准备
#分类表 (一方 主表)
CREATE TABLE category
(
cid VARCHAR(32) PRIMARY KEY,
cname VARCHAR(50)
);
#商品表 (多方 从表)
CREATE TABLE products
(
pid VARCHAR(32) PRIMARY KEY,
pname VARCHAR(50),
price INT,
flag VARCHAR(2), #是否上架标记为:1表示上架、0表示下架
category_id VARCHAR(32),
-- 添加外键约束
FOREIGN KEY (category_id) REFERENCES category (cid)
);
INSERT INTO category(cid, cname)
VALUES ('c001', '家电');
INSERT INTO category(cid, cname)
VALUES ('c002', '鞋服');
INSERT INTO category(cid, cname)
VALUES ('c003', '化妆品');
INSERT INTO category(cid, cname)
VALUES ('c004', '汽车');
#商品数据
INSERT INTO products(pid, pname, price, flag, category_id)
VALUES ('p001', '小米电视机', 5000, '1', 'c001');
INSERT INTO products(pid, pname, price, flag, category_id)
VALUES ('p002', '格力空调', 3000, '1', 'c001');
INSERT INTO products(pid, pname, price, flag, category_id)
VALUES ('p003', '美的冰箱', 4500, '1', 'c001');
INSERT INTO products (pid, pname, price, flag, category_id)
VALUES ('p004', '篮球鞋', 800, '1', 'c002');
INSERT INTO products (pid, pname, price, flag, category_id)
VALUES ('p005', '运动裤', 200, '1', 'c002');
INSERT INTO products (pid, pname, price, flag, category_id)
VALUES ('p006', 'T恤', 300, '1', 'c002');
INSERT INTO products (pid, pname, price, flag, category_id)
VALUES ('p007', '冲锋衣', 2000, '1', 'c002');
INSERT INTO products (pid, pname, price, flag, category_id)
VALUES ('p008', '神仙水', 800, '1', 'c003');
INSERT INTO products (pid, pname, price, flag, category_id)
VALUES ('p009', '大宝', 200, '1', 'c003');创建视图
create view 视图名 [column_list] as select语句;
view: 表示视图
column_list: 可选参数, 表示属性清单, 指定视图中各个属性的名称, 默认情况下, 与
SELECT语句中查询的属性相同as : 表示视图要执行的操作
select语句: 向视图提供数据内容创建一张视图
#1. 先编写查询语句
#查询所有商品 和 商品的对应分类信息
SELECT * FROM products p LEFT JOIN
category c ON p.`category_id` =
c.`cid`;
#2.基于上面的查询语句,创建一张视图CREATE VIEW products_category_view
AS SELECT * FROM products p LEFT JOIN category c ON p.`category_id` = c.`cid`;

查询视图 ,当做一张只读的表操作就可以
SELECT * FROM products_category_view;

通过视图进行查询
需求1: 查询各个分类下的商品平均价格
#通过 多表查询
SELECT
cname AS '分类名称', AVG(p.`price`) AS '平均价格'
FROM products p LEFT JOIN category c ON p.`category_id` = c.`cid` GROUP BY c.`cname`;
# 通过视图查询 可以省略连表的操作
SELECT
cname AS '分类名称', AVG(price) AS '平均价格'
FROM products_category_view GROUP BY cname;

需求2: 查询鞋服分类下最贵的商品的全部信息
#通过连表查询
#1.先求出鞋服分类下的最高商品价格SELECT
MAX(price) AS maxPrice FROM
products p LEFT JOIN
category c ON p.`category_id` = c.`cid`
WHERE
c.`cname` = '鞋服'
#2.将上面的查询 作为条件使用
SELECT * FROM products p LEFT JOIN
category c ON p.`category_id` = c.`cid`
WHERE
c.`cname` = '鞋服' AND p.`price` =
(SELECT
MAX(price) AS maxPrice FROM
products p LEFT JOIN
category c ON p.`category_id` = c.`cid`
WHERE
c.`cname` = '鞋服');
#通过视图查询
SELECT * FROM products_category_view pcv WHERE pcv.`cname` = '鞋服'
AND pcv.`price` = (SELECT MAX(price) FROM products_category_view WHERE cname = '鞋服')

视图与表的区别
- 视图是建立在表的基础上,表存储数据库中的数据,而视图只是做一个数据的展示
- 通过视图不能改变表中数据(一般情况下视图中的数据都是表中的列 经过计算得到的结果, 不允许更新)
- 删除视图,表不受影响,而删除表,视图不再起作用
|
|