show databases;
use db;
show tables;
select * from stu;
-- 约束 : 主键约束 primary key 非空且唯一
-- 非空约束 not null
-- 唯一约束 unique
-- 外键约束 foreign key
create table stu2 (id int primary key, name varchar(20) not null,address varchar(77));
select * from stu2;
insert into stu2 values ( 1, "liang","biejing");
-- 修改表中的约束
alter table stu2 modify address varchar(20) unique;
select * from stu2;
insert into stu2 values (2,"shu","beijing");
select * from stu2;
insert into stu2 values (3,"cheng", "shanghai");
select * from stu2;
-- 删除 唯一约束 不能使用modify
alter table stu2 drop index address;
-- 再创建表之后添加唯一约束alter
alter table stu2 modify address varchar(20) unique;
-- 删除主键
alter table stu2 drop primary key ;
-- 在创建表之后添加主键
alter table stu2 modify id int primary key;
-- 实现自动增长
alter table stu2 modify id int primary key auto_increment;
insert into stu2 values ( null,"python","nihao") ;
select * from stu2;
show create table stu2;
-- 外键约束
-- 创建部门表(id,dep_name,dep_location) -- 一方,主表
create table department( id int primary key auto_increment, dep_name varchar(20), dep_location varchar(20) );
-- 创建员工表(id,name,age,dep_id) -- 多方,从表
create table employee( id int primary key auto_increment, name varchar(20), age int, dep_id int ,
constraint emp_dept_fk foreign key (dep_id) references department(id));
-- 添加2个部门
insert into department values(null, '研发部','广州'),
(null, '销售部', '深圳'); select * from department;
-- 添加员工,dep_id表示员工所在的部门
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2);
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
select *from employee;
drop table employee;
drop table department;
select * from employee;
select *from department;
alter table employee drop foreign key emp_dept_fk;
-- 添加外键 一对多的时候 员工和部门之间就是 多对一的关系 我们在多的一地方放置一的主键 作为外键
-- 并且设置级联操作
alter table employee add constraint hhh_em foreign key (dep_id) references department(id) on update cascade on delete cascade;
数据库设计
表之间的关系
1. 一对一的关系:人和身份证之间的关系
吧
处理方式 :可以再任意一方添加外键, 我个人认为 完全可以用一张表来表示 ,并且使得这个外键唯一约束 unique
2. 一对多的关系 :例如员工和部门之间的关系 , 一个员工对应一个部门 , 一个部门可以的对应个员我们在设计表的时候** 再多的一放建立外键 放置一的一放的主键 让他们产生关联*
constraint 外键名 foreign key (从表的主键) references departement(主表的主键);
3. 多对多的关系: 例子:学生和课程之间 就是多对多的关系, 我们通过建立联合主键的方式, (也就是建立第三张表 里面放置对方的主键 )
数据库设计的范式
## 第一范式 ##
1. 每一列都是不可分割的原子项数据(列是唯一的 不存在两个列,不是符合列
2. 存在的问题:数据冗余重复的太多了 ,数据添加和删除 会产生不合法的数据
----------
## 第二范式 ##
### 在1NF的基础上 非属性码 必须完全依赖于候选码(消除非主属性对主码的部分函数依赖)消除部分依赖 ###
1. 函数依赖:如果A--> B 如果通过A的属性推倒出唯一的B 就说B依赖于A;学号——> 姓名
2. 完全函数依赖: (学号, 课程名称)--> 分数 前面的就是一个属性组
A---> B A是一个属性组则 B属性推倒确定需要依据A中属性组的所有d的属性值
3.部分函数依赖:属性组中的某一个属性组可以确定B属性的的值---A(学号, 课程名称)--> B分数
4. 传递函数依赖: A——>B B-->C 就可以说C传递函数与A;
学号————>院系名--> 院长
5.码:属性或者属性组 被其他属性完全依赖, 就说这个属性(属性组) 为该表的码
----------
## 第三范式 ##(**消除传递依赖**)
----------
数据库的还原备份
使用命令行的方式
- mysqldump -uroot -proot 数据库名 > 保存的路径
- 还原数据库: create database db 1;
- source a.sql
## 使用图像化界面的方式 ##
# 事务 #
1. 事务的概念:多个操作,一旦被事务管理,要不全部成功, 反之全部失败
2. 开始事务 -- 回滚 - -- 提交
3. mysql DMl语句自动提交默认自动提交
4. 手动开启事务, 要手动提交
5. 设置手动提交 set @@autocommit = 0; 默认是1 ;
#事务的四个特征 #
1. 原子性 :不可分割的最小单位 要么同时成功要么同时失败
2. 持久性:事务提交之后或者回滚之后, 数据库会持久化的保存数据
3. 隔离性:多个事务之间相互独立;
4. 一致性:事务操作前后, 数据的总量是不变的,例如转账 钱的总数是不变的;
# 事务的隔离级别 #
概念:多个事务之间是相互独立的, 但是多个事务之间操作同一个数据; 设置不同的隔离级别 就可以解决这个些问题 ,问题如下:
1. 脏读:一个是事务读取
到另一个事务中没有提交的事务; 2. 不可重复读:在同一个事务中 ,两次读取的数据不一样 3. 幻读:第一个事务操作 修改了数据表中的所有内容, 另外一个事务添加了数据,但是第一个事务查询不到自己的修改; ## 事务的隔离级别 ##
1. read uncommitted; 读未提交 会出现上述的三种问题
2. read committed: 读已提交 会出现不可重复读 和幻读
3. repeatable read:可以重复读
4. serializable 串行化;可以解决所有的问题
----------
5. 数据库默认的是repeatable read 可以 重复读
6. 数据库设置隔离级别:set gloabal transaction isolation level 隔离级别;
7.
DCL
-- DCL 管理用户
-- 管理用户
use mysql;
select * from user;
-- create user 'zhangsan'@'Localhost' identified by '123'
create user 'zhangsan'@'%' identified by '123'; -- 创建用户 可以在任何主机上登录 用户名 zhangsan 密码:123
-- 删除用户
drop user 'zhangsan'@'%';
-- 修改用户的密码
select * from user;
-- update user set PASSWORD = password('root') where user ='123';
set password for 'root'@'localhost' = password('root');-- 更改密码
忘记了root 用户的密码
-- 1》 net stop mysql (使用管理员身份运行)
-- 2,启动mysql服务 使用无验证 的方式 mysqld -- skip-grant-talbles
-- 3,在新的窗口启动mysql 输入mysql 即可
-- 4. set password for 'root'@'localhost' = password('root');-- 更改密码
-- 5,使用任务管理器 关闭mysqld 服务alter
-- 6. 使用cmd 打开mysql 服务 就可以登录了
-- 对用户进行权限的管理a
-- 查询权限
show grants for 'root'@'%';
grant all on *.* to 'root'@'%'; -- 给用户 所用的权限操作任意数据库alter
grant delete, update ,select on db3.stu to 'liansi'@'localhost'; -- 授予权限 给那个数据库 中的表
-- 撤销权限
-- revoke 权限列表 on 数据库。表名 from 用户名@主机名
revoke select ,delete on db3.stu from 'liansi'@'localhost';
-- revoke all ON *.* from 'liansi'@'localhost';