视图是一种虚拟表,其内容由一个查询定义。它提供了一种将复杂查询逻辑封装成可重用的结构的方式。
使用 CREATE VIEW
语句可以创建视图。例如:
CREATE VIEW my_view AS
SELECT column1, column2
FROM my_table
WHERE condition;
使用 SELECT
语句可以查询视图。例如:
SELECT * FROM my_view;
视图可以被更新,但有一些限制。一般来说,只有满足特定条件的视图才能被更新,例如视图中没有使用 GROUP BY
或 DISTINCT
。
使用 DROP VIEW
语句可以删除视图。例如:
DROP VIEW my_view;
视图可以嵌套,即在一个视图中引用另一个视图。
视图的访问权限和表一样,可以通过 GRANT
和 REVOKE
语句进行管理。
可以通过 SHOW CREATE VIEW
或查询 information_schema
数据库中的相关表,如 VIEWS
表,来查看视图的定义和信息。
关系型数据库视图主要用于查询和简化数据库的使用,而数据仓库中的子图则更侧重于优化数据仓库的性能,支持复杂的分析和报告需求。两者在设计和使用上有不同的考虑因素,根据具体业务需求和数据特点选择合适的技术。
MySQL 8.1 Windows 11
DROP DATABASE IF EXISTS shop;
CREATE DATABASE shop;
USE shop;
CREATE TABLE goods (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '商品id',
category_id INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '分类id',
name VARCHAR(120) NOT NULL DEFAULT '' COMMENT '名称',
keyword VARCHAR(255) NOT NULL DEFAULT '' COMMENT '关键词',
content TEXT NOT NULL COMMENT '详情',
price DECIMAL(10, 2) UNSIGNED NOT NULL DEFAULT 0 COMMENT '价格',
stock INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '库存',
score DECIMAL(3, 2) UNSIGNED NOT NULL DEFAULT 0 COMMENT '评分',
comment_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '评论计数'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO goods (id, category_id, name, keyword, content,price,stock, score, comment_count) VALUES
(1, 3, '2B铅笔', '文具', '考试专用', 0.5, 500, 4.9, 40000),
(2, 3, '钢笔', '文具', '练字必不可少', 15, 300, 3.9, 500),
(3, 3, '碳素笔', '文具', '平时使用', 1, 500, 5, 98000),
(4, 12, '超薄笔记本', '电子产品', '轻小便携', 5999, 0, 2.5, 200),
(5, 6, '智能手机', '电子产品', '人人必备', 1999, 0, 5, 98000),
(6, 8, '桌面音箱', '电子产品', '扩音装备', 69, 750, 4.5, 1000),
(7, 9, '头戴耳机', '电子产品', '独享个人世界', 109, 0, 3.9, 500),
(8, 10, '办公电脑', '电子产品', '适合办公', 2000, 0, 4.8, 6000),
(9, 15, '收腰风衣', '服装', '春节潮流单品', 299, 0, 4.9, 40000),
(10, 16, '薄毛衣', '服装', '居家旅行必备', 48, 0, 4.8, 98000);
CREATE TABLE category (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '分类id',
parent_id INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '上级分类id',
name VARCHAR(100) NOT NULL DEFAULT '' COMMENT '名称',
sort INT NOT NULL DEFAULT 0 COMMENT '排序',
is_show TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否显示',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT NULL COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO category (id, parent_id, name) VALUES
(1, 0, '办公'), (2, 1, '耗材'), (3, 2, '文具'),
(4, 0, '电子产品'), (5, 4, '通讯'), (6, 5, '手机'),
(7, 4, '影音'), (8, 7, '音箱'), (9, 7, '耳机'),
(10, 4, '电脑'), (11, 10, '台式电脑'), (12, 10, '笔记本'),
(13, 0, '服装'), (14, 13, '女装'), (15, 14, '风衣'), (16, 14, '毛衣');
create view gc_views as
select goods.id, goods.name,category.name as category_name
from goods
join category on goods.category_id = category.id;
ALTER VIEW gc_views AS
SELECT id, name
FROM goods;
select * from gc_views;
desc gc_views
show create table gc_views
CREATE OR REPLACE VIEW gc_views AS
SELECT goods.id, goods.name FROM goods;
INSERT INTO goods (id,name)VALUES (11, '图书');
INSERT INTO goods (id, name, content)
VALUES (11, '图书', 'hahaha');
UPDATE gc_views
SET name = '家电'
WHERE id = 11;
DELETE FROM gc_views
WHERE id = 11;
CREATE VIEW v1 AS
SELECT id, name
FROM category
WHERE id < 30;
CREATE VIEW v2 AS
SELECT id, name
FROM v1
WHERE id > 20;