SQL 進階指南:視圖的創建與使用(視圖語法 / 作用 / 權限控制)

在 SQL 操作中,你是否遇到過 “頻繁查詢多表關聯的固定結果”“不想讓他人看到表中的敏感字段” 這類問題?比如 “每周都要查‘技術部員工的姓名、職位、薪資’”,每次都寫多表關聯語句很麻煩;又比如 “給實習生開放數據查詢權限,但不能讓他們看到員工的身份證號、手機號”。這時候,視圖(View) 就是解決這些問題的高效工具。今天我們用 “企業員工信息表” 和 “部門表” 為案例,從零學會視圖的創建、使用與權限控制,代碼可直接復制運行。

我整理了一些學習資料,包含專業、考試、課程等資料,還有游戲和軟件的合集。

學習資料合集文檔https://www.kdocs.cn/l/cjchDXwklk1B

一、先搞懂:什么是視圖?

簡單來說,視圖就是 “一張虛擬的表”—— 它不是真實存儲數據的表,而是由一個 SQL 查詢語句(比如多表關聯查詢、字段篩選查詢)定義的 “結果集”。我們可以像操作普通表一樣查詢視圖,但視圖的底層數據還是來自原表:

  • 原表數據更新時,視圖的查詢結果也會同步更新;
  • 視圖本身不存儲數據,只保存定義它的 SQL 語句。

核心價值:簡化復雜查詢、控制數據訪問權限、保證數據一致性。

準備案例數據:員工表與部門表

為了體現視圖的作用,我們創建兩張關聯表:“員工表(employee)” 和 “部門表(department)”,包含敏感字段(如身份證號、手機號)和關聯字段(部門 ID),代碼可直接運行:

-- 1. 創建部門表(存儲部門信息)
CREATE TABLE department (dept_id INT PRIMARY KEY,  -- 部門ID(主鍵)dept_name VARCHAR(20) NOT NULL,  -- 部門名稱(如技術部、銷售部)dept_location VARCHAR(30) NOT NULL  -- 部門位置(如1號樓3層)
);-- 2. 創建員工表(存儲員工信息,關聯部門表)
CREATE TABLE employee (emp_id INT PRIMARY KEY AUTO_INCREMENT,  -- 員工ID(自增主鍵)emp_name VARCHAR(20) NOT NULL,  -- 員工姓名dept_id INT NOT NULL,  -- 部門ID(關聯部門表)position VARCHAR(20) NOT NULL,  -- 職位(如工程師、經理)salary DECIMAL(10,2) NOT NULL,  -- 月薪id_card CHAR(18) NOT NULL,  -- 身份證號(敏感字段)phone CHAR(11) NOT NULL,  -- 手機號(敏感字段)hire_date DATE NOT NULL,  -- 入職日期-- 外鍵約束:確保員工的部門ID在部門表中存在FOREIGN KEY (dept_id) REFERENCES department(dept_id)
);-- 3. 插入部門數據
INSERT INTO department (dept_id, dept_name, dept_location)
VALUES
(101, '技術部', '1號樓3層'),
(102, '銷售部', '1號樓5層'),
(103, '人事部', '2號樓2層');-- 4. 插入員工數據(包含3個部門的員工,含敏感字段)
INSERT INTO employee (emp_name, dept_id, position, salary, id_card, phone, hire_date)
VALUES
('張三', 101, '后端工程師', 15000.00, '110101199501011234', '13812345678', '2020-03-15'),
('李四', 101, '前端工程師', 14000.00, '110101199602022345', '13987654321', '2021-05-20'),
('王五', 102, '銷售經理', 18000.00, '110101199303033456', '13711112222', '2019-01-10'),
('趙六', 102, '銷售員', 12000.00, '110101199704044567', '13633334444', '2022-07-05'),
('孫七', 103, '人事專員', 10000.00, '110101199805055678', '13555556666', '2023-02-28'),
('周八', 103, '招聘主管', 13000.00, '110101199406066789', '13477778888', '2021-09-12');-- 查看原表數據(確認插入成功)
SELECT * FROM department;
SELECT * FROM employee LIMIT 3;

原表數據示例(員工表):

emp_id

emp_name

dept_id

position

salary

id_card

phone

hire_date

1

張三

101

后端工程師

15000.00

110101199501011234

13812345678

2020-03-15

2

李四

101

前端工程師

14000.00

110101199602022345

13987654321

2021-05-20

3

王五

102

銷售經理

18000.00

110101199303033456

13711112222

2019-01-10

