【MySQL学习】视图 (Views)

目录

一、定义

二、基本语法

1.创建视图

2.查询视图

3.修改视图

4.删除视图

5.查看视图定义

方法一:使用SHOW CREATE VIEW

方法二:查询 INFORMATION_SCHEMA

三、使用场景

场景一:简化复杂查询

场景二:限制数据访问 (只允许用户访问部分数据)

场景三:数据聚合

四、视图的权限管理

1.基本概念

(1)用户

A-创建用户

(2)角色 

A-创建角色

B-授予角色权限

C-撤销角色权限

D-将角色分配给用户

E-角色激活

2.与视图有关的权限类型

3.视图权限的授予与撤销

(1)授予权限

(2)撤销权限

4.综合案例

第一步:创建基础表

第二步:创建不同用途的视图

(1)公共信息视图 (允许所有员工访问)

(2)部门视图 (部门经理专用)

(3)薪资视图(HR专用)

第三步:创建角色并分配权限

第四步:权限验证测试


一、定义

视图(View)是一个虚拟表,它基于一个或多个表的查询结果(SELECT语句)生成。

视图本身不是存储数据,而是存储查询定义,每次使用时动态生成结果。

本质: 可以将视图看作是一个已命名并存储在数据库中的 SELECT 查询

工作方式: 当你查询一个视图时,数据库系统通常会执行存储在该视图定义中的 SELECT 语句,并返回结果集,让你感觉就像在查询一个真实的表。

二、基本语法

1.创建视图

CREATE [OR REPLACE] VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[WITH CHECK OPTION];
CREATE OR REPLACE :如果已存在视图,替换旧视图。
示例:创建一个视图,显示学生表中成绩大于 60 的学生
第一步:准备数据
CREATE TABLE students (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    grade INT
);

INSERT INTO students VALUES 
    (1, 'Alice', 85),
    (2, 'Bob', 55),
    (3, 'Charlie', 92);

第二步:创建视图

CREATE VIEW passing_students AS
SELECT id, name, grade
FROM students
WHERE grade >= 60;

2.查询视图

SELECT * FROM passing_students;

3.修改视图

ALTER VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
[WHERE condition];

示例:修改passing_students视图,显示成绩大于75的学生

ALTER VIEW passing_students AS
SELECT id, name, grade
FROM students
WHERE grade >= 75;

SELECT * FROM passing_students;

4.删除视图

DROP VIEW [IF EXISTS] view_name;

示例:删除passing_students视图

DROP VIEW IF EXISTS passing_students;

5.查看视图定义

方法一:使用SHOW CREATE VIEW

SHOW CREATE VIEW passing_students;

输出视图的CREATE VIEW 语句

方法二:查询 INFORMATION_SCHEMA

SELECT * FROM INFORMATION_SCHEMA.VIEWS 
WHERE TABLE_NAME = 'passing_students';

输出视图的元数据

三、使用场景

场景一:简化复杂查询

假设有 订单 和 客户 表,创建视图显示订单和客户信息
CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    amount DECIMAL(10, 2)
);

INSERT INTO customers VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO orders VALUES (101, 1, 500.00), (102, 2, 300.00);

CREATE VIEW order_details AS
SELECT o.order_id, c.name AS customer_name, o.amount
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;

SELECT * FROM order_details;

有了视图,就不需要每次查看客户和对应的订单信息的时候都要再编写一次代码

场景二:限制数据访问 (只允许用户访问部分数据)

创建视图,仅显示员工表的非敏感信息
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    salary DECIMAL(10, 2),
    ssn VARCHAR(20) 
);

INSERT INTO employees VALUES (1, 'Alice', 50000.00, '123-45-6789');

CREATE VIEW employee_public AS
SELECT id, name
FROM employees;

SELECT * FROM employee_public;

场景三:数据聚合

创建视图,显示每个部门的平均薪资

INSERT INTO employees VALUES 
    (2, 'Bob', 60000.00, '987-65-4321'),
    (3, 'Charlie', 55000.00, '456-78-9012');

