From 56d31b038d2cee54245941218ac65b78c9a94626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=B5=B7=E7=91=9E?= <3148024859@qq.com> Date: Fri, 20 Oct 2023 01:07:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC24=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20231019 \344\272\213\345\212\241.md" | 143 ++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 "50 \345\274\240\350\265\267\347\221\236/20231019 \344\272\213\345\212\241.md" diff --git "a/50 \345\274\240\350\265\267\347\221\236/20231019 \344\272\213\345\212\241.md" "b/50 \345\274\240\350\265\267\347\221\236/20231019 \344\272\213\345\212\241.md" new file mode 100644 index 0000000..fbbb6b9 --- /dev/null +++ "b/50 \345\274\240\350\265\267\347\221\236/20231019 \344\272\213\345\212\241.md" @@ -0,0 +1,143 @@ +#### 事务的概念: + +```mysql +数据库中的事务是指对数据库执行一批操作,在同一个事务当中,这些操作要么全部执行成功,要么全部失败,不会存在部分成功的情况。 +``` + +#### 事务的几个特性: + +```mysql +原子性,一致性,隔离性,持久性 +隔离性分为: +读未提交:read uncommitted +读已提交:read committed +可重复读:repeatable read +串行化:serializable +``` + +#### MySQL中事务操作: + +```mysql +隐式事务:事务自动开启提交或回滚,比如insert,update,delete语句,事务的开启,提交或回滚由MySQL内部自动控制的。 +autocommit为on表示开启了自动提交。 +显示事务: +事务需要手动开启,提交或回滚,由开发者自己控制。 +设置不自动提交事务即关闭自动提交:set autocommit=0; +执行事务操作:commit rollback +开启事务:start transaction +``` + +#### savepoint关键字: + +```mysql +在事务中将一大批操作分为几个部分,然后回滚某个部分可以用savepoint来实现 +格式为: +state transaction, +insert into test1 value(1), +savepoint part1,//设置一个保存点 +insert into test1 value(2) +rollback to part1//将savepoint=part1的语句到当前语句之间所有的操作回滚 +commit//提交事务 +select* from test1; +savepoint需要结合将rollback to sp1一起使用,可以将保存点sp1到rollback to 之间的操作回滚掉 +``` + +#### 只读事务: + +```mysql +start transaction read only; +``` + +```mysql +建表语句: +执行以下SQL,建表插数: +create database test_10119 charset utf8; +use test_10119; +-- 部门表 +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,min(sal) from emp where sal>1500 group by job; + + +2、列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。 +select e.ename from emp e LEFT JOIN dept d on e.deptno=d.deptno where dname='销售部'; + +3、列出薪金高于公司平均薪金的所有员工。 + +select * from emp where sal>(select avg(sal) from emp); +4、列出与"周八"从事相同工作的所有员工。 + +select * from emp where job = (select job from emp where ename = '周八'); + +5、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 +select ename,sal from emp where sal in (select 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 + deptno 部门, + count(empno) 员工数量, + avg(sal) 平均工资, + avg(timestampdiff(year,hiredate,now())) 平均服务年限 +from emp group by deptno; +8、列出所有员工的姓名、部门名称和工资。 +select + emp.ename 姓名, + dept.dname 部门名称, + emp.sal+ifnull(comm,0) 工资 +from emp,dept where emp.deptno = dept.deptno; +SELECT ename,de.dname,sal FROM emp e left JOIN dept de ON e.deptno=de.deptno; +9、列出所有部门的详细信息和部门人数。 +SELECT e.deptno,de.dname,COUNT(*) FROM emp e LEFT JOIN dept de ON de.deptno=e.deptno GROUP BY deptno; +10、列出各种工作的最低工资。 +select + distinct job 工作, + min(sal+ifnull(comm,0)) over (partition by job) 最低工资 +from emp; + 11、列出各个部门的 经理 的最低薪金。 +select + deptno 部门, + min(sal) over (partition by deptno) 经理的最低薪金 +from emp where job = '经理'; +12、列出所有员工的年工资,按年薪从低到高排序。 +select ename 姓名,(sal+ifnull(comm,0))*12 年薪 from emp order by 年薪; +``` + + + -- Gitee