二、視圖的核心操作:創建、查詢、修改、刪除

視圖的操作語法簡單,核心圍繞 “創建視圖(CREATE VIEW)” 和 “使用視圖(SELECT)”,我們逐個講解。

1. 創建視圖(CREATE VIEW):核心語法

語法:

CREATE VIEW 視圖名 AS 定義視圖的SQL查詢語句;

場景 1:創建 “簡化多表關聯” 的視圖

需求:頻繁需要 “查詢員工姓名、部門名稱、職位、薪資、入職日期”,這個需求需要關聯員工表和部門表(employee JOIN department),每次寫關聯語句很麻煩,所以創建一個視圖來簡化操作。

代碼:

-- 創建視圖:員工-部門關聯視圖(簡化多表查詢)
CREATE VIEW emp_dept_view AS
SELECT e.emp_name AS 員工姓名,d.dept_name AS 部門名稱,e.position AS 職位,e.salary AS 月薪,e.hire_date AS 入職日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id;  -- 多表關聯邏輯封裝在視圖中
場景 2:創建 “隱藏敏感字段” 的視圖

需求:給實習生開放數據查詢權限,但不能讓他們看到員工的身份證號、手機號,所以創建一個不含敏感字段的視圖。

代碼:

-- 創建視圖:員工信息公開視圖(隱藏敏感字段)
CREATE VIEW emp_public_view AS
SELECT emp_name AS 員工姓名,position AS 職位,salary AS 月薪,hire_date AS 入職日期
FROM employee;  -- 只包含非敏感字段
場景 3:創建 “篩選特定數據” 的視圖

需求:經常需要查詢 “技術部的員工信息”,所以創建一個只包含技術部員工的視圖。

代碼:

-- 創建視圖:技術部員工視圖(篩選特定部門數據)
CREATE VIEW tech_dept_emp_view AS
SELECT e.emp_name AS 員工姓名,e.position AS 職位,e.salary AS 月薪,e.hire_date AS 入職日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id
WHERE d.dept_name = '技術部';  -- 篩選條件封裝在視圖中

2. 查詢視圖:像查普通表一樣簡單

創建視圖后,查詢視圖的語法和查詢普通表完全一致,不用再寫復雜的關聯或篩選邏輯。

例子 1:查詢 “員工 - 部門關聯視圖”

需求:查看所有員工的姓名、部門、職位、薪資。

代碼:

-- 查詢視圖:直接用SELECT查視圖,無需多表關聯
SELECT * FROM emp_dept_view;

運行結果

員工姓名

部門名稱

職位

月薪

入職日期

張三

技術部

后端工程師

15000.00

2020-03-15

李四

技術部

前端工程師

14000.00

2021-05-20

王五

銷售部

銷售經理

18000.00

2019-01-10

趙六

銷售部

銷售員

12000.00

2022-07-05

孫七

人事部

人事專員

10000.00

2023-02-28

周八

人事部

招聘主管

13000.00

2021-09-12

例子 2:查詢 “技術部員工視圖” 并篩選

需求:查看技術部入職時間在 2021 年之后的員工。

代碼:

-- 查詢視圖時,還能加WHERE篩選條件
SELECT * FROM tech_dept_emp_view
WHERE hire_date >= '2021-01-01';

運行結果

員工姓名

職位

月薪

入職日期

李四

前端工程師

14000.00

2021-05-20

3. 修改視圖:兩種方式(ALTER VIEW / CREATE OR REPLACE VIEW)

如果需要修改視圖的定義(比如添加字段、修改篩選條件),有兩種常用方式:

方式 1:用 ALTER VIEW 修改

需求:給 “員工 - 部門關聯視圖” 添加 “部門位置” 字段。

代碼:

-- ALTER VIEW修改視圖定義
ALTER VIEW emp_dept_view AS
SELECT e.emp_name AS 員工姓名,d.dept_name AS 部門名稱,d.dept_location AS 部門位置,  -- 新增字段e.position AS 職位,e.salary AS 月薪,e.hire_date AS 入職日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id;-- 驗證修改結果
SELECT 員工姓名, 部門名稱, 部門位置 FROM emp_dept_view;
方式 2:用 CREATE OR REPLACE VIEW 重建(推薦)

如果視圖不存在,就創建;如果已存在,就覆蓋修改,避免 “視圖已存在” 的報錯。

需求:修改 “技術部員工視圖”,增加 “部門位置” 字段。

代碼:

