Mysql基础4

本文详细介绍了数据库中的用户权限管理,包括创建、查看、授予和撤销权限,以及第一、第二、第三范式在数据库设计中的应用。此外,还讨论了索引的作用、类型以及横表和纵表的转换,以及数据库的备份策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户权限DCL

我们进入公司后,有专门的DBA(数据库管理员),为你创建一个新用户,授予一定的权限…

我们只做为了解即可!

创建用户

语法

create user '用户名'@'主机名' identified by '密码';

注意事项

主机名:限定客户端登录ip
指定ip:127.0.0.1 (localhost)
任意ip:%

演示

create user 'jack'@'%' IDENTIFIED by 'jack';

查看权限

语法

show grants for '用户名'@'主机名';

演示

show grants for 'jack'@'%';

-- 当前权限 , 仅限于登录
GRANT USAGE ON *.* TO 'jack'@'%'    

授于权限

语法

grant 权限1,权限2... on 数据库名.表名 to '用户名'@'主机名';

授于单个权限

演示

-- 授于 select 单个权限
-- jack 这个用户对test库的emp表有select操作权限
grant select on test.emp to 'jack'@'%' ;

-- 刷新权限
flush privileges;

-- 测试jack登录
mysql -ujack -pjack

--切换test数据库
use test;

-- 测试除select以外的命令是否有权限  
delete from emp where id = 1;

-- 测试select命令是否有权限
select * from emp;

授于多个权限

-- 授于 select, update , insert 多个权限
-- jack 这个用户对test库的emp表有 select, update , insert 操作权限
grant selectupdate , insert  on test.emp to 'jack'@'%' ;

-- 刷新权限
flush privileges;

授于全部-指定的库和表

-- 授于整个test 库的权限
-- jack 这个用户对test库下的所有表有操作权限
grant all  on test.* to 'jack'@'%' ;

-- 刷新权限
flush privileges;
-- 授于整个test 库的权限
-- jack 这个用户对所有库下的所有表有操作权限
grant all on *.* to 'jack'@'%' ;

-- 刷新权限
flush privileges;

撤销授权

语法

revoke 权限1,权限2... on 数据库名.表名 from '用户名'@'主机名'; 

演示

-- 撤销jack用户下test库中的emp表的select权限
revoke select on test.emp from 'jack'@'%' ;

-- 撤销jack用户下test库所有表的select权限
revoke select on test.* from 'jack'@'%' ;

删除用户

语法

drop user '用户名'@'主机名';

演示

drop user 'jack'@'%' ;

密码管理

超级管理员

-- 登录root
mysql -uroot -proot

-- 切换mysql默认的数据库【mysql】
use mysql;

-- 修改mysql服务器中自带的mysql数据库的user表下有一个authentication_string修改即可
update user set authentication_string =password('abc') where user='root';  

-- 或者使用以下命令进行修改密码
set password for 'root'@'localhost' = password('abc');

-- 修改后重启服务器

普通用户

set password=password('新密码');
-- 加密函数
SELECT PASSWORD('123');
select md5('123')

三大范式

​ 后期,大家需要自行根据用户的需求,设计数据库需求说明书,提升到项目经理,对甲方需要做业务分析,完毕之后的工作。要理解公司现有的数据表及其之间的关系。

​ 如果说:2张表,基本不用;但是如果有50张表的时候,需要;

​ 设计良好结构的数据库,可以有效减小数据冗余,减少增删改中出现的问题。深入理解数据库设计的三范式,对于设计“健壮的数据库“十分有必要。数据库三范式是设计数据库 时参考的准则,接下来我们一一进行介绍:

数据库第一范式

数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。(保持数据的原子性)

数据原子性很好理解,就是表中的字段不可再分。符合数据库第一范式的表,每个字段表意明确,看个例子:

工号 姓名 电话 ,针对电话列,实际上有歧义;固定电话 手机 ;拆分该电话列,成:固定电话 移动电话

image-20210717142250267

这是一张简单的员工信息表,其中有工号、姓名、电话三个字段。通过电话这个字段获得的信息有可能是家庭电话,或是工作地点的电话,或是手机,因此表达的信息并不明确,我们可以改成这样:

img

到底什么是第一范式: 必须明确字段,列的原子性,意味着列不可拆分

数据库第二范式

在满足第一范式的基础上,实体的每个非主键属性完全依赖于主键属性(消除部分依赖)

**主键:**凡是接触过数据库的人,肯定都会知道主键,主键明确标识了每条记录,一般是一个字段,也可以由两个或两个字段组成。

**依赖:**对于X的每个值,Y都有一个值与之对应,反过来则不一定不成立,这叫做X函数决定Y,Y函数依赖X(X往往是主键)。

还拿上面的那张表举来说,对于每个工号,都有一个姓名与之对应,即工号决定姓名,姓名依赖工号;但由于员工之间可能有重名,一个姓名可能对应多个工号,所以姓名不能决定工号。

