数据库(二)

连接查询

                  						内     连接
select ... from 表1 inner join 表2 on 连接条件 WHERE ... group by ... HAVING ... ORDER BY ... limit ... (重点)

                     				 左    外  
select ... from 表1 left [outer] join 表2 on 连接条件 (重点)

                      				右    外
select ... from 表1 right [outer] join 表2 on 连接条件

                      全
select ... from 表1 full join 表2 on 连接条件 (mysql不支持全连接)

例 :

//通过学生id将学生姓名和成绩连接起来
select * from sc a inner join student b on a.sid = b.sid;

select * from sc a left join student b on a.sid =b.sid;
select * from sc a right join student b on a.sid =b.sid;

注意
1) 内连接是将两张表中所有符合连接条件的数据列入结果,不符合连接条件的结果中没有,例如40号部门
2) 如果连接的两表中有同名的列,列前面要加表名(或表别名)来区分(否则会报歧义错误)
3) inner join ... on 的写法是符合SQL-92标准写法,其实还有一种内连接的写法:
select ... from 表1, 表2 where 连接条件;

例 :

select * from sc a,student b where a.sid =b.sid;

注意
左外连接时,首先将符合连接条件的记录连在一起,作为结果,其次左边表中不符合连接条件的记录也会出现在结果中,只不过它对应的右边的列都是NULL,右外反之
内连接则与表的先后次序无关

多表连接

select * from 表1 
	inner join 表2 on 连接条件
	inner join 表3 on 连接条件
	....(也可以全部左外或者全部)

注意
连接的表越多,性能越低, 可以把连接查询变成分多次查询

自连接

同一个表里自己和自己连接,常用于树状结构的数据表示
例如 :
//找到员工的姓名和上级的姓名
select a.empno,a.ename,a.mgr,b.empno,b.ename,b.mgr
from emp a left join emp b on a.mgr=b.empno;

子查询

把某个select结果当做一个值,或一张表做进一步的查询

  1. 找最高工资的员工信息(子查询为值)
select * from emp where sal = (select max(sal) from emp);
  1. 获取每个部门的平均工资和部门的名称(子查询作为表)
elect * from (select deptno,avg(sal) from emp group by deptno)a inner join dept b on a.deptno=b.deptno;
  1. 把子查询当做一个函数(不重要)

TCL

start transaction 开始事务 (begin)
commit 提交事务
rollback 回滚事务

账户表account
ID balance(余额)
1 50000.0
2 0.0
create table account (
id int primary key,
balance decimal(12,2) not null
);
insert into account(id,balance)values(1,50000.0),(2,0.0);

以下两条sql必须作为一个整体执行, 要么都成功,其中有一条失败,前面成功的也得撤销
update account set balance=balance+10000.0 where id=2; /2号账户转入10000元/ 成功
update account set balance=balance-10000.0 where id=1; /1号账户转出10000元/

所谓的事务,就是指一个事务内,多条sql语句是作为一个整体执行的。
一个事务内的多条sql是作为一个原子操作,不可以被分割。要么都成功,要么都不成功。

事务内所有更改,在结束之前,对于其它用户来讲都是不可见的。
commit提交,rollback撤回,两者都意味着事务结束

事务基本要素
1、原子性(Atomicity) : 事务内多条sql是作为一个整体执行,像原子一样不可分割

2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
级别 : 未提交读->不可重复读->可重复读->串行化

4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

事务并发问题
1、脏读(读取到了未提交的数据):事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读(避免脏读,隔离级别升级为提交读但是不可重复读(再次升级为可重复读可以避免)):事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读(可以提高隔离级别为序列化读,可避免幻读现象):系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

猜你喜欢

转载自blog.csdn.net/Wolves_7/article/details/81986076