-- CREATE OR REPLACE VIEW:存在則修改,不存在則創建
CREATE OR REPLACE VIEW tech_dept_emp_view AS
SELECT e.emp_name AS 員工姓名,d.dept_name AS 部門名稱,d.dept_location AS 部門位置,  -- 新增字段e.position AS 職位,e.salary AS 月薪,e.hire_date AS 入職日期
FROM employee e
JOIN department d ON e.dept_id = d.dept_id
WHERE d.dept_name = '技術部';-- 驗證修改結果
SELECT * FROM tech_dept_emp_view;

4. 刪除視圖:DROP VIEW

如果視圖不再需要,用DROP VIEW刪除,不會影響原表數據(因為視圖是虛擬表)。

代碼:

-- 刪除“員工信息公開視圖”
DROP VIEW IF EXISTS emp_public_view;  -- IF EXISTS:避免“視圖不存在”的報錯-- 驗證刪除結果(會提示“表不存在”,說明刪除成功)
SELECT * FROM emp_public_view;

三、視圖的核心作用:3 個實用價值

通過前面的案例,我們能直觀感受到視圖的作用,這里總結 3 個核心價值,幫你判斷什么時候該用視圖:

1. 簡化復雜查詢,提高效率

把多表關聯、復雜篩選的邏輯封裝在視圖中,后續查詢只需要SELECT * FROM 視圖名,不用重復寫長 SQL。比如前面的 “員工 - 部門關聯視圖”,把JOIN邏輯封裝后,每次查詢都能節省寫關聯語句的時間。

2. 控制數據權限,保護敏感信息

通過視圖隱藏原表中的敏感字段(如身份證號、手機號、薪資),給不同角色開放不同視圖的權限,實現 “數據隔離”。比如給實習生開放 “emp_public_view”(不含敏感字段),給部門經理開放 “emp_dept_view”(含部門信息),保證數據安全。

3. 保證數據查詢的一致性

如果多個場景需要用相同的查詢邏輯(比如 “查詢月薪大于 12000 的員工”),把這個邏輯封裝在視圖中,所有場景都查這個視圖,避免不同人寫的 SQL 邏輯不一致導致結果差異。比如創建 “high_salary_emp_view”(篩選月薪 > 12000 的員工),所有人都查這個視圖,確保結果統一。

四、視圖的權限控制:給不同角色分配權限

在實際工作中,視圖的權限控制通常和 “數據庫用戶” 結合 —— 創建不同的數據庫用戶,給他們分配不同視圖的查詢權限,實現 “按需授權”。這里以 MySQL 為例,講解基礎的權限分配操作。

1. 創建數據庫用戶(給實習生創建用戶)

-- 創建用戶:用戶名=intern,密碼=123456(僅本地訪問,@'localhost'表示本地)
CREATE USER IF NOT EXISTS 'intern'@'localhost' IDENTIFIED BY '123456';

2. 給用戶分配視圖的查詢權限(只能查,不能改)

需求:給實習生用戶(intern)分配 “tech_dept_emp_view” 和 “emp_dept_view” 的查詢權限(SELECT權限),但不能分配原表的權限,也不能分配修改視圖的權限。

代碼:

-- 給intern用戶分配兩個視圖的SELECT權限
GRANT SELECT ON student_management.tech_dept_emp_view TO 'intern'@'localhost';
GRANT SELECT ON student_management.emp_dept_view TO 'intern'@'localhost';-- 刷新權限,讓授權生效
FLUSH PRIVILEGES;

3. 驗證權限(切換到 intern 用戶)

用 intern 用戶登錄數據庫后,只能查詢被授權的視圖,不能查詢原表(如 employee、department),也不能修改視圖:

-- 能查詢授權的視圖(正常返回結果)
SELECT * FROM tech_dept_emp_view;-- 不能查詢原表(會提示“拒絕訪問”)
SELECT * FROM employee;-- 不能修改視圖(會提示“沒有權限”)
ALTER VIEW tech_dept_emp_view AS SELECT * FROM employee;

4. 收回權限(如需取消授權)

如果實習生離職,用REVOKE收回權限:

-- 收回intern用戶對tech_dept_emp_view的SELECT權限
REVOKE SELECT ON student_management.tech_dept_emp_view FROM 'intern'@'localhost';-- 刷新權限
FLUSH PRIVILEGES;

