文章目錄
- 1. MySQL 中的視圖(View)簡介
- 1.1 視圖的基本概念:
- 1.2 創建視圖:
- 1.3 查看視圖:
- 1.4 更新視圖:
- 1.5 刪除視圖:
- 1.6 視圖的嵌套:
- 1.7 權限管理:
- 1.8 檢查視圖信息:
- 2 關系型數據庫視圖和數據倉庫中子圖(Subset)的區別:
- 2.1 關系型數據庫視圖:
- 2.2 數據倉庫中的子圖:
- 3 MySQL視圖實驗
- 3.1 數據準備
- 3.1.1 開發環境
- 3.1.2 創建數據庫
- 3.1.3 創建goods表
- 3.1.4 插入goods表
- 3.1.5 創建category表
- 3.1.6 插入category表
- 3.2 創建視圖
- 3.3 修改視圖列
- 3.4 查看視圖相關狀態
- 3.5 另一種創建視圖的方式
- 3.6 向視圖源表插入數據
- 3.7 通過視圖更新數據
- 3.8 刪除視圖中數據
- 3.9 創建復雜篩選的視圖
1. MySQL 中的視圖(View)簡介
1.1 視圖的基本概念:
視圖是一種虛擬表,其內容由一個查詢定義。它提供了一種將復雜查詢邏輯封裝成可重用的結構的方式。
1.2 創建視圖:
使用 CREATE VIEW
語句可以創建視圖。例如:
CREATE VIEW my_view AS
SELECT column1, column2
FROM my_table
WHERE condition;
1.3 查看視圖:
使用 SELECT
語句可以查詢視圖。例如:
SELECT * FROM my_view;
1.4 更新視圖:
視圖可以被更新,但有一些限制。一般來說,只有滿足特定條件的視圖才能被更新,例如視圖中沒有使用 GROUP BY
或 DISTINCT
。
1.5 刪除視圖:
使用 DROP VIEW
語句可以刪除視圖。例如:
DROP VIEW my_view;
1.6 視圖的嵌套:
視圖可以嵌套,即在一個視圖中引用另一個視圖。
1.7 權限管理:
視圖的訪問權限和表一樣,可以通過 GRANT
和 REVOKE
語句進行管理。
1.8 檢查視圖信息:
可以通過 SHOW CREATE VIEW
或查詢 information_schema
數據庫中的相關表,如 VIEWS
表,來查看視圖的定義和信息。
2 關系型數據庫視圖和數據倉庫中子圖(Subset)的區別:
2.1 關系型數據庫視圖:
-
定義: 視圖是一個虛擬表,其內容是基于一個或多個基本表的查詢結果。視圖不存儲實際的數據,而是根據定義的查詢動態生成結果。
-
用途: 視圖通常用于簡化復雜查詢、提供安全性、隱藏底層表結構、以及在應用程序中重用查詢邏輯。
-
實時性: 視圖是實時的,即每次查詢都基于底層表的當前狀態生成結果。因此,當基礎表的數據發生變化時,視圖的結果也會隨之變化。
-
存儲: 視圖不存儲實際數據,它只存儲查詢定義。數據實際上仍存儲在底層的表中。
2.2 數據倉庫中的子圖:
-
定義: 在數據倉庫中,子圖通常指的是一個包含了數據倉庫中部分數據的子集。這個子集可能是根據某些特定條件(例如,特定時間范圍、特定業務區域等)而選擇的。
-
用途: 子圖用于分割大型數據倉庫的數據,以便更快地進行查詢和分析。它可以是一個按照某個維度劃分的區域,也可以是一個按照時間劃分的時間段。
-
歷史數據: 數據倉庫中的子圖可能包含歷史數據的快照,允許分析歷史趨勢和模式。
-
聚合: 子圖中的數據可能是經過預先計算或聚合的,以支持更快速的查詢和報告生成。
-
周期性更新: 數據倉庫中的子圖可能不是實時更新的,而是按照某個周期進行更新,以保持高性能查詢的同時降低數據倉庫的負載。
關系型數據庫視圖主要用于查詢和簡化數據庫的使用,而數據倉庫中的子圖則更側重于優化數據倉庫的性能,支持復雜的分析和報告需求。兩者在設計和使用上有不同的考慮因素,根據具體業務需求和數據特點選擇合適的技術。
3 MySQL視圖實驗
3.1 數據準備
3.1.1 開發環境
MySQL 8.1
Windows 11
3.1.2 創建數據庫
DROP DATABASE IF EXISTS shop;
CREATE DATABASE shop;
USE shop;
3.1.3 創建goods表
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;
3.1.4 插入goods表
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);
3.1.5 創建category表
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;
3.1.6 插入category表
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, '毛衣');
3.2 創建視圖
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;
3.3 修改視圖列
ALTER VIEW gc_views AS
SELECT id, name
FROM goods;
3.4 查看視圖相關狀態
select * from gc_views;desc gc_viewsshow create table gc_views
3.5 另一種創建視圖的方式
CREATE OR REPLACE VIEW gc_views AS
SELECT goods.id, goods.name FROM goods;
3.6 向視圖源表插入數據
INSERT INTO goods (id,name)VALUES (11, '圖書');INSERT INTO goods (id, name, content)
VALUES (11, '圖書', 'hahaha');
3.7 通過視圖更新數據
UPDATE gc_views
SET name = '家電'
WHERE id = 11;
3.8 刪除視圖中數據
DELETE FROM gc_views
WHERE id = 11;
3.9 創建復雜篩選的視圖
CREATE VIEW v1 AS
SELECT id, name
FROM category
WHERE id < 30;CREATE VIEW v2 AS
SELECT id, name
FROM v1
WHERE id > 20;