**部分依赖:**当主键由两个或两个以上字段构成,而表中的某些信息通过主键的一个字段就能唯一确定,我们称这样的依赖关系为部分依赖,比如这个例子:

img

学生选课(学号,姓名,专业,课程号,课程名,成绩),该表中一个学生可以选多门课,一门课有多个学生。学号和课程号可以唯一确定一条记录,因此用学号和课程号做主键。

表中的姓名、专业通过主键中的学号就能唯一确定,而课程名通过课程号唯一确定,这就是部分依赖,这样的设计不符合第二范式。

解决表的原子性,即表中的不可再次拆分为若干子表;

不符合第二范式会带来哪些问题呢?

1、数据信息冗余(重复的数据),可见上表

2、增删改会出现问题,比如有一门《微机原理》没有人选,那么由于缺少学号(主键之一)那么这门课就不能出现在表里。

如何解决呢,我们可以用关系分解的方法消除部分依赖,将上表改成如下三张表:

img img

让每张表只做每张表的事即可,不要把所有事都集中一块

第二范式到底什么意思: 在第一范式的基础上,明确每一张表

数据库第三范式

在满足第二范式的基础上,在实体中不存在非主键属性****传递函数依赖于主键属性。(表中字段[非主键]不存在对主键的传递依赖)

**传递依赖:**A依赖于B,B依赖于C,就可以说A依赖C。看这样一张表:

img

这张表中有如下决定关系: 学号–>姓名,性别系号–>决定系名宿舍号–>决定宿舍电话,也有 学号–>系名,学号–>宿舍电话。

在这样一张表中则存在着传递依赖。也就是系名依赖系号,系号依赖学号,那么间接的系名依赖学号,宿舍号、宿舍电话和学号之间也有同样的关系。这样设计表的同样会带来数据冗余,操作异常等问题。那么我们同样可以用关系分解的分解的方法来消除传递依赖,将这张表分成三张表:

img

要有主外建关系,这就是数据库设计的第三范式了,在设计数据表的过程中注意三范式的应用,多多实践,有助于对三范式有更深入的理解。

第三范式到底什么意思: 在第一范式和第二范式的基础上,让表与表之间建立关系

遵循三大范式,4fC,5fc。表 :拆分越细,查询数据,需要表的连接查询。sql

反范式:会主动增加冗余列。好处,查的快,适当情况下,是允许不符合三范式。

订单表:

商品表:

订单表: 订单编号 商品id

​ 订单编号 商品id 商品名称 ,将来查询的时候,比较快。不用直接多个表的链接。

索引(*)

索引有作用: 提高查询的效率 。官方:帮助MySQL高效获取数据数据结构

字典:查字; 偏旁部首 汉语拼音等;->目录 索引类似于字典的目录。

分类:

一、单列索引

一个索引只包含单个列,但一个表中可以有多个单列索引。 这里不要搞混淆了

1、普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一 点。

2、唯一索引:索引列中的值必须是唯一的,但是允许为空值。

3、主键索引:是一种特殊的唯一索引,不允许有空值。(主键约束,就是一个主键索引)。
二、组合索引

在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。

三、全文索引

全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行。

一般用于数据量比较大的情况下我们建立索引,如果数据量太小也必要去建立索引

img

img

应用场景:

1.经常查询列; 主键 unique

2.join列

不适合创建索引:

1.数据量少

2.基数选项少列不合适 列:性别 男 女

2.创建索引字段,频繁更新

示例

-- 创建索引
create index index_stu(索引名称) on emp(ename);

-- 查看索引
show index from emp;

-- 测试索引
select * from emp where ename = "name1577";
explain
-- 删除索引
drop index abc on emp;

横表/纵表

纵表和横表的概念及其相互转换

横表就是普通的建表方式,如表结构为:主键、字段1、字段2、字段3...。 如果变成纵表后,则表结构为: 主键、字段代码、字段值。而字段代码则为字段1、字段2、字段3...。  具体为电信行业的例子。以用户帐单表为例,一般出账时用户有很多费用,其数据一般存储为:时间,客户ID,费用科目,费用。这种存储结构一般称为纵表,其特点是行数多,字段少。纵表在使用时由于行数多,统计用户数或对用户进行分档时还需要进行GROUP BY 操作,性能低,且操作不便,为了提高性能,通常根据需要将纵表进行汇总,形成横表,比如:时间、客户ID、基本通话费、漫游通话费、国内长途费、国际长途费...。
横表
优点:一行表示了一个实体记录,清晰可见,一目了然。
缺点:如果现在要给这个表加一个字段,那么就必须重建表结构。
纵表
优点:如果现在要给这个表加一个字段,只需要添加一些记录。
缺点:数据描述不是很清晰,而且会造成数据库数据很多。另如果需要分组统计,要先group by,较繁琐。
结论:应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。 

