目录
一、定义
二、基本语法
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
语句,并返回结果集,让你感觉就像在查询一个真实的表。
CREATE [OR REPLACE] VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[WITH CHECK OPTION];
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;
SELECT * FROM passing_students;
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;
DROP VIEW [IF EXISTS] view_name;
示例:删除passing_students视图
DROP VIEW IF EXISTS passing_students;
SHOW CREATE VIEW passing_students;
输出视图的CREATE VIEW 语句
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;
username@hosthost:用户连接的主机,例如localhost(本地连接)或%(允许从任何主机连接)。
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
示例:
CREATE USER 'AlinJ'@'localhost' IDENTIFIED BY '123456789AlinJ';
角色是权限的集合,可以分配多个用户,实现批量权限管理。
CREATE ROLE role_name;
示例:
REVOKE SELECT ON Company.employees TO 'LinJ';
GRANT privilege_type ON database.object TO 'role_name';
示例:
GRANT SELECT ON Company.employees TO 'LinJ';
REVOKE privilege_type ON database.object FROM 'role_name';
示例:
REVOKE SELECT ON Company.employees TO 'LinJ';
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];
示例1:授予查询权限
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';
REVOKE privilege_type [(column_list)] ON object_name FROM 'user'@'host';
示例1:取消查询权限 取消user1对employee_public的查询权限
REVOKE SELECT ON mydb.employee_public FROM 'user1'@'localhost';
假设我们有一个企业人力资源数据库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)
);
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;
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;
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 ........
视图可以用来封装复杂查询,提供便捷的数据访问接口;限制用户能访问的列,实现精细化权限控制等等
我们可以创建多个不同功能的视图,将他们分配给不同的用户。
视图章节总体来说内容还是比较多的,后面需要进行定期的复习梳理。