From 0a3b85f4177246bac8f5fd3c7ae15df0323b5423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=B0=E6=B1=9F?= <3047034182@qq.com> Date: Fri, 20 Oct 2023 12:10:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8B=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20231019\344\272\213\345\212\241.md" | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 "57 \345\210\230\346\263\260\346\261\237/20231019\344\272\213\345\212\241.md" diff --git "a/57 \345\210\230\346\263\260\346\261\237/20231019\344\272\213\345\212\241.md" "b/57 \345\210\230\346\263\260\346\261\237/20231019\344\272\213\345\212\241.md" new file mode 100644 index 0000000..7f0ffe2 --- /dev/null +++ "b/57 \345\210\230\346\263\260\346\261\237/20231019\344\272\213\345\212\241.md" @@ -0,0 +1,169 @@ +# 事务 + +显式事务:事务需要手动开启,提交或回滚,由开发者自己控制 + +隐式事务:事务自动开启,提交或回滚,比如insert, update, delete 语句,事务的开启,提交或回滚由MySQL内部自动控制 + +查看自动提交状态 + +show variables like 'atuocommit'; + +关闭自动提交状态 + +set autocommit = off; set autocommit = 0; + +开启自动提交状态 + +set autocommit = on; set autocommit = 1; + +start transaction; 不管是隐式还是显式状态,都可以手动开启一次事务 + +rollback 回滚操作,后悔的意思,就是将数据回滚到原始状态,回滚有附加确认的意思,一旦回滚,事务就结束了 + +commit 提交事务,就是将数据持久化,也就是事务的最终状态 + +rollback 告知系统,该事务由我接管 + +savepoint id6; 设置一个保存点 + +rollback to id6;回滚到保存点 + +只读事务 start transaction read only; + +隔离级别分为4种: +读未提交:READ-UNCOMMITTED +读已提交:READ-COMMITTED +可重复读:REPEATABLE-READ +串行:SERIALIZABLE + +# 作业 + +```sql +create table dept1( + deptno int primary key auto_increment, -- 部门编号 + dname varchar(14) , -- 部门名字 + loc varchar(13) -- 地址 +) ; + + +insert into dept1 values(10,'财务部','北京'); +insert into dept1 values(20,'研发部','上海'); +insert into dept1 values(30,'销售部','广州'); +insert into dept1 values(40,'行政部','深圳'); + +SELECT * FROM dept1; + +set autocommit=0; + +DELETE FROM dept1 WHERE deptno in(10,20); + +ROLLBACK; + +COMMIT; + +start transaction; + +SAVEPOINT d1; + +DELETE FROM dept1 WHERE deptno=30; + +ROLLBACK to d1; + +start transaction read only; +``` + +```sql +CREATE DATABASE a charset utf8; +use a; + +-- 部门表 +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 empno FROM emp WHERE sal>1500 +SELECT job,min(sal) FROM emp WHERE empno in(SELECT empno FROM emp WHERE sal>1500 +) GROUP BY job +-- 2、列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。 +-- +SELECT deptno FROM dept WHERE dname='销售部' +SELECT ename FROM emp WHERE deptno in(SELECT deptno FROM dept WHERE dname='销售部' +); +-- 3、列出薪金高于公司平均薪金的所有员工。 +-- +SELECT avg(sal) FROM emp; +SELECT ename,sal FROM emp HAVING sal>(SELECT avg(sal) FROM emp +) +-- 4、列出与"周八"从事相同工作的所有员工。 +-- +SELECT job FROM emp WHERE ename='周八' + +SELECT * FROM emp WHERE job in(SELECT job FROM emp WHERE ename='周八' +); +-- 5、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 +-- +SELECT sal FROM emp WHERE deptno=30 +SELECT ename,sal FROM emp WHERE sal in(SELECT sal FROM emp WHERE deptno=30 +)and deptno!=30; +-- 6、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 +-- +SELECT emp.ename,emp.sal FROM emp WHERE emp.sal >(SELECT max(sal) FROM emp WHERE deptno=30 +)and emp.deptno!=30; +-- 7、列出在每个部门工作的员工数量、平均工资、平均服务年限。 +-- +SELECT count(empno),avg(DATEDIFF(NOW(),hiredate))/365,avg(sal) FROM emp right join dept on emp.deptno=dept.deptno GROUP BY dname +-- 8、列出所有员工的姓名、部门名称和工资。 +-- +SELECT ename,dname,sal FROM emp right join dept on emp.deptno=dept.deptno + +-- 9、列出所有部门的详细信息和部门人数。 +-- +SELECT dept.*,count(empno) FROM emp right join dept on emp.deptno=dept.deptno GROUP BY deptno + +-- 10、列出各种工作的最低工资。 +-- +SELECT job,min(sal) FROM emp GROUP BY job; +-- 11、列出各个部门的 经理 的最低薪金。 +-- +select deptno,min(sal) from emp where job="经理" group by deptno; +-- 12、列出所有员工的年工资,按年薪从低到高排序。 +select ename,(sal+ifnull(comm,0))*12 yearsal from emp order by yearsal; +``` \ No newline at end of file -- Gitee