diff --git "a/16 \351\230\231\350\213\217\346\226\207/20231019\344\272\213\345\212\241\344\275\234\344\270\232.md" "b/16 \351\230\231\350\213\217\346\226\207/20231019\344\272\213\345\212\241\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..b6c98996ddeff180f7880d210773920069c59e7b --- /dev/null +++ "b/16 \351\230\231\350\213\217\346\226\207/20231019\344\272\213\345\212\241\344\275\234\344\270\232.md" @@ -0,0 +1,137 @@ +# 笔记 + +#### 事务 + + 数据库中的事务是指对数据库执行一批操作,在同一个事务中,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。 + +##### 事务的几个特性(ACID) + +1.原子性(Atomicity) + +2.一致性(Consistency) + +3.隔离性(Isolation) + +4.持久性(Durability) + +##### 事务分为隐式事务和显式事务 + + 1.隐式事务:事务的自动开启,提交或回滚,由mysql内部自动控制 + +``` +-- 查看变量autocommit是否开启了自动提交、 + show variables like 'autocommit';(为ON表示开启了自动提交) +``` + + 2.显式事务:事务需要手动开启,提交或回滚,由开发者自己控制 + +``` +-- 设置不自动提交事务 + set autocommit = 0(off); +-- 开启事务 + start transaction; +-- 执行事务操作 + commit;(提交事务) + rollback;(回滚事务) +``` + +##### savepoint关键字 + +``` + savepoint p1; -- 设置一个保存点 + rollback to p1; -- 将p1到当前句的语句全部回滚 +-- 只读事务 + start transaction read only; +``` + +##### 事务中的一些问题 + +##### 更新丢失,脏读,读已提交,不可重复读,可重复读,幻读 + +# 作业 + +```mysql +-- Sql12练习 +-- 建表语句: +-- 执行以下SQL,建表插数: +-- 部门表 +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 distinct job,min(sal) over (partition by job) from emp where sal > 1500; +-- +-- 2、列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。 +select d.dname,e.ename from emp e,dept d where e.deptno= d.deptno and d.dname='销售部'; +select d.dname,e.ename from emp e,dept d where e.deptno = d.deptno and d.dname = '销售部'; +-- +-- 3、列出薪金高于公司平均薪金的所有员工。 +select avg(sal) from emp; +select ename,sal from emp where sal>(select avg(sal) from emp); +-- +-- 4、列出与"周八"从事相同工作的所有员工。 +select job from emp where ename = '周八'; +select ename from emp where ename !='周八' and job=(select job from emp where ename = '周八'); +select ename,job from emp where ename!='周八' and job=(select job from emp where ename ='周八'); +-- +-- 5、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 +select sal from emp where deptno=30; +select ename,sal from emp e,dept d where d.deptno=e.deptno and sal in (select sal from emp where deptno=30); +-- +-- 6、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 +select max(sal) from emp where deptno=30; +select ename,sal from emp where sal>(select max(sal) from emp where deptno=30); +-- +-- 7、列出在每个部门工作的员工数量、平均工资、平均服务年限 +select count(empno) over (PARTITION by deptno) 员工数量,avg(sal) over (PARTITION by deptno), avg(hiredate) over (PARTITION by deptno) 平均服务年限 from emp ; +-- +-- 8、列出所有员工的姓名、部门名称和工资。 +select e.ename,d.dname,e.sal from emp e,dept d where e.deptno=d.deptno; +-- +-- 9、列出所有部门的详细信息和部门人数。 +select *,count(*) over (PARTITION by dname) 部门人数 from dept d,emp e where d.deptno=e.deptno; +-- +-- 10、列出各种工作的最低工资。 +select job,min(sal) over (partition by deptno) from emp; +-- +-- 11、列出各个部门的 经理 的最低薪金。 +select deptno ,min(sal) over (PARTITION by deptno) from emp where job='经理'; +-- +-- 12、列出所有员工的年工资,按年薪从低到高排序。 +select ename,sal*12 from emp ORDER BY sal; +``` +