用户权限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';