纵表转横表

有如下纵表

create table proper(
   student_name varchar(20),
   course_name varchar(20),
   score double
);

INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('张三', '语文', 67);
INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('张三', '数学', 78);
INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('李四', '语文', 90);
INSERT INTO `proper`(`student_name`, `course_name`, `score`) VALUES ('李四', '英语', 89);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SE5yIAsN-1686570551430)(images/clip_image001-1626493738328.png)]

将其转为横表

select 
-- 第一列显示的字段
p.student_name,
-- 当course_name的名字是‘语文’,把对应的成绩显示
sum(case p.course_name when '语文' then p.score end ) as 语文, 
sum(case p.course_name when '数学' then p.score end ) as 数学, 
sum(case p.course_name when '英语' then p.score end ) as 英语
from proper p 
-- 对名字进行分组
group by p.student_name

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zLSZoP0D-1686570551431)(images/clip_image002-1626493738329.png)]

横表转纵表

有如下横表

create table score_horizontal (
   student_name varchar(20),
   chinese varchar(20),
   math varchar(20),
   english varchar(20)
);

INSERT INTO `score_horizontal`(`student_name`, `chinese`, `math`, `english`) VALUES ('张三', '67', '78', NULL);
INSERT INTO `score_horizontal`(`student_name`, `chinese`, `math`, `english`) VALUES ('李四', '90', NULL, '89');

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vU4GVX33-1686570551431)(images/clip_image003.png)]

将其横表转为纵表

select s.student_name,'chinese' as 科目,s.chinese as 成绩
from score_horizontal s
union all 
select s.student_name,'math' as 科目,s.math as 成绩
from score_horizontal s
union all 
select s.student_name,'english' as 科目,s.english as 成绩
from score_horizontal s;

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fmBxYS1-1686570551431)(images/clip_image004.png)]

数据库备份

备份:把数据库里面的内容进行备份放到硬盘或者其他位置。如果数据库出现问题之后,可以进行数据的恢复。

使用命令备份

备份数据库

在命令行中  mysqldump -u 用户名 -p 数据库名 > 文件名.sql

-- 进行数据库备份
mysqldump -u root -p abc > D://abc.sql
恢复的前提,数据库一定要提前存在,因为备份的sql脚本中没有创建数据库的sql,只有表相关的sql

第一种恢复:
source 文件名.sql  

-- 示例
-- 创建一个数据库
create database abc;

-- 切换数据库
use abc;

-- 进行恢复
source D://abc.sql

-- 查看当前使用的数据库
select database();

-- 查看当前数据库下的所有表
show tables;

第二种恢复:
mysql -u root -p 数据库名 < D://数据库名.sql

-- 示例
-- 创建一个数据库
create database abc;

-- 切换数据库
use abc;

-- 进行恢复
mysql -u root -p abc < D://abc.sql

使用navicat备份

选中要备份的数据库

【右击】–【转存储sql文件】-- 【结构和数据】

【右击】–【转存储sql文件】-- 【仅结构】

恢复数据库: 先创建数据库,再拖拉拽即可

记录最后修改时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zv8P33gx-1686570551432)(images/clip_image001.png)]

insert into emp values(null, 'bbb' , 89,90,99,null);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iQnKSTI-1686570551432)(images/clip_image002.png)]

作业

以下所有数据库设计,必须书写数据库设计文档

订单系统设计


1、用户信息。
2、商品信息
3、订单信息。 一个订单表里 ,可以买多个商品, 每个商品有自己的数目。 其中一个商品就是一个 订单详情。
4、订单详情。

租房网

自己考虑自己设计

远程数据库

在企业开发中,并不是每一个开发人员都有一个自己的数据库,一个团队只有一个数据库,也就是说:多个人连接同一个数据库

image-20210719162651659
-- 项目经理,创建一个用户,组内所有成员登录jack即可
create user 'jack'@'%' IDENTIFIED by 'jack';

-- 项目经理,创建一个用户,指定组内10.50.0.36成员登录jack即可
create user 'jack'@'10.50.0.36' IDENTIFIED by 'jack';

-- 项目经理,jack 这个用户对test库的emp表有select操作权限
grant select on test.emp to 'jack'@'10.50.0.36';
image-20210719163123274 己设计

远程数据库

在企业开发中,并不是每一个开发人员都有一个自己的数据库,一个团队只有一个数据库,也就是说:多个人连接同一个数据库

image-20210719162651659
-- 项目经理,创建一个用户,组内所有成员登录jack即可
create user 'jack'@'%' IDENTIFIED by 'jack';

-- 项目经理,创建一个用户,指定组内10.50.0.36成员登录jack即可
create user 'jack'@'10.50.0.36' IDENTIFIED by 'jack';

-- 项目经理,jack 这个用户对test库的emp表有select操作权限
grant select on test.emp to 'jack'@'10.50.0.36';
image-20210719163123274
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值