目录
[1. 基本使用](#1. 基本使用)
[2. 视图规则和限制](#2. 视图规则和限制)
[1. 用户相关操作](#1. 用户相关操作)
[2. 数据库的权限管理](#2. 数据库的权限管理)
在 MySQL 的世界里,视图和用户管理是两个非常关键的知识点。视图能让我们更灵活地查询数据,用户管理则保障了数据库的安全访问。今天,咱们就来好好聊聊这两块内容。
一、视图
视图是一个虚拟表,它的内容由查询定义。就像真实的表一样,视图包含列和行数据,而且视图和基表之间数据是相互影响的,视图的数据变化会影响基表,基表的数据变化也会影响视图。
1. 基本使用
- 创建视图:用 create view 视图名 as select语句; 就能创建视图。比如要创建一个关联员工表(EMP)和部门表(DEPT),展示员工姓名(ename)和部门名称(dname)的视图 v_ename_dname ,可以这样写:
sql
create view v_ename_dname as select ename, dname from EMP, DEPT where EMP.deptno=DEPT.deptno;
然后查询这个视图 select * from v_ename_dname; ,就能看到相关数据啦。
- 视图与基表的相互影响:
- 修改视图会影响基表,比如执行 update v_ename_dname set dname='sales' where ename='CLARK'; ,再查询基表中 CLARK 的数据,会发现已经改变。
- 修改基表也会影响视图,像 update EMP set deptno=20 where ename='JAMES'; ,之后查询视图里 JAMES 的数据,也会有变化。
- 删除视图:用 drop view 视图名; 就可以删除视图啦。
2. 视图规则和限制
-
视图得唯一命名,不能和已有的视图或表重名。
-
创建视图的数量没限制,但复杂查询创建视图后要考虑性能影响。
-
视图不能加索引,也不能有关联的触发器或默认值。
-
视图能提高安全性,不过得有足够的访问权限。
-
order by 可以用在视图里,但如果从视图检索数据的 select 语句也有 order by ,视图里的 order by 会被覆盖。
-
视图还能和表一起使用。
- 实战:创建演员视图
比如针对 actor 表创建视图 actor_name_view ,可以这样写:
sql
create view actor_name_view as select * from actor;
二、用户管理
要是只使用 root 用户,会存在安全隐患,这时候就需要进行 MySQL 的用户管理啦。不同用户可以被赋予不同数据库的操作权限,像张三只能操纵 mytest 库,李四只能操纵 msg 库,这样能大大降低风险。
1. 用户相关操作
MySQL 中的用户,都存储在系统数据库 mysql 的 user 表中。
-
查看用户信息:可以先 use mysql; 切换到 mysql 数据库,然后执行 **select host,user,authentication_string from user;**来查看用户信息,也能通过 desc user 初步查看表结构。其中 host 表示用户可登录的主机, localhost 就表示只能从本机登录; user 是用户名; authentication_string 是用户密码通过 password 函数加密后的值; *_priv 是用户拥有的权限。
-
创建用户:语法是 create user '用户名'@'登陆主机/ip' identified by '密码';。比如创建用户 whb ,只能从本机登录,密码是 12345678 ,就可以写 create user 'whb'@'localhost' identified by '12345678'; 。不过要注意,MySQL 本身认证等级较高,简单密码可能设置不了,遇到 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 这样的报错,可以去查看密码设置相关要求( SHOW VARIABLES LIKE 'validate_password%'; ),再进行调整。而且不要轻易添加能从任意地方登录的用户。
-
删除用户:语法是 drop user '用户名'@'主机名'。比如删除用户 whb @ localhost ,就执行 drop user 'whb'@'localhost'; 。要注意直接给用户名,不指定主机名是删不掉的,因为默认是 % ,表示所有地方都能登录的用户。
-
修改用户密码:自己改自己密码用 set password=password('新的密码');; root 用户修改指定用户的密码用 set password for '用户名'@'主机名'=password('新的密码');。比如 root 用户修改 whb @ localhost 的密码为 87654321 ,就执行 set password for 'whb'@'localhost'=password('87654321'); 。
2. 数据库的权限管理
MySQL 数据库提供了丰富的权限,像 CREATE (用于数据库、表或索引)、 DROP (用于数据库或表)、 SELECT (用于表)等等。
-
给用户授权:刚创建的用户没有任何权限,需要给用户授权。语法是 grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']。权限列表里多个权限用逗号分开, *.* 代表本系统中所有数据库的所有对象(表、视图、存储过程等), 库.* 表示某个数据库中的所有数据对象。 identified by 是可选的,如果用户存在,赋予权限的同时会修改密码;如果用户不存在,就会创建用户。比如给用户 whb 赋予 test 数据库下所有文件的 select 权限,就执行 grant select on test.* to 'whb'@'localhost'; 。授权后如果没生效,可以执行 flush privileges; 刷新权限。
-
回收权限:语法是 revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';。比如回收 whb 对 test 数据库的所有权限,就执行 revoke all on test.* from 'whb'@'localhost';。
掌握了视图和用户管理,咱们在 MySQL 中操作数据就更得心应手啦,既能灵活查询,又能保障安全~