diff --git "a/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\344\272\213\345\212\241.md" "b/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\344\272\213\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..969aca853b0f18ad60be62b1e3ef13940dd335f4 --- /dev/null +++ "b/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\344\272\213\345\212\241.md" @@ -0,0 +1,174 @@ +## 事务 + +### 事务的特性 + +原子性、一致性、隔离性、持久性 + +### 事务操作 + +mysql中事务默认是隐式事务,执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务 + +是否开启隐式事务是由变量autocommit控制的 + +所以事务分为**隐式事务**和**显式事务** + +#### 隐式事务 + +事务自动开启、提交或回滚,比如insert、update、delete语句,事务的开启、提交或回滚由mysql内部自动控制的。 + +查看变量autocommit是否开启了自动提交 + +#### 显式事务 + +事务需要手动开启、提交或回滚,由开发者自己控制。 + +```mysql +-- 显示所有的系统变量 +show variables; + +-- 查看autocommit状态 +show variables like 'autocommit'; + +-- 显式事务(手动提交,关闭系统自动) +set autocommit=off; +set autocommit=0; + +rollback; -- 撤销,可以保留数据 +commit; -- 提交数据 + +-- 隐式事务(自动提交,开启系统自动) +set autocommit=on; +set autocommit=1; + +rollback; -- 撤销,不保留数据,因为系统已经自动commit +``` + +```mysql +-- 开启事务 +start transaction; +-- 结束事务 +rollback / commit; +``` + +### savepoint关键字 + +可以将一大批操作分为几个部分,然后指定回滚某个部分。 + +```mysql +-- 在事务中途使用 +savepoint 保存名; + +-- 追溯回去 +rollback to 保存名; +``` + +### 只读事务 + +表示在事务中执行的是一些只读操作,如查询,但是不会做insert、update、delete操作,数据库内部对只读事务可能会有一些性能上的优化 + +```mysql +start transaction read only; +``` + +#### 脏读 + +#### 读已提交 + +#### 可重复读 + +#### 幻读 + +### 隔离级别 + +隔离级别分为4种: + +```mysql +读未提交:READ-UNCOMMITTED +读已提交:READ-COMMITTED +可重复读:REPEATABLE-READ +串行:SERIALIZABLE +``` + + + +## 作业 + +```mysql +-- 部门表 +create table dept( + deptno int primary key auto_increment, -- 部门编号 + dname varchar(14) , -- 部门名字 + loc varchar(13) -- 地址 +) ; +-- 员工表 +create table emp( + empno int primary key auto_increment,-- 员工编号 + ename varchar(10), -- 员工姓名 - + job varchar(9), -- 岗位 + mgr int, -- 直接领导编号 + hiredate date, -- 雇佣日期,入职日期 + sal int, -- 薪水 + comm int, -- 提成 + deptno int not null, -- 部门编号 + foreign key (deptno) references dept(deptno) +); +insert into dept values(10,'财务部','北京'); +insert into dept values(20,'研发部','上海'); +insert into dept values(30,'销售部','广州'); +insert into dept values(40,'行政部','深圳'); +insert into emp values(7369,'刘一','职员',7902,'1980-12-17',800,null,20); +insert into emp values(7499,'陈二','推销员',7698,'1981-02-20',1600,300,30); +insert into emp values(7521,'张三','推销员',7698,'1981-02-22',1250,500,30); +insert into emp values(7566,'李四','经理',7839,'1981-04-02',2975,null,20); +insert into emp values(7654,'王五','推销员',7698,'1981-09-28',1250,1400,30); +insert into emp values(7698,'赵六','经理',7839,'1981-05-01',2850,null,30); +insert into emp values(7782,'孙七','经理',7839,'1981-06-09',2450,null,10); +insert into emp values(7788,'周八','分析师',7566,'1987-06-13',3000,null,20); +insert into emp values(7839,'吴九','总裁',null,'1981-11-17',5000,null,10); +insert into emp values(7844,'郑十','推销员',7698,'1981-09-08',1500,0,30); +insert into emp values(7876,'郭十一','职员',7788,'1987-06-13',1100,null,20); +insert into emp values(7900,'钱多多','职员',7698,'1981-12-03',950,null,30); +insert into emp values(7902,'大锦鲤','分析师',7566,'1981-12-03',3000,null,20); +insert into emp values(7934,'木有钱','职员',7782,'1983-01-23',1300,null,10); + + + +-- 1、列出最低薪金大于1500的各种工作。 +select job from emp group by job having min(sal)>1500; + +-- 2、列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。 +select ename from emp,dept where dname='销售部'; + +-- 3、列出薪金高于公司平均薪金的所有员工。 +select ename,sal from emp where sal>(select avg(sal) from emp); + +-- 4、列出与"周八"从事相同工作的所有员工。 +select ename,job from emp where job=(select job from emp where ename='周八'); + +-- 5、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 +select ename,sal from emp where sal in (select distinct sal from emp where deptno=30); + +-- 6、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 +select ename,sal from emp where sal > (select max(sal) from emp where deptno=30); + +-- 7、列出在每个部门工作的员工数量、平均工资、平均服务年限。 +select count(empno) 员工数量,avg(sal) 平均工资,avg(datediff(now(),hiredate)) div 365 平均服务年限 from emp group by deptno; + +-- 8、列出所有员工的姓名、部门名称和工资。 +select ename,dname,sal from emp e join dept d on e.deptno=d.deptno; + +-- 9、列出所有部门的详细信息和部门人数。 +select count(empno) 部门人数,d.* from emp e left join dept d on e.deptno=d.deptno group by deptno; + +-- 10、列出各种工作的最低工资。 +select job,min(sal) over (partition by job) 最低工资 from emp; + +select job,min(sal) from emp group by job; + +-- 11、列出各个部门的 经理 的最低薪金。 +select min(sal) 最低薪金 from emp where job='经理' group by deptno; + +-- 12、列出所有员工的年工资,按年薪从低到高排序。 +select ename,sal*12 from emp order by sal*12; + +``` \ No newline at end of file diff --git "a/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\345\244\215\344\271\240.md" "b/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..0111d99a906be4804c78e2813dcbfc0024dbff6b --- /dev/null +++ "b/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\345\244\215\344\271\240.md" @@ -0,0 +1,11 @@ +## 补充 + +### timestampdiff(单位,a,b) + +``` +单位:year、month、day、hour、minute、second、miscrosecond +a为下 +b为大 +向下取整,满24小时为一天 + +``` \ No newline at end of file diff --git "a/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\346\225\260\346\215\256\345\272\223\344\270\211\345\244\247\350\214\203\345\274\217\357\274\210\350\247\204\345\210\231\357\274\211.md" "b/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\346\225\260\346\215\256\345\272\223\344\270\211\345\244\247\350\214\203\345\274\217\357\274\210\350\247\204\345\210\231\357\274\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..7234d911afd6b15347cd58026f6dddf06e300ecd --- /dev/null +++ "b/19\345\275\255\345\213\207\346\226\214/\347\254\224\350\256\260/\346\225\260\346\215\256\345\272\223\344\270\211\345\244\247\350\214\203\345\274\217\357\274\210\350\247\204\345\210\231\357\274\211.md" @@ -0,0 +1,137 @@ +## 数据库三大范式(规则) + +### 第一范式 + +要求字段内容不可再分割,为保证数据原子性 + +例如地址信息表,一个地址可以拆分为省、市、区、街道和详细地址 + +### 第二范式 + +要求在满足第一范式的基础上,要求非主键字段要完全依赖主键(非主键要依赖整个联合主键)而不能只依赖部分 + +例如成绩表,学生学号和课程编号在成绩表中缺一不可 + +| 学号 | 姓名 | 年龄 | 课程名称 | 成绩 | 学分 | +| ---- | ---- | ---- | -------- | ---- | ---- | +| | | | | | | + +1. 假设学号是表中的唯一主键,那由学号就可以确定姓名和年龄了,但是却不能确定课程名称和成绩 + +2. 假设课程名称是表中的唯一主键,那由课程名称就可以确定学分了,但是却不能确定姓名、年龄和成绩 + +3. 虽然通过学号和课程名称的联合主键,可以确定除联合主键外的所有的非主键值,但是基于上述两个假设,也不符合第二范式的要求 + +所以把表拆分开才会符合第二范式的要求 + +学生表 - 学号做主键 + +课程表 - 课程名称做主键 + +成绩表 - 学号和课程名称做联合主键 + +### 第三范式 + +满足第二范式的前提,要求非主键属性要直接依赖于主键 + +| 学号 | 姓名 | 班级 | 班主任 | +| ---- | ---- | ---- | ------ | +| | | | | + +这个表中,学号是主键,它可以唯一确定姓名、班级、班主任,符合了第二范式,但是在非主键字段中,我们也可以通过班级推导出该班级的班主任,所以它是不符合第三范式的 + +学生表 + +| 学号 | 姓名 | 班级 | +| ---- | ---- | ---- | +| | | | + +班级表 + +| 班级 | 班主任 | +| ---- | ------ | +| | | + +通过把班级与班主任的映射关系另外做成一张映射表,我们就成功地消除了表中的传递依赖了 + +```mysql +create database school charset utf8; + +use school; + +# 院系 +create table department( + de_id int primary key auto_increment, + de_name varchar(10) +); + +# 专业 +create table major( + ma_id int primary key auto_increment, + ma_name varchar(10), + de_id int, + foreign key (de_id) references department(de_id) +); + +# 班级 +create table clazz( + cla_id int primary key auto_increment, + cla_name varchar(10), + ma_id int, + foreign key (ma_id) references major(ma_id) +); + +# 学生 +create table student( + st_id int primary key auto_increment, + st_name varchar(10), + st_sex char(1), + cla_id int, + foreign key (cla_id) references clazz(cla_id) +); + +# 课程 +create table course( + cou_id int primary key auto_increment, + cou_name varchar(10), + t_id int, + foreign key (t_id) references teacher (t_id) +); + +# 学生+课程 +create table performance( + id int primary key auto_increment, + st_id int, + foreign key (st_id) references student(st_id), + cou_id int, + foreign key (cou_id) references course(cou_id), + score int +); + +# 教师 +create table teacher( + t_id int primary key auto_increment, + t_name varchar(10) +); + +# 教室 +create table classroom( + r_id int primary key auto_increment, + r_nsme varchar(10) +); + +# 班级+课程+教室+教室 +create table timetable( + time_id int primary key auto_increment, + time varchar(255), + cla_id int, + foreign key (cla_id) references clazz(cla_id), + cou_id int, + foreign key (cou_id) references course(cou_id), + t_id int, + foreign key (t_id) references teacher (t_id), + r_id int , + foreign key (r_id) references classroom (r_id) +); + +``` \ No newline at end of file