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'