跳到正文
Kale的数字花园
目录 文章
/9 分钟/5 阅读/0 评论

用户权限DCL

我们进入公司后,有专门的DBA(数据库管理员),为你创建一个新用户,授予一定的权限... 我们只做为了解即可! 语法 注意事项 演示 语法 演示 语法 演示 语法 演示 语法 演示 超级管理员 普通用户 设计良好结构的数据库,可以有效减小数

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

我们只做为了解即可!

创建用户

语法

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

注意事项

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

演示

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

查看权限

语法

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

演示

show grants for 'jack'@'%';

-- 当前权限 , 表示当前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 select, update , 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')

三大范式

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

数据库第一范式

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

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

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

到底什么是第一范式: 必须明确字段

数据库第二范式

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

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

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

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

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

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

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

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

1、数据信息冗余,可见上表

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

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

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

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

数据库第三范式

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

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

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

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

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

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

索引

索引有作用: 提高查询的效率

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

示例

-- 创建索引
create index abc on emp(ename);

-- 查看索引
show index from emp;

-- 测试索引
select * from emp where ename = "name1577";

-- 删除索引
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);

将其转为横表

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

结果:

横表转纵表

有如下横表

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');

将其横表转为纵表

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;

结果:

数据库备份

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

使用命令备份

备份数据库

在命令行中  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文件】-- 【仅结构】

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

记录最后修改时间

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

作业

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

订单系统设计

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

租房网

自己考虑自己设计

连接别人的数据库

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

-- 项目经理,创建一个用户,组内所有成员登录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';

相关阅读

11 分钟

多表操作

现实生活中,(班级)实体与(学生)实体之间肯定是有关系的,那么我们在设计表的时候,就应该体现出(班级)表与(学生)表之间的这种关系! 简称:关系型数据库(Relation DBMS) 一对一关系在实际开发中用的并不多,因为可以把关联字段设计

JavaWeb#mysql5 阅读 · 0 评论

9 分钟

DML语句

语法 举例 注意事项 ==添加数据 语法 举例 注意事项 语法 举例 注意事项 如果不加任何条件,则会将表中所有记录全部修改。 查询所有记录 查询表中所有学生的姓名和对应的语文成绩 在所有学生数学分数上加10分特长分 统计每个学生的总分 发

JavaWeb#mysql5 阅读 · 0 评论

6 分钟

数据库概述

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以 对数据库中的数据进行增加,修改,删除及查询操作(CRUD)。 1. cmd--> services.msc 打开服务的窗口--> MySQL服务启动

JavaWeb#mysql4 阅读 · 0 评论

评论需要登录。生产环境使用 GitHub 登录,本地可前往 登录页 使用开发登录。

还没有评论,来抢沙发。