MySQL数据库05 数据库控制和设计

DCl 语句

数据库控制 controller

数据库的用户

root是超级管理员用户,很容易引发由于误操作所导致的数据不安全问题

查看mysql 数据库的mysql 数据库 user 表 存储了mysql 数据库所有的用户

新建用户语法

create user 'zhangsan'@'localhost';
# 创建没有密码的账户 zhangsan , 允许在 本机登录
create user 'zhangsan'@'%';
# 创建没有密码的账户 zhangsan , 允许在任何主机登录
create user 'lisi'@'localhost' identified by '456789'
# 创建密码为456789 的账户 lisi

查看 mysql 中的 user 表, 更够发现 新建用户的权限 全部为N

新建用户甚至 无法进入 emp 数据库

授权命令

给已存在的用户 授予 相应权限

GRANT语句可实现创建用户同时授权或为已存在的用户授权
grant 权限名称 on 数据库.表名 to 用户名@地址

创建用户同时授权

grant 权限名称 on 数据库.表名 to 用户名@地址 identified by 密码
# 在创建用户的同时授权

授权, 并指定 权限的可传递性

grant 权限名称 on 数据库.表名 to 用户名@地址 with grant option
# with grant option 被授权的用户, 拥有权限的传递功能

常用权限名称

create
drop
insert
delete
select
update
alter
# 想要赋予多个权限 书写多个权限名称 使用 逗号 隔开
# 如果想要授予所有权限 可以使用 all
# 给emp数据库的所有表 emp.*
# 给所有数据库的所有表通配符表达式 *.* 

给’lisi’ 授权 可以查看 emp 数据库的 emp 表

grant select on emp.emp to 'lisi'@'localhost';

给’lisi’ 授权 可以更改和删除 emp 数据库的 emp 表

grant update,delete,insert on emp.emp to 'lisi'@'localhost';

授予所有权限

grant all on *.* to 'lisi'@'localhost';

创建 ‘wangwu’ 用户, 并授权

grant select on emp.emp to 'wangwu'@'%' identified by '123456';

撤销授权命令

# revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:

撤销 lisi的 删除权限

revoke delete on emp.emp from 'lisi'@'localhost'

修改密码

修改普通用户密码

# 修改当前用户的密码 PASSWORD() 是一个密码加密函数 
SET PASSWORD = PASSWORD("123123"); 
#修改其他用户密码
SET PASSWORD  FOR `teacher`@`localhost`= PASSWORD("888888");        

修改root密码 使用root 登录

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '456456';

如果忘记了 root 密码

参考网址 https://blog.csdn.net/greywolf0824/article/details/80215199

先停止MySQL服务

# 确认 命令行 处于  管理员状态
C:\Users\Administrator>net stop MySQL57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

在这里插入图片描述

修改配置文件

找到目录 C:\ProgramData\MySQL\MySQL Server 5.7 中的 my.ini 文件

[mysqld]
# 添加如下代码
skip-grant-tables = true

重新启动mysql 服务

net start MySQL57

直接登录数据库

mysql -u root  # 直接回车就可以进入到数据库了。

执行命令修改密码

# 已过时
# update mysql.user set password = password('123456') where user='root';
# Unknown column 'password' in 'field list'
# 需要使用 新字段 authentication_string
update mysql.user set authentication_string = password('123456') where user='root';

执行筛选权限的命令

flush privileges;

验证密码修改情况

验证使用修改后的密码登录数据库
在验证新密码是否成功之前,可以先将配置文件中新添加的跳过密码验证的参数去除,然后在重启MySQL服务。
同样可以使用命令来验证,不使用密码是能否登录数据库。
最后使用新密码来登录数据库,可以成功。

删除用户

drop user 'zhangsan'@'localhost';

数据库设计

三大范式

第一范式: 每列都是不可再分的最小数据单元
第二范式: 要求每个表只描述一件事情 
第三范式: 除了主键以外的其他列都直接依赖于主键列 

表与表之间的关系

一对一

一夫一妻制
丈夫 一张表
妻子 一张表
数据的对用关系 一对一
中国人 姓名 年龄 身份证号
身份证表  版本 身份证号 印发单位 有效时间
一个人只能有一张身份证, 一张身份证只能对应一个人

主从表

主表是可以单独存在的

人 是可以脱离身份证单独存在, 身份证不能脱离人存在
人是主表
身份证是从表

一对多 . 多对一

父亲  
儿子
一个人只能有一个亲生父亲 
一个父亲可以对应多个儿子
站在父亲的角度 一对多
站在儿子的角度 多对一
员工和部门
一个员工只能属于一个部门
一个部门可以有多个员工

一般情况下, '多’表指向 '一’表(每一个员工都有一个部门编号)

案例

一个部门有多个员工
部门表  一
员工表  多 
emp 表中 有一个字段 为 deptno 指向了部门编号
假设 emp表中没有 deptno 字段, 希望在dept 表中 添加字段指向emp表中的员工 该方式比较难实现