五、視圖的使用注意事項:3 個避坑點

  1. 視圖不能替代原表:視圖是基于原表的虛擬表,不能存儲數據,修改視圖的查詢結果(如UPDATE 視圖名 SET 字段=值)會同步修改原表數據(需謹慎!),建議盡量只用于查詢,不用于修改。
  1. 復雜視圖可能影響性能:如果視圖包含多層嵌套(視圖基于另一個視圖創建)、大量JOIN或GROUP BY,查詢視圖時可能會變慢,建議避免過度嵌套

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95929.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【全部更新完畢】2025數學建模國賽C題思路代碼文章高教社杯全國大學生數學建模-NIPT 的時點選擇與胎兒的異常判定

B題全部更新完畢 包含完整的文章全部問題的代碼、結果、圖表 完整內容請看文末最后的推廣群NIPT 的時點選擇與胎兒的異常判定 摘要 在問題一中,我們以無創產前檢測(NIPT)數據為研究對象,圍繞“胎兒 Y 染色體濃度”(記為 (V)) 隨孕…

Redis(43)Redis哨兵(Sentinel)是什么?

Redis Sentinel(哨兵)是一種用于管理 Redis 實例的高可用性解決方案。它提供了監控、通知和自動故障轉移等功能,確保 Redis 服務在發生故障時能夠自動恢復,提供高可用性和可靠性。以下是詳細介紹 Redis Sentinel 的功能及其代碼示…

蓓韻安禧DHA純植物藻油純凈安全零添加守護母嬰健康

在母嬰健康領域,選擇合適的營養補充品至關重要。純植物藻油DHA源自純凈藻類,有效規避了海洋重金屬污染的風險,確保安全無隱患。配方堅持零添加香精、色素和防腐劑,避免不必要的化學物質攝入,讓媽媽和寶寶更安心。同時&…

釘釘 AI 深度賦能制造業 LTC 全流程:以釘釘宜搭、Teambition 為例

制造業 LTC 流程痛點剖析?在制造業,線索到現金(LTC,Lead to Cash)的全流程包含從潛在客戶線索的發現、商機培育、銷售轉化、訂單執行到最終收款的一系列復雜環節。傳統制造業在這一流程中面臨諸多挑戰:客戶需求的多樣…

理解UE4中C++17的...符號及enable_if_t的用法及SFINAE思想

下面是一段C17的代碼&#xff1a;//函數1&#xff1a;template <typename... BufferTypes,std::enable_if_t<std::conjunction<CanAppendBufferType<std::decay_t<BufferTypes>>...>::value> * nullptr> inline explicit FCompositeBuffer(Buff…

安全419正式公布《甲方安全建設精品采購指南》案例首推運營商行業數據安全核心推薦廠商

在數字經濟加速滲透與《網絡數據安全管理條例》全面實施的雙重背景下&#xff0c;運營商作為數據要素流通的核心樞紐&#xff0c;其安全防護體系建設已成為數字基礎設施保障的關鍵環節。近日&#xff0c;安全 419 正式公布《甲方安全建設精品采購指南》&#xff0c;從近 300 個…

基礎詞根-匯總

ros rus粗糙 ris cos cus cis切lite文字 late面 側面ven 來 cess走/agdotect 覆蓋 covercele 聚集 加速 gre 聚集&#xff0c;accumu聚集gress 抵達 靠近&#xff0c;aggressive侵略性humor humir 大地 土地chron 時間 time&#xff0c;宇宙的宙lumi 光lightviv vil volun vot/…

JVM中常見的GC垃圾收集器

文章目錄 目錄 1. Serial GC&#xff08;串行收集器&#xff09; 2. Parallel GC&#xff08;并行收集器&#xff09; 3. CMS&#xff08;Concurrent Mark-Sweep&#xff0c;并發標記 - 清除&#xff09; 4. G1&#xff08;Garbage-First&#xff0c;垃圾優先&#xff09; …

嵌入式C語言之鏈表冒泡排序

鏈表冒泡排序一是可以交換指針域的值&#xff0c;二是可以交換指針typedef struct st_node{int score;struce st_node *next;}Node,*LinkList;LinkList createList(){Node *head (Node *)malloc(sizeof(Node));if(NULL head){printf("內存分配失敗!"):return NULL;…

遠場代碼學習_FDTD_farfield

項目4.2 farfield3d - Script command在3D模擬中將給定的功率或場剖面監視器或直線數據集投射到遠場。返回電場強度|E| 2。語法描述 out farfield3d("mname",f, na, nb, illumination, periodsa, periodsb, index, direction)&#xff1b; 將給定的功率或場分布監…

Adobe Illustrator(Ai) 2022安裝教程與下載地址

