一、多表查询
1.笛卡尔积:
- 概念:有两个集合A,B 。取这两个集合的所有组成情况。
- 要完成多表查询,需要消除无用数据。
2.多表查询分类
- 1.内连接查询
- 1.隐式内连接:使用where条件消除无用数据
# 查询所有员工信息和对应的部门信息 select * from emp,dept where emp.'dept_id' = dept.'id'; # 查询员工表的名称,性别。部门表的名称 select t1.name, t1.gender, t2.name from emp t1, dept t2 where t1.'dept_id' = t2.'id';
- 2.显式内连接
- 语法:select 字段列表 from 表名1 inner join 表名2 on 条件
- 2.外连接查询
-
1.左外连接:
select 字段列表 from 表1 left outer join 表2 on 条件
- 查询的是左表所有数据以及其交集部分。
-
2.右外连接:
select 字段列表 from 表1 right outer join 表2 on 条件
-
- 3.子查询
- 1.概念:查询中嵌套查询,称嵌套查询为子查询。
- 2.例:
select * from emp where emp.'salary' = (select max(salary) from emp);
- 3.子查询不同情况
-
1.子查询的结果是单行单列的:
- 子查询可以作为条件,使用运算符去判断。
# 查询员工工资小于平均工资的人 select * from emp where emp.salary < (select avg(salary) from emp);
- 子查询可以作为条件,使用运算符去判断。
-
2.子查询的结果是多行单列的:
- 子查询可以作为条件,使用运算符in来判断。
-
3.子查询的结果是多行多列的:
-
二、事务
1.事物的基本介绍:
- 1.概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功 ,要么同时失败。
- 2.操作:
-
1.开启事务:
start transaction;
-
2.回滚:
rollback;
-
3.提交 :
commit;
-
4.例子:
CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(100), balance DOUBLE ); # 添加数据 INSERT INTO account(NAME,balance) VALUES ('zhangsan',1000), ('lisi',1000); SELECT * FROM account; # 张三给李四转账500 # 0.开启事务 START TRANSACTION; # 1.张三账户 - 500 UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan'; # 2.李四账户 + 500 UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi'; # 发现执行没有问题,提交事务 COMMIT; # 发现出问题了,回滚事务 ROLLBACK;
- 5.MySQL数据库中事务默认自动提交
- 一条DML(增删改)语句会自动提交一次事务。
- 事务提交的两种方式:
- 自动提交:MySQL就是自动提交的
- 手动提交:需要先开启事务,再提交
- 修改事务的默认提交方式:
- 查看事务的默认提交方式:
select @@autocommit; --1 代表自动提交, --0 代表手动提交
- 修改默认提交方式:
set @@autocommit = 0;
- 5.MySQL数据库中事务默认自动提交
-
2.事物的四大特征(面试常考):
- 1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 2.持久性:当事务提交或者回滚后,数据库会持久化的保存数据。
- 3.隔离性:多个事物之间,相互独立。
- 4.一致性:事务操作前后,数据总量不变。
3.事物的隔离级别
- 1.概念:多个事物之间是隔离的,互相独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
- 2.存在问题:
- 1.脏读:一个事务,读取到另一个事务中没有提交的数据。
- 2.不可重复读(虚读):在同一事务中,两次读取到的数据不一样。
- 3.幻读:一个事务操作(DML)数据表中的所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
- 3.隔离级别:
- 1.read uncommitted:读未提交
- 产生的问题:脏读,不可重复读,幻读。
- 2.read committed:读已提交 (Oracle默认)
- 产生的问题:不可重复读,幻读
- 3.repeatable read:可重复读 (MySQL默认)
- 产生的问题:不可重复读,幻读
- 4.serializable:串行化
- 可以解决所有问题
- 5.注意:隔离级别从小到大安全性越来越高,但是效率越来越低。
- 6.数据库查询隔离级别:
select @@tx_isolation;
- 7.数据库设置隔离级别:
set global transaction isolation level 级别字符串;
- 1.read uncommitted:读未提交