一、sql语句练习续集:
表结构请继续关注我的简书,以下将利用表结构进行sql语句:链接我将更新
10、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
select * from student where s_id in (select s_id from score where c_id =01)and s_id not in (select s_id from score where c_id=02);
11、查询没有学全所有课程的同学的信息
select * from student where s_id not in (select s_id from score where c_id=01) or s_id not in (select s_id from score where c_id=02) or s_id not in (select s_id from score where c_id=03);
12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息
select * from student where s_id in (select s_id from score where c_id in (select c_id from score where s_id=01));
13、查询和"01"号的同学学习的课程完全相同的其他同学的信息
14、查询没学过"张三"老师讲授的任一门课程的学生姓名
15、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
16、检索"01"课程分数小于60,按分数降序排列的学生信息
select a.*,b.c_id,b.s_score from student a,score b where a.s_id = b.s_id and b.c_id='01' and b.s_score<60 ORDER BY b.s_score DESC;
二、事务
事务的特征:ACID
原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
支持情况: 只有Innodb 引擎的才支持, 常见的引擎有两个(Innodb, MyISAM)
对于执行的多条sql语句 要不全执行 要不全失败(事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。)
事务用来管理 insert,update,delete 语句
默认的情况下:
事务执行的语句:
select不需要事务,查询的时候数据不会发生变化;
插入、更新、删除 默认情况下 一条sql就是一个事物 事物默认是开启的
更新 eg:update student set s_name 处理时可能发生错误 用事务隔离一下
set autocommit=0 关闭自动提交
开始事物 begin
执行sql
提交事务 commit提交
存档save point
开发中一般不用到
三、MySQL隔离级别
查看mysql 默认的隔离级别
@@global.transaction_isolation 系统的隔离级别
@@transaction_isolation 当前会话的隔离级别
select @@global.transaction_isolation,@@transaction_isolation;
隔离级别
read uncommitted (读未提交) --> 导致脏读,读取到其他事务没有提交的数据,如果其他万一回滚,这是数据无效。
REPEATABLE-READ(默认的隔离级别,读已提交) ->
解决脏读,导致不可重复读取,在同一事务中前后两次查询的数量可能不一致。
repeatable-read (可重复读) ->
解决不可重复读,导致幻读
1. 在A中开启事务
2. 在B中开启事务
3. 查询一下叫'李四'学生
4. 插入‘李四’的学生
5. 提交事务
6. 查询‘李四’,李四不存在
7 插入一下李四,有插入不成功(name要唯一)
serializable(串行化)
解决幻读
1. 一个事务一个的执行,事务都不并发,没有任何问题,但是会到性能下降
隔离界别越高,性能越下降(采用默认的隔离级别就可以了)
修改隔离级别
set session transaction isolation level read uncommitted
set session transaction isolation level read committed
set session transaction isolation level repeatable read
四、视图
view
应用场景:
1.数据关联很复杂
2.有一些数据不想给某些人看(让别人通过视图查询数据)
什么是视图
一张虚拟表,有字段等,但是不是真正的存储数据,对查询结果的一个引用,在使用视图的时候,我们以查询为主,基本上不做更新 添加 删除。
eg:查询 张三的人, 他的各门课程,按照降序进行排序
select st.s_name sname, cu.c_name cname,sc.s_score score from student st left join score sc on st.s_id = sc.s_id left join course cu on cu.c_id = sc.c_id where st.s_name='zhaolei' order by score desc;
可以使用视图
create view temp as select st.s_id sid,st.s_name sname, cu.c_name cname,sc.s_score score from student st left join score sc on st.s_id = sc.s_id left join course cu on cu.c_id = sc.c_id ;
select * from temp where sname='zhaolei' order by score desc;
注意:如果希望更新视图,视图和数据表的关系一一对应的,如果希望做更新和插入,直接在原表上进行
视图不属于这一次会话,一次创建之后可以一直使用
视图是对真实数据表的引用,当真实数据表发生变化时,视图的数据也发生跟着变化。