多对多

QQ 号  84204960  1874546874  2487644514 
QQ 会员 (红钻, 黄钻 , 黑钻 , 绿钻, 蓝钻, 粉钻)
 一个QQ号 可以开通多个 钻业务
 一个钻业务 可以被多个人开通
学生
课程表
一个学生可以 选多门课程
一门课程可以重复被多人选择

学生课程表案例

CREATE DATABASE  IF NOT EXISTS `school`
USE `school`;
DROP TABLE IF EXISTS `subject`;

CREATE TABLE IF NOT EXISTS `subject` (
  `SubjectId` INT(11) NOT NULL AUTO_INCREMENT,
  `SubjectName` VARCHAR(20) NOT NULL,
  `ClassHour` INT(11) NOT NULL,
  `GradeId` INT(11) NOT NULL,
  PRIMARY KEY (`SubjectId`)
);


INSERT  INTO `subject`(`SubjectId`,`SubjectName`,`ClassHour`,`GradeId`) 
VALUES (1,'Java',78,1),(2,'OOP',40,2),(3,'Struts2',60,3),(4,'HTML',50,1),(5,'DataBase',90,2);


DROP TABLE IF EXISTS `student`;

CREATE TABLE IF NOT EXISTS `student` (
  `StudentNo` INT(11) NOT NULL,
  `LoginPwd` VARCHAR(20) NOT NULL,
  `StudentName` VARCHAR(50) NOT NULL,
  `Sex` CHAR(2) NOT NULL,
  `GradeId` INT(11) NOT NULL,
  `Phone` VARCHAR(255) NOT NULL,
  `Address` VARCHAR(255) DEFAULT NULL,
  `BornDate` DATETIME DEFAULT NULL,
  `Email` VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`StudentNo`)
);

INSERT  INTO `student`(`StudentNo`,`LoginPwd`,`StudentName`,`Sex`,`GradeId`,`Phone`,`Address`,`BornDate`,`Email`) 
VALUES (100001,'123456','王冬雪','男',1,'13618179368','王爷坟','1999-09-09 00:00:00','[email protected]'),
(100002,'123456','王春雪','男',2,'13555555555','英家坟','2009-09-04 00:00:00','[email protected]'),
(100003,'123456','王夏雪','男',3,'13444444444','八宝山','1989-09-19 00:00:00','[email protected]'),
(100004,'123456','王秋雪','男',1,'13333333333','公主坟','1899-09-29 00:00:00','[email protected]'),
(100005,'123456','王家训','女',2,'13222222222','八王坟','1979-09-19 00:00:00','[email protected]'),
(100007,'123','李四','男',3,'13911585602','朝阳路','2014-01-01 00:00:00','[email protected]'),
(100008,'123456','卢浩','男',2,'13911585603','丰台路','1990-01-01 00:00:00','[email protected]'),
(100009,'123456','王旭东','男',2,'13911585604','昌平区','1996-01-01 00:00:00','[email protected]'),
(100010,'123456','郑环环','男',2,'13911585605','中关村','1997-01-01 00:00:00','[email protected]'),
(100011,'123456','王丽丽','女',1,'13911585606','顺义区','1992-01-01 00:00:00','[email protected]'),
(100012,'123456','冤大头','女',3,'13911585607','成府路','1993-01-01 00:00:00','[email protected]'),
(100013,'123456','冤小头','女',1,'13911585608','中府村','1994-01-01 00:00:00','[email protected]'),
(100014,'123456','乔峰','男',1,'13911585609','成义区','2014-01-01 00:00:00','[email protected]'),
(100015,'123456','段誉','男',3,'13911585610','解台区','2013-01-01 00:00:00','[email protected]'),
(100016,'123456','虚竹','男',1,'13911585611','丰阳区','2012-01-01 00:00:00','[email protected]'),
(117006,'456','张三','男',1,'13911585601','解放路','2013-01-18 00:00:00','[email protected]');

使用中间表专门维护两表之间的关系

create table if not exists sub_stu(
	`SubjectId` INT(11) NOT NULL, # 课程编号
	`StudentNo` INT(11) ,# 学生编号
	primary key (`SubjectId`,`StudentNo`)
);
# 张三选课为 java
insert into sub_stu values(1,117006);
# 张三也选择了数据库
insert into sub_stu values(5,117006);
# 段誉选课为 database 
insert into sub_stu values(5,100015);

查询张三 选择的课程是

# 三表联查
select sub.SubjectName
from subject sub 
	join sub_stu ss on sub.SubjectId = ss.SubjectId
	join student stu on ss.StudentNo = stu.StudentNo
where stu.StudentName = '张三'

查询选择数据库课程的学生有哪些

select stu.StudentName
from subject sub 
	join sub_stu ss on sub.SubjectId = ss.SubjectId
	join student stu on ss.StudentNo = stu.StudentNo
where sub.SubjectName = 'database'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章