【MySQL】视图与用户管理
目录
一、视图
(一)基本使用
1、创建视图
2、修改视图
3、删除视图
(二)视图规则和限制
二、用户管理
(一)用户操作
1、用户信息
2、创建用户
3、删除用户
4、修改用户密码
(二)权限操作
1、给用户授权
2、回收权限
一、视图
(一)基本使用
视图是一张虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
测试表:
mysql> select * from grade;
+----+--------+---------+------+
| id | name | chinese | math |
+----+--------+---------+------+
| 1 | 张三 | 85 | 90 |
| 2 | 李四 | 94 | 83 |
+----+--------+---------+------+
2 rows in set (0.00 sec)
1、创建视图
语法:
create view 视图名 as select语句;
案例:
mysql> create view grade_total as select name, chinese+math as total from grade;
Query OK, 0 rows affected (0.01 sec)mysql> select * from grade_total;
+--------+-------+
| name | total |
+--------+-------+
| 张三 | 175 |
| 李四 | 177 |
+--------+-------+
2 rows in set (0.00 sec)
2、修改视图
修改视图:
//修改视图张三姓名
mysql> update grade_total set name='zhangsan' where name='张三';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from grade_total;
+----------+-------+
| name | total |
+----------+-------+
| zhangsan | 175 |
| 李四 | 177 |
+----------+-------+
2 rows in set (0.00 sec)
//基表也发生了变化
mysql> select * from grade;
+----+----------+---------+------+
| id | name | chinese | math |
+----+----------+---------+------+
| 1 | zhangsan | 85 | 90 |
| 2 | 李四 | 94 | 83 |
+----+----------+---------+------+
2 rows in set (0.00 sec)
修改基表:
//修改基表
mysql> update grade set chinese=chinese+10 where name='李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from grade;
+----+----------+---------+------+
| id | name | chinese | math |
+----+----------+---------+------+
| 1 | zhangsan | 85 | 90 |
| 2 | 李四 | 104 | 83 |
+----+----------+---------+------+
2 rows in set (0.01 sec)
//视图也发生了变化
mysql> select * from grade_total;
+----------+-------+
| name | total |
+----------+-------+
| zhangsan | 175 |
| 李四 | 187 |
+----------+-------+
2 rows in set (0.00 sec)
即使是删除视图中的元素,基表的数据也会发生相应的变化:
mysql> delete from grade_total where name='李四';
Query OK, 1 row affected (0.00 sec)mysql> select * from grade_total;
+----------+-------+
| name | total |
+----------+-------+
| zhangsan | 175 |
+----------+-------+
1 row in set (0.00 sec)mysql> select * from grade;
+----+----------+---------+------+
| id | name | chinese | math |
+----+----------+---------+------+
| 1 | zhangsan | 85 | 90 |
+----+----------+---------+------+
1 row in set (0.00 sec)
3、删除视图
视图实际就是一种虚拟表,可以简单地将视图理解为表。
语法:
drop view 视图名;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| grade |
| grade_total |
| student |
| test |
+----------------+
4 rows in set (0.00 sec)mysql> drop view grade_total;
Query OK, 0 rows affected (0.00 sec)mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| grade |
| student |
| test |
+----------------+
3 rows in set (0.00 sec)
(二)视图规则和限制
- 与表相同,必须唯一命名,不得与其他表名或视图名冲突;
- 创建视图数目无限制,但也要考虑复杂查询创建为视图之后的性能影响;
- 视图不能添加索引,也不能有关联的触发器或默认值;
- 视图可以提高安全性,必须具有足够的访问权限;
- order by 也可以用在视图中,但是如果从视图检索 select 中也含有 order by,那么该视图的 order by 将会被覆盖;
- 视图和表可以一起进行操作。
二、用户管理
在之前的文章里都是采用 root 账号进行操作,但实际这样存在着一定的安全隐患。MySQL也为用户提供了用户管理功能,更加方便用户之间进行协作并提高数据库的安全性。
(一)用户操作
1、用户信息
MySQL中的用户,都存储在系统数据库 mysql 的 user 表中;
mysql> use mysql;
Database changed
mysql> select host, user, authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host | user | authentication_string |
+-----------+---------------+-------------------------------------------+
| localhost | root | *91E7E734CE71D28116DB307A61B0BEB2BF3FED3D |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | X | *11F56A9E77ADBECFA3A3E6CD6452BDDE15457500 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)
实际 MySQL 在执行用户相关操作都是对该表进行增删改操作,用户也可以直接对改变进行操作也能达到相应的效果,但不i推荐。
字段解释:
- host:表示用户从哪个主机进行登录,localhost 代表只能从本机登录;
- user:用户名;
- authentication_string:用户密码通过 password 函数加密后;
- *_priv:用户权限。
2、创建用户
语法:
create user '用户名'@'登陆主机/ip' identified by '密码';
案例:
mysql> create user 'test'@'localhost' identified by 'Tt123456!';
Query OK, 0 rows affected (0.00 sec)mysql> select host, user, authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host | user | authentication_string |
+-----------+---------------+-------------------------------------------+
| localhost | root | *91E7E734CE71D28116DB307A61B0BEB2BF3FED3D |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | X | *11F56A9E77ADBECFA3A3E6CD6452BDDE15457500 |
| localhost | test | *08869AD15C736ECAD541A4FED325EBA2AF89850C |
+-----------+---------------+-------------------------------------------+
5 rows in set (0.00 sec)
3、删除用户
语法:
drop user '用户名'@'主机名'
案例:
mysql> drop user 'test'@'localhost';
Query OK, 0 rows affected (0.00 sec)mysql> select host, user, authentication_string from user;
+-----------+---------------+-------------------------------------------+
| host | user | authentication_string |
+-----------+---------------+-------------------------------------------+
| localhost | root | *91E7E734CE71D28116DB307A61B0BEB2BF3FED3D |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | X | *11F56A9E77ADBECFA3A3E6CD6452BDDE15457500 |
+-----------+---------------+-------------------------------------------+
4 rows in set (0.00 sec)
4、修改用户密码
//为指定用户设置密码
set password for '用户名'@'主机名'=password('新的密码');
//设定当前用户密码
set password=password('新的密码');
(二)权限操作
1、给用户授权
语法:
grant all [privileges] on [库名].[表名]
- *.*:代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
- 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
- identified by可选: 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
案例:
//root
mysql> create database test;
Query OK, 1 row affected (0.00 sec)mysql> use test;
Database changedmysql> create table test( id int primary key auto_increment, name varchar(20)not null);
Query OK, 0 rows affected (0.02 sec)mysql> insert into test(name) values('张三'), ('李四');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> select * from test;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
+----+--------+
2 rows in set (0.00 sec)mysql> grant select on test.test to 'X'@'localhost';
Query OK, 0 rows affected (0.00 sec)//X
mysql> use test;
Database changedmysql> select * from test;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
+----+--------+
2 rows in set (0.00 sec)mysql> delete from account;
mysql> ERROR 1142 (42000): DELETE command denied to user 'X'@'localhost' for table
'test'
2、回收权限
语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
案例:
//root
mysql> revoke all on test.* from 'X'@'localhost';
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)//X
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)