ALTER TABLE employees ADD COLUMN department VARCHAR(50);
UPDATE employees SET department = 'HR' WHERE id IN (1, 3);
UPDATE employees SET department = 'IT' WHERE id = 2;

CREATE VIEW dept_avg_salary AS
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

SELECT * FROM dept_avg_salary;

四、视图的权限管理

1.基本概念

权限管理的基础是 用户角色,它们是MySQL中权限分配的对象。

(1)用户

用户是 MySQL 数据库的访问主体,每个用户由  用户名@主机 格式唯一标识。
username@host
host:用户连接的主机,例如localhost(本地连接)或%(允许从任何主机连接)。
A-创建用户
使用  CREATE USER 命令创建用户,并指定密码。
CREATE USER 'username'@'host' IDENTIFIED BY 'password';

示例:

CREATE USER 'AlinJ'@'localhost' IDENTIFIED BY '123456789AlinJ';

(2)角色 

角色是权限的集合,可以分配多个用户,实现批量权限管理。

  • 角色相当于用户,但它不直接登录,而是作为权限的模板。
  • 引入角色是为了简化权限管理,避免为每个用户单独分配权限。
A-创建角色
使用 CREATE ROLE 命令创建角色
CREATE ROLE role_name;

示例:

REVOKE SELECT ON Company.employees TO 'LinJ';
B-授予角色权限
使用 GRANT 命令来分配角色权限。
GRANT privilege_type ON database.object TO 'role_name';

示例:

GRANT SELECT ON Company.employees TO 'LinJ';
C-撤销角色权限
REVOKE privilege_type ON database.object FROM 'role_name';

示例:

REVOKE SELECT ON Company.employees TO 'LinJ';
D-将角色分配给用户
使用 GRANT role_name TO user 将角色分配给用户
CREATE USER 'AlinJ'@'localhost' IDENTIFIED BY '123';
GRANT 'LinJ' TO 'ALinJ'@'localhost';
E-角色激活

默认情况下 ,角色需要手动激活

SET ROLE 'LinJ';

或在登录时自动激活

SET DEFAULT ROLE 'LinJ' TO 'AlinJ'@'localhost';

2.与视图有关的权限类型

【MySQL学习】视图 (Views)_第1张图片

3.视图权限的授予与撤销

(1)授予权限
GRANT SELECT (id) ON db.employee_public TO 'user1'@'localhost';
GRANT privilege_type [(column_list)] ON object_name TO 'user'@'host'
[IDENTIFIED BY 'password']
[WITH GRANT OPTION];
  • privilege_type:权限类型(如SELECT、CREATE VIEW)。
  • column_list :任选,指定列级权限(视图支持列级权限)。
  • object_name:权限对象,格式为database_name.view_name*.*
  • 'user'@'host':目标用户和主机。
  • WITH GRANT OPTION:允许用户将权限授予他人。

示例1:授予查询权限

假设已创建视图employee_public(只包含id和name),为用户user1授予查询权限
GRANT SELECT ON db.employee_public TO 'user1'@'localhost';

验证:

SHOW GRANTS FOR 'user1'@'localhost';

示例2:授予创建视图权限 为用户user2授予在db数据库中创建视图的权限

GRANT CREATE VIEW ON db.* TO 'user2'@'localhost'
IDENTIFIED BY '123456';

示例3:授予列级权限 仅允许user1查询employee的id列

GRANT SELECT (id) ON db.employee TO 'user1'@'localhost';
(2)撤销权限
REVOKE privilege_type [(column_list)] ON object_name FROM 'user'@'host';

示例1:取消查询权限 取消user1对employee_public的查询权限

REVOKE SELECT ON mydb.employee_public FROM 'user1'@'localhost';

4.综合案例

假设我们有一个企业人力资源数据库hr,包含以下基础表:

  • employees(员工信息表)

  • departments(部门信息表)

  • salaries(薪资信息表)

我们需要为不同角色的员工创建视图并设置相应的权限。