Adobe Illustrator&#xff08;通常簡稱 AI&#xff09;是一款由 Adobe 公司開發的、基于矢量圖形的專業設計軟件。它與 Photoshop&#xff08;基于位圖/像素&#xff09;和 InDesign&#xff08;專注于頁面排版&#xff09;并稱為數字創意領域的“三巨頭”&#xff0c;是平面設…

小迪web自用筆記27

框架就是一些封裝好的東西*上節課補&#xff1a;JS負責美化框架的&#xff08;發送HTTP請求前端&#xff0c;js相當于前端并且附加上一些連接后端的功能。&#xff09;&#xff0c;JAVA是后端。PHPthink&#xff08;用的最多的框架&#xff09;URL&#xff1a;原&#xff1a;ht…

創建阿里云ECS實例操作(免費試用版)

目錄 1、進入阿里云ECS控制臺 2、創建ECS實例 3、重置實例密碼 4、遠程登陸實例 5、查看ECS信息 6、安裝apache服務 7、端口規則設置 8、訪問測試 9、釋放實例 1、進入阿里云ECS控制臺 https://www.aliyun.com/ 2、創建ECS實例 3、重置實例密碼 4、遠程登陸實例 5、查…

JVM相關 4|JVM調優與常見參數(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必會知識點匯總

目錄&#xff1a;&#x1f9e0; 一、JVM調優目標1. 調優核心目標2. 調優常見問題&#x1f9e9; 二、JVM調優核心參數詳解1. 堆內存相關參數2. 垃圾回收器相關參數3. GC日志與性能監控4. 元空間&#xff08;Metaspace&#xff09;調優5. 棧內存調優6. 其他關鍵參數&#x1f4cc;…

HOT100--Day13--104. 二叉樹的最大深度,226. 翻轉二叉樹,101. 對稱二叉樹

HOT100–Day13–104. 二叉樹的最大深度&#xff0c;226. 翻轉二叉樹&#xff0c;101. 對稱二叉樹 每日刷題系列。今天的題目是《力扣HOT100》題單。 題目類型&#xff1a;二叉樹。 關鍵&#xff1a;要深刻理解《遞歸》 104. 二叉樹的最大深度 方法&#xff1a;遞歸 思路&…

Maven 從 0 到 1:安裝、配置與依賴管理一站式指南

Maven 從 0 到 1&#xff1a;安裝、配置與依賴管理一站式指南Maven 從 0 到 1&#xff1a;安裝、配置與依賴管理一站式指南一、Maven 是什么&#xff1f;二、核心概念&#xff1a;POM三、Maven 是如何工作的&#xff1f;—— 倉庫機制四、安裝Maven五、在 IntelliJ IDEA 里配置…

k8s,v1.30.4,安裝使用docker

一.前置概念Docker 與 Kubernetes 共用同一個 containerd 進程 時&#xff0c;只要滿足以下 3 個條件&#xff0c;就不會沖突&#xff1a;檢查點要求原因cgroup-driverkubelet 與 containerd 必須同為 systemd二者不一致會導致 Pod 無法調度Unix socketkubelet 指向 /run/conta…

開源AI智能名片鏈動2+1模式S2B2C商城小程序服務提升復購率和轉介紹率的研究

摘要&#xff1a;本文聚焦于開源AI智能名片鏈動21模式S2B2C商城小程序在提升客戶復購率和轉介紹率方面的作用。服務對于促進客戶復購和轉介紹的重要性不言而喻&#xff0c;維護老客戶的成本遠低于開發新客戶&#xff0c;微商通過推出各項服務來贏得客戶忠誠。本文深入探討開源A…

[數據結構] ArrayList(順序表)與LinkedList(鏈表)

目錄 1.List 1.1 什么是List 1.2 常用的方法 1.3 List的使用 2. 線性表 3. ArrayList 類(順序表) 3.1 順序表定義 3.2 ArrayList鏈表的功能模擬實現 3.3 ArrayList簡介 3.4 ArrayList的構造方法 3.5 ArrayList的遍歷 3.5 ArrayList的具體使用實例 3.5.1 楊輝三角 …

Hive使用Tez引擎出現OOM的解決方法

環境是Hive以Tez作為引擎&#xff0c;然后使用客戶端&#xff08;比如DataGrip&#xff09;連接Hive運行SQL查詢&#xff0c;運行過程中報錯信息如下&#xff1a;java.lang.OutOfMemoryError: Java heap space…連接工具以DataGrip為例&#xff0c;解決辦法如下&#xff1a; --…