目录
- -- ---------------------------------------> 多表查询案例 <----------------------------------
- create table salgrade(
- grade int,
- losal int,
- hisal int
- ) comment '薪资等级表';
-
- insert into salgrade values (1,0,3000);
- insert into salgrade values (2,3001,5000);
- insert into salgrade values (3,5001,8000);
- insert into salgrade values (4,8001,10000);
- insert into salgrade values (5,10001,15000);
- insert into salgrade values (6,15001,20000);
- insert into salgrade values (7,20001,25000);
- insert into salgrade values (8,25001,30000);
-
-
- 1. 查询员工的姓名、年龄、职位、部门信息 (隐式内连接)
- -- 表: emp , dept
- -- 连接条件: emp.dept_id = dept.id
-
- select e.name , e.age , e.job , d.name from emp e , dept d where e.dept_id = d.id;
-
-
- 2. 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)
- -- 表: emp , dept
- -- 连接条件: emp.dept_id = dept.id
-
- select e.name , e.age , e.job , d.name from emp e inner join dept d on e.dept_id = d.id where e.age < 30;
-
-
- 3. 查询拥有员工的部门ID、部门名称
- -- 表: emp , dept
- -- 连接条件: emp.dept_id = dept.id
-
- select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id;
-
-
-
- 4. 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来
- -- 表: emp , dept
- -- 连接条件: emp.dept_id = dept.id
- -- 外连接
-
- select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40 ;
-
-
- 5. 查询所有员工的工资等级
- -- 表: emp , salgrade
- -- 连接条件 : emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal
-
- select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary >= s.losal and e.salary <= s.hisal;
-
- select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary between s.losal and s.hisal;
-
-
- 6. 查询 "研发部" 所有员工的信息及 工资等级
- -- 表: emp , salgrade , dept
- -- 连接条件 : emp.salary between salgrade.losal and salgrade.hisal , emp.dept_id = dept.id
- -- 查询条件 : dept.name = '研发部'
-
- select e.* , s.grade from emp e , dept d , salgrade s where e.dept_id = d.id and ( e.salary between s.losal and s.hisal ) and d.name = '研发部';
-
-
-
- 7. 查询 "研发部" 员工的平均工资
- -- 表: emp , dept
- -- 连接条件 : emp.dept_id = dept.id
-
- select avg(e.salary) from emp e, dept d where e.dept_id = d.id and d.name = '研发部';
-
-
-
- 8. 查询工资比 "灭绝" 高的员工信息。
- -- a. 查询 "灭绝" 的薪资
- select salary from emp where name = '灭绝';
-
- -- b. 查询比她工资高的员工数据
- select * from emp where salary > ( select salary from emp where name = '灭绝' );
-
-
- 9. 查询比平均薪资高的员工信息
- -- a. 查询员工的平均薪资
- select avg(salary) from emp;
-
- -- b. 查询比平均薪资高的员工信息
- select * from emp where salary > ( select avg(salary) from emp );
-
-
-
- 10. 查询低于本部门平均工资的员工信息
-
- -- a. 查询指定部门平均薪资 1
- select avg(e1.salary) from emp e1 where e1.dept_id = 1;
- select avg(e1.salary) from emp e1 where e1.dept_id = 2;
-
- -- b. 查询低于本部门平均工资的员工信息
- select * from emp e2 where e2.salary < ( select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id );
-
-
- 11. 查询所有的部门信息, 并统计部门的员工人数
- select d.id, d.name , ( select count(*) from emp e where e.dept_id = d.id ) '人数' from dept d;
-
- select count(*) from emp where dept_id = 1;
-
-
- 12. 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称
- -- 表: student , course , student_course
- -- 连接条件: student.id = student_course.studentid , course.id = student_course.courseid
-
- select s.name , s.no , c.name from student s , student_course sc , course c where s.id = sc.studentid and sc.courseid = c.id ;
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
方式一
方式二
- -- ---------------------------- 事务操作 ----------------------------
- -- 数据准备
- create table account(
- id int auto_increment primary key comment '主键ID',
- name varchar(10) comment '姓名',
- money int comment '余额'
- ) comment '账户表';
- insert into account(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);
-
-
- -- 恢复数据
- update account set money = 2000 where name = '张三' or name = '李四';
-
-
- select @@autocommit;
-
- set @@autocommit = 0; -- 设置为手动提交
-
- 转账操作 (张三给李四转账1000)
- -- 1. 查询张三账户余额
- select * from account where name = '张三';
-
- -- 2. 将张三账户余额-1000
- update account set money = money - 1000 where name = '张三';
-
- 程序执行报错 ...
-
- -- 3. 将李四账户余额+1000
- update account set money = money + 1000 where name = '李四';
-
-
- -- 提交事务
- commit;
-
- -- 回滚事务
- rollback ;
-
-
-
- 方式二
- -- 转账操作 (张三给李四转账1000)
- start transaction ;
-
- -- 1. 查询张三账户余额
- select * from account where name = '张三';
-
- -- 2. 将张三账户余额-1000
- update account set money = money - 1000 where name = '张三';
-
- 程序执行报错 ...
-
- -- 3. 将李四账户余额+1000
- update account set money = money + 1000 where name = '李四';
-
-
- -- 提交事务
- commit;
-
- -- 回滚事务
- rollback;


-
- -- 查看事务隔离级别
- select @@transaction_isolation;
-
- -- 设置事务隔离级别
- set session transaction isolation level read uncommitted ;
-
- set session transaction isolation level repeatable read ;