建立一个 grade 表代表学生的成绩等级,并插入数据:
查询所有学生的 s_no 、c_no 和 grade 列 。
思路是,使用区间 ( BETWEEN ) 查询,判断学生的成绩 ( degree ) 在 grade 表的 low 和 upp 之间 。
准备用于测试连接查询的数据:
分析两张表发现 , person 表并没有为 cardId 字段设置一个在 card 表中对应的 id 外键 。如果设置了的话,person 中 cardId 字段值为 6 的行就插不进去,因为该 cardId 值在 card 表中并没有 。
要查询这两张表中有关系的数据,可以使用 INNER JOIN ( 内连接 ) 将它们连接在一起 。
完整显示左边的表 ( person ) , 右边的表如果符合条件就显示,不符合则补 NULL。
完整显示右边的表 ( card ) ,左边的表如果符合条件就显示,不符合则补 NULL。
完整显示两张表的全部数据 。
在 MySQL 中,事务其实是一个最小的不可分割的工作单元 。事务能够保证一个业务的完整性。
比如我们的银行转账:
在实际项目中 , 假设只有一条 SQL 语句执行成功,而另外一条执行失败了,就会出现数据前后不一致 。
因此,在执行多条有关联 SQL 语句时,事务可能会要求这些 SQL 语句要么同时执行成功 , 要么就都执行失败 。
在 MySQL 中,事务的自动提交状态默认是开启的 。
自动提交的作用:当我们执行一条 SQL 语句的时候,其产生的效果就会立即体现出来,且不能回滚。
什么是回滚?举个例子:
可以看到,在执行插入语句后数据立刻生效,原因是 MySQL 中的事务自动将它提交到了数据库中 。那么所谓回滚的意思就是,撤销执行过的所有 SQL 语句,使其回滚到最后一次提交数据时的状态 。
在 MySQL 中使用 ROLLBACK 执行回滚:
由于所有执行过的 SQL 语句都已经被提交过了,所以数据并没有发生回滚 。那如何让数据可以发生回滚?
将自动提交关闭后,测试数据回滚:
那如何将虚拟的数据真正提交到数据库中?使用 COMMIT :
事务的实际应用,让我们再回到银行转账项目:
这时假设在转账时发生了意外,就可以使用 ROLLBACK 回滚到最后一次提交的状态:
这时我们又回到了发生意外之前的状态,也就是说,事务给我们提供了一个可以反悔的机会 。假设数据没有发生意外,这时可以手动将数据真正提交到数据表中:COMMIT。
事务的默认提交被开启 ( @@AUTOCOMMIT = 1 ) 后,此时就不能使用事务回滚了 。但是我们还可以手动开启一个事务处理事件,使其可以发生回滚:
仍然使用 COMMIT 提交数据,提交后无法再发生本次事务的回滚 。
事务的四大特征:
事务的隔离性可分为四种 ( 性能从低到高 ):
查看当前数据库的默认隔离级别:
修改隔离级别:
测试READ UNCOMMITTED ( 读取未提交 )的隔离性:
由于小明的转账是在新开启的事务上进行操作的,而该操作的结果是可以被其他事务(另一方的淘宝店)看见的,因此淘宝店的查询结果是正确的,淘宝店确认到账 。但就在这时,如果小明在它所处的事务上又执行了 ROLLBACK 命令,会发生什么?
这就是所谓的脏读,一个事务读取到另外一个事务还未提交的数据 。这在实际开发中是不允许出现的 。
把隔离级别设置为READ COMMITTED:
这样 , 再有新的事务连接进来时,它们就只能查询到已经提交过的事务数据了 。但是对于当前事务来说,它们看到的还是未提交的数据 , 例如:
但是这样还有问题,那就是假设一个事务在操作数据时,其他事务干扰了这个事务的数据 。例如:
推荐阅读
- 福建海洋货物运输代理平台,福建省海运集团有限责任公司
- java记事本代码实现,java编写记事本程序
- 怎样删除阿里云服务器,怎样删除阿里云服务器数据
- 永济网红直播,道德经待人之道
- c语言用函数实现阶乘 c语言定义函数实现阶乘求和
- html5网站前端,前端web页面
- ios8如何安装最新微信,苹果ios8怎么下载微信
- 直播场景素材图,直播场景素材图片大全
- 什么函数可以使c语言暂停 c语言暂停语句