> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。> 目标:了解什么是视图,我们又该如何管理用户。
> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!
> 专栏选自:带你玩转MySQL
> 望小伙伴们点赞👍收藏✨加关注哟💕💕
一、前言
想必大家在学校也学习过MySQL,可能学的懵懵懂懂,这个板块我们从入门开始,从最新的安装MySQL到学习MySQL语句,一步一步开始,一切都是新的,新的板块新的开始,大家一起努力,一起进步!!!
二、主体
学习【MySQL】视图特性&&用户管理 咱们按照下面的图解:
2.1【MySQL】视图特性
概念:
- 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。
- 视图中的数据并不会单独存储在数据库中,其数据来自定义视图时查询所引用的表(基表),在每次引用视图时动态生成。
- 由于视图和基表用的本质是同一份数据,因此对视图的修改会影响到基表,对基表的修改也会影响到视图。
2.1.1 视图的基本使用
准备测试表:
员工表(emp)中包含如下字段:
- 雇员编号(empno)
- 雇员姓名(ename)
- 雇员职位(job)
- 雇员领导编号(mgr)
- 雇佣时间(hiredate)
- 工资月薪(sal)
- 奖金(comm)
- 部门编号(deptno)
部门表(dept)中包含如下字段:
- 部门编号(deptno)
- 部门名称(dname)
- 部门所在地点(loc)
2.1.1.1 创建视图
语法如下:
CREATE VIEW view_name AS SELECT ...;
创建视图时会先执行select语句,然后用查询得到的结果来创建视图
当我们查询每个员工对应的部门名称时,需要使用员工表和部门表进行多表查询,并筛选出员工的部门号等于部门的部门号的记录:
select ename, dname from emp,dept where emp.deptno=dept.deptno;
如果该查询结果会被频繁用到,那我们就可以给上述查询结果创建视图,创建完毕后通过show命令就能看到这个视图:
create view v_ename_dname as
select ename, dname from emp,dept where emp.deptno=dept.deptno;
并且在数据库对应的目录下,会增加一个对应的
xxx.frm
文件,但并没有与之对应的xxx.ibd
文件,这也证明了视图和基表使用的是同一份数据:
创建视图后就可以直接通过查询视图,来查看每个员工及其对应的部门名称了:
select * from v_ename_dname;
2.1.1.2 修改视图影响基表
通过查询员工表(emp),可以看到员工CLARK所在部门的部门号为10:
select * from emp where ename='CLARK';
查询部门表(dept),可以看到10号部门的部门名称为ACCOUNTING :
select * from dept where deptno=10;
在视图中将员工CLARK的名字改为TEST后,会看到在员工表(emp)中的员工CLARK的名字也被改为TEST:
update v_ename_dname set ename='TEST' where ename='CLARK';
select * from emp where ename='CLARK';
select * from emp where ename='TEST';
根本原因就是因为视图和基表使用的是同一份数据,将视图中员工CLARK的名字改为TEST后员工表(emp)中的员工CLARK的名字也被改为TEST。
2.1.1.3 修改基表影响视图
通过查询员工表(emp),可以看到员工JAMES所在部门的部门号为30:
select * from emp where ename='JAMES';
30号部门的部门名为SALES,因此查询视图时可以看到JAMES所在的部门名为SALES:
select * from v_ename_dname where ename='JAMES';
现在将员工表中,员工JAMES对应的部门号改为20:
update emp set deptno=20 where ename='JAMES';
select * from v_ename_dname where ename='JAMES';
修改后再查询视图,就会发现JAMES所在部门的部门名,变成了20号部门的部门名RESEARCH:
select * from v_ename_dname where ename='JAMES';
2.1.1.4 删除视图
删除视图的SQL如下:
drop view v_ename_dname;
且该视图在数据库目录下对应的xxx.frm文件也会被删除:
2.1.2 视图规则和限制
- 视图与普通表一样,视图的命名也必须是唯一的,不能出现同名视图或表名。
- 创建视图的数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
- 视图不能添加索引,也不能有关联的触发器或者默认值。
- 视图可以提高安全性,在访问视图时必须具有足够的访问权限。
- 创建视图时可以使用order by子句,但如果从该视图检索数据时也含有order by子句,那么该视图中的order by将被覆盖。
- 视图可以和普通表一起使用,比如进行多表查询,内外连接等。
2.2【MySQL】用户管理
2.2.1 用户管理
概念:
如果我们只能使用root用户,root的权限非常大,这样存在安全隐患。这时,就需要使用MySQL的用户管理,可以给不同的用户分配不同的权限,让不同用户执行权限内的操作,让不同的用户看到不同的内容。
图解:
2.2.2 用户
2.2.2.1 用户信息
在MySQL看来用户信息也是数据,同样存在一张表中,存储在系统数据库mysql的user表中:
在查看用户信息时为了避免刷屏,可以只选择其中的部分字段进行显示,如下:
部分字段说明:
- host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆。
- user: 用户名。
- authentication_string: 用户密码通过password函数加密后的。
- *_priv: 用户拥有的权限。
2.2.2.2 创建用户
语法:
create user '用户名'@'登陆主机/ip' identified by '密码';
解释说明:
- MySQL的用户管理的时候,不仅仅需要认证用户是否注册,还要认证用户登陆的主机是否注册,这两个必须同时满足,才能具备登录MySQL的能力。
- localhost代表:本地登录,也可以写成127.0.0.1。
举个栗子:
create user 'qing'@'localhost' identified by '123456';
2.2.2.3 修改用户密码
语法:
drop user '用户名'@'主机名'
2.2.2.4 修改用户密码
自己改自己密码:
set password=password('新的密码');
root用户修改指定用户的密码:
set password for '用户名'@'主机名'=password('新的密码');
2.2.3 数据库的权限
MySQL数据库提供的权限列表:
2.2.3.1 给用户授权
给用户授权的SQL语法如下:
grant 权限列表 on 库.表名 to '用户名'@'登陆位置' [identified by '密码'];
解释说明:
- 用户名'@'登录地址':表示给哪一个用户授权。
- 库名.对象名:表示要授予用户哪个数据库下的哪个对象的权限。
- 权限列表:表示要授予用户何种权限,多个权限之间用逗号隔开。
- IDENTIFIED BY '密码' 可选:如果用户存在,则在授予权限的同时修改该用户的密码,如果用户不存在,则创建该用户。
总结:
- 权限列表,多个权限用逗号分开
grant select on ... --赋予查询权限
grant select, delete, create on .... --赋予查询,删除,创建 权限
grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
- *.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
- 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
- identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
举个栗子:
①:
②:
③:
2.2.3.2 回收权限
语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
举个栗子:
回收权限的语法与授权一样,只不过将to关键字改为了from,并且没有了IDENTIFIED BY '密码'
字段。比如下面将cjl用户在scott数据库下的所有权限回收。
解释说明:
- 回收用户在某一数据库下的权限后,在该用户下一次进入该数据库时才会起作用。
- 如果回收权限时该用户正在使用对应数据库,那么回收权限后该用户仍然拥有对应的权限。
三、结束语
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。