子查询:在一条sql语句中嵌入在其他sql语句中的select语句,也叫嵌套查询
单行子查询:返回一行记录的子查询。
查询与“成绩优秀” 同学的同班同学:
select * from student where classes_id=(select classes_id from student where
name='成绩优秀');
多行子查询:返回多行记录的子查询(关键字IN和NOT IN)
select * from score where course_id in (select id from course where name='语文' or name='数学');
select * from score where course_id not in (select id from course where name!='语文' and name!='数学');
先将语文和数学的课程ID获取出来,然后使用成绩表的每一条数据在集合中进行对比,是否在集合中,IN适用于子条件结果较少的场景。
多列包含查询:
select * from score sco where exists (select sco.id from course cou where (name='语文' or name='英文') and cou.id = sco.course_id);
select * from score sco where not exists (select sco.id from course cou where (name!='语文' and name!='英文') and cou.id = sco.course_id);
先从成绩表中取出成绩,然后将成绩的课程ID放到子条件中进行查询判断查询结果是否为真,若为真则取出,若为假则丢弃。适用于后表数据记录较多的场景。
合并查询:将多条sql语句的执行结果合并到一起--union,union all,前后查询的结果集中,字段需要一致。
union:该操作符用于取得两个结果集的并集。当使用该操作符时,自动去掉结果集中的重复行。
select * from course where id<3 union select * from course where name='英文';
-- 或者使用or来实现
select * from course where id<3 or name='英文';
union all:该操作符用于取得两个结果的并集。当使用该操作符时,不会去掉结果集中的重复行。
select * from course where id<3 union all select * from course where name='英文';
索引与事务:
语句后边加上\G可以改变表的查看方式。
索引:数据库中对数据进行存储的一种数据结构。
类型:存储结构:B/B+树,hash,...
作用:索引就像是一本书中内容的目录,大大提高对于数据检索的效率。
使用性质:主键索引、唯一键索引、外键索引、普通索引
聚簇索引:索引的叶子节点就是数据,索引与数据都是顺序存储。
一张表只能有一个。针对范围性或有序的数据查询效率较高。
在插入数据时需要调整存储结构效率较低,常用于自增属性的主键(尽可能少的调整存储结构)
非聚簇索引:索引与数据都是单独存储,数据的存储是无序的。可以有多个。
创建:创建数据库表的时候,会伴随主键(PRIMARY KEY),唯一键(UNIQUE),外键(FOREIGN KEY)而创建索引。
创建普通索引: create index 索引名 on 表名(字段名);//直接针对某张表
通过修改表结构添加主键或唯一键或外键方式添加索引:
alter table student add unique key uk(name);
查看索引:show index from 表名;
删除索引:drop index 索引名 on 表名;
事务:将多条SQL语句当作一个整体进行执行的功能。
操作:
开始事务:start transaction
回滚事务:rollback
提交事务:commit
start transaction;
--小明账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 小黑账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;
事务存在的必要性:当数据库不支持事务的时候有可能出现的情况。
脏写:事务A进行了一条数据的修改操作;在事务还没有提交的时候事务B又对数据进行修改
脏读:事务A开始事务,修改了数据;事务B查询到了修改后数据;事务A提交或回滚事务。
举个例子:财务给小明发了5000工资,修改了数据库;小明一查账户自己收到5000;财务发现工资发错了,回滚了事务,读取到了事务还没提交之前所作的修改。
不可重复读:事务A先读取数据;事务B修改数据;事务B提交事务;事务A再次读取数据,事务A在不同的阶段所读取到的数据不同。
幻读:事务A读取某个范围内的记录;事务B天机了一条记录;事务B提交事务;事务A再次读取范围内的记录。(主要针对数据的添加/删除)
特性:
原子性:要么操作全部完成,要么就不做
一致性:若数据库只包含了完整的事务则处于一致性;若事务进行中出现异常中断,则处于非一致性。(一致性基于原子性实现)
持久性:事务一旦提交,就会进行持久化存储的磁盘中
隔离性:保证并发中多个事务不会互相产生影响。
事务的隔离级别:
查看当前数据库的隔离级别:select @@tx_isolation;
网页IM系统,两个用户若是同时注册,是怎么保证不会重复注册?
当前数据库的隔离级别是可重复度--不会出现脏读,幻读,不可重复读情况;查询数据不再存在则添加,在当前数据库的隔离级别下不会出现重复注册。