第一步:创建基础表

CREATE DATABASE hr;

USE hr;

-- 部门表
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50) NOT NULL,
    location VARCHAR(100)
);

-- 员工表
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    hire_date DATE,
    dept_id INT,
    manager_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id),
    FOREIGN KEY (manager_id) REFERENCES employees(emp_id)
);

-- 薪资表
CREATE TABLE salaries (
    salary_id INT PRIMARY KEY,
    emp_id INT,
    base_salary DECIMAL(10,2),
    bonus DECIMAL(10,2),
    effective_date DATE,
    FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);

第二步:创建不同用途的视图

(1)公共信息视图 (允许所有员工访问)
CREATE VIEW employee_directory AS
SELECT e.emp_id, e.emp_name, e.email, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
(2)部门视图 (部门经理专用)
CREATE VIEW dept_employees AS
SELECT e.emp_id, e.emp_name, e.hire_date, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
(3)薪资视图(HR专用)
CREATE VIEW employee_salary AS
SELECT e.emp_id, e.emp_name, d.dept_name, 
       s.base_salary, s.bonus, (s.base_salary + s.bonus) AS total_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
JOIN salaries s ON e.emp_id = s.emp_id;

第三步:创建角色并分配权限

CREATE ROLE 'hr_staff', 'dept_manager', 'regular_employee';

-- HR角色:完全访问
GRANT ALL PRIVILEGES ON db.employee_salary TO 'hr_staff';
GRANT SELECT ON db.dept_employees TO 'hr_staff';

-- 部门经理角色:只能查看本部门信息
GRANT SELECT ON db.dept_employees TO 'dept_manager';
GRANT SELECT ON db.employee_directory TO 'dept_manager';

-- 普通员工角色:只能查看公共信息
GRANT SELECT ON db.employee_directory TO 'regular_employee';

-- 创建用户并分配角色
CREATE USER 'hr_john'@'%' IDENTIFIED BY '123';
CREATE USER 'sales_mgr'@'%' IDENTIFIED BY '456';
CREATE USER 'emp_li'@'%' IDENTIFIED BY '789';

GRANT 'hr_staff' TO 'hr_john'@'%';
GRANT 'dept_manager' TO 'sales_mgr'@'%';
GRANT 'regular_employee' TO 'emp_li'@'%';

-- 激活角色
SET DEFAULT ROLE ALL TO 'hr_john'@'%', 'sales_mgr'@'%', 'emp_li'@'%';

第四步:权限验证测试

-- 以HR身份登录测试
mysql -u hr_john -p123
USE db;
-- 应能查询所有视图
SELECT * FROM employee_salary LIMIT 5;
SELECT * FROM dept_employees LIMIT 5;

-- 以销售经理身份登录测试
mysql -u sales_mgr -p456
USE db;
-- 只能查看部门视图和员工目录
SELECT * FROM dept_employees LIMIT 5;
-- 尝试查看薪资视图会失败
SELECT * FROM employee_salary; -- 应显示权限错误

-- 以普通员工身份登录测试
mysql -u emp_li -p789
USE db;
-- 只能查看公共信息
SELECT * FROM employee_directory LIMIT 5;
-- 尝试查看部门视图会失败
SELECT * FROM dept_employees; -- 应显示权限错误

五、总结思考

今天主要学习了MySQL数据库中Views视图章节了内容,了解了视图的基本定义,怎么创建视图,视图的主要应用场景以及视图的权限管理四部分的内容。

下面我将进行简单的回顾:

首先视图是基于查询的虚拟表,不存储数据

创建视图用CREATE VIEW view_name AS SELECT ........

视图可以用来封装复杂查询,提供便捷的数据访问接口;限制用户能访问的列,实现精细化权限控制等等

我们可以创建多个不同功能的视图,将他们分配给不同的用户。

视图章节总体来说内容还是比较多的,后面需要进行定期的复习梳理。

你可能感兴趣的:(MySQL学习,数据库,mysql)