第一回 子查询
1.非关联子查询
如果子查询只执行一次,然后子查询的结果集会作为外部查询的条件进行判断,那么这样的子查询叫做非关联子查询。
标量子查询:查询单个记录的单个字段
矢量子查询:查询整个字段
2.关联子查询
如果子查询依赖于外部查询,通常情况下是因为子查询用到了外部查询的某些字段。 因此,每执行一次外部查询,子查询都要重新执行一次,这样的子查询叫做关联子查询。
3. Exists
关联子查询可能会搭配 `EXISTS` 关键字一起使用。`EXISTS` 用来判断子查询的结果集是否为空集。如果不为空集返回True,如果为空集返回 False。
4. 集合比较子查询
in:存在于为真
some(any):集合中存在满足于判断条件元素为真
all:集合中任意均满足判断条件为真
5.子查询作为计算字段存在
# 举个例子:查询每个球队的名称,和它们的球员数。
select team_id, team_name, (
select count ( * ) from player where player. team_id = team. team_id
) as 'team_nums' from team;
select team_id, team_name, team_nums
from team left join (
select team_id, count ( * ) as team_nums
from player group by team_id
) as t using ( team_id) ;
第二回 事务
1. 事务的基本操作
开启事务
start transaction;
begin ;
MySQL默认开启了自动提交,每条SQL语句都会被当成一个事务执行。
set @@autocommit=0; 相当于开启事务
提交事务
commit;
设置回滚点
savepoint sp;
删除回滚点
release savepoint sp;
回滚事务
rollback ; 回滚到事务开启前的状态
rollback to sp; 回滚到回滚点
事务正确执行的四要素
原子性(atomicity),一致性(consistency),隔离性(isolation)和持久性(durability)。
不同的隔离级别分别解决了哪些问题?
脏写 脏读 不可重复读 幻读 read uncommitted N Y Y Y read committed N N Y Y repeatable read N N N Y serializable N N N N
select @@tx_isolation; 查看会话的隔离级别
select @@session.tx_isolation; 查看会话的隔离级别
select @@global.tx_isolation; 查看系统的级别
MySQL默认的隔离级别 Repeatable Read
set transaction isolation level read uncommitted; 设置下一个事务的隔离级别
set session transaction isolation level read uncommitted; 设置会话的隔离级别
set global transaction isolation level serializable; 设置系统的隔离级别
注意事项:
a. MySQL实现了4中隔离级别, 默认隔离级别是RR
b. MySQL RR隔离级别实现比较特殊,能够在大多数情况下避免幻读现象出现.
c. Oracle只实现read committed, serializable两种隔离级别,默认隔离级别是read committed.