mysql:
1.DQL\DML\DDL\TCL\DCL
2.查询顺序
3.五种分组函数/聚合查询
4.source运行sql脚本
5.MySQL常用的命令
6.group by/having/order by
7.关联查询:内连接、外连接、全连接
8.条件查询:between and/and/or/in/not in/like
9.or与and的优先级
10.sql99语法比sql92语法清晰,表的连接条件和后来的where条件分离了
11.inner join on表示内连接,inner可以省略
12.非等值连接一般是join on与between on配合使用
13.内连接与外连接的区别
14.联合查询(union):优点是可以将查询两张没有关系的表,最后把结果显示出来;缺点是两张表查询出来的列必须相同
15.limit(index,length)是MySQL特有的分页查询,index表示开始的位置,length表示查询的长度。
16.表的复制以及表的批量插入
1)create table 表名 as select语句,将查询结果当作表创建出来
2)insert into 表名字 select语句,将查询出来的结果插入到之前创建好的表中
17.表的约束
1)非空约束,指的是某个字段不能为空
2)唯一约束,指的是一列或者多列的值不允许重复
3)主键约束,指的是不仅非空而且还唯一
4)外键约束,指的是两张表的关联字段,A表中某个字段关联B表中某个字段,那么A表中的该字段必须填写与B表中关联字段中包含的值,否则报错,此时的A表是子表,B表是父表;foreign key(xxx) references 表名(yyy)
注意:1.删除数据的时候注意先删除子表中的数据,再删除父表中的数据。
2.添加数据的时候,先添加父表中的数据,再添加子表中的数据。
3.创建表的时候,先创建父表再创建子表
4.删除表的时候,先删除子表再删除父表
5)外键可以为null
6)被引用的字段不一定是主键,但是要确保唯一性。
18.存储引擎
1)建表的时候可以指定存储引擎,也可以指定字符集
2)MySQL默认指定的引擎是innoDB
3)默认采用的字符集是utf8
18.1存储引擎只是在MySQL中出现,Oracle中叫做存储方式。MySQL支持很多种存储引擎,每一种存储引擎都对应了一种存储方式,每一个引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎
查看存储引擎的命令:show engines \G
19.存储引擎的分类
1)MyISAM:分别用三个文件来存储表结构:mytable.frm存储表结构;mytable.MYD存储表数据;mytable.MYI存储表索引;
1.1)可以转化为压缩、只读表来节省空间、提高索引效率;但是不支持事务;
2)innoDB:支持事务、行级锁、外键等。这种存储引擎数据的安全得到了保障。
2.1)表结构存储在xxx.frm文件中。
2.2)数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
2.3)MySQL奔溃之后提供自动恢复。
2.4)支持级联删除、级联更新
3)MEMORY:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中。优点是查询速度快。
20.事务
20.1什么是事务?
一个事务是一个完整的业务逻辑单元,不可再分。
比如:银行账户转账,从A账户向B账户转1000元。需要执行两条update语句;
update t_act set balence=balence-'1000' where actno='act-001'
update t_act set balence=balence+'1000' where actno='act-002'
以上两条sql语句必须同时执行成功,或者同时执行失败,不允许出现一个成功或者一个失败。
要想上面两条DML语句同时成功或同时失败,那么就需要使用数据库的“事务机制”。
20.2和事务相关的语句只有:DML(insert\update\delete);
为什么?因为它们这三条语句都是和数据库表当中的“数据”相关的。
事务的存在是为了保证数据的完整性和安全性。
20.3假设所有的事务都能使用1条DML语句搞定,还需要事务机制吗?
不需要了。
但是,实际情况不是这样的,通常一个事儿(业务)需要多条DML语句联合来完成的
20.4事务的原理
比如一个事务执行insert、update、delete三条语句然后完成了一条事务,当这三条语句都执行成功后,执行commit就把数据保存到硬盘文件中,然后把之前的操作记录删除。如果执行rollback,那么数据将不会被保存到硬盘文件当中,而且会把之前的操作记录删除。
20.5事务的特性
1)事务包括四大特性:ACID
2)A原子性:事务是最小的工作单元,不可再分
3)C一致性:事务必须保证多条DML语句同时成功或者同时失败
4)I隔离性:事务A与事务B之间具有隔离
5)D持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。
20.6关于事务之间的隔离性
事务隔离性存在隔离级别,理论上级别包括4个:
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们当前事务可以读取到对方未提交的数据
读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。
第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读取到。
这种隔离级别解决了:脏读现象没有了。
读已提交存储在的问题是:不可重复杜。
第三级别:可重复读(repeatable read)
这种隔离级别解决了:不可重复读问题。
这种隔离级别存在的问题是:读取到的数据是幻象。
第四级别:序列化读/串行化读
解决了所有问题。
效率低,需要事务排队。
20.7MySQL的事务是自动提交的,每执行一条DML语句都会自动执行一次提交。 关闭提交的方法: start transaction
注意:每次执行rollback或者是commit之前都需要开启一次事务
20.8使用两个事务演示以上的隔离级别
第一:演示read uncommitted
设置事务的全局隔离级别
set global transaction isolation level read uncommited;
查看事务的全局隔离级别:select @@global.tx isolation;
第二:演示read committed
设置事务的全局隔离级别
set global transaction isolation level read committed
第三:演示repeatable read;
设置事务的全局隔离级别:
set global transaction isolation level repeatable read
第四:演示serializable;
设置事务的屈居隔离级别:
set global transaction isolation level serializable
注意:只有提交事务之后,查询的语句才能继续执行下去。
21.索引
21.1什么是索引?有什么用?
索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。在数据库方面,擦汗寻一张表的时候有两种检索方式。
第一种方式:全表扫描。
第二种方式:根据索引检索(效率很高)
索引为什么可以提高检索效率?
其实最根本的原理是缩小了扫描的范围。
索引虽然可以提高检索效率,但是不能随意的添加索引,因为索引页数数据库当中的对象,也需要数据库不断的维护。是有维护成本的。比如,表中的数据经常被修改,这样就不适合添加索引,因为数据一旦修改,索引需要重新排序,进行维护。
添加索引是给某一个字段,或者说某些字段添加索引。
select ename,sal from emp where ename = 'SMITH';
当enmae字段上没有添加索引的时候,以上sql语句会进行全表扫描(笛卡尔积),扫描ename字段中所有的值。
当enmae字段提娜佳索引的时候,以上sql语句会根据索引扫描,快速定位。
21.2怎么创建索引对象?怎么删除索引?
create index 索引名称 on 表名(字段名)
drop index 索引名称 on 表名称;
21.3什么时候考虑给字段添加索引?(满足条件)
数据量庞大。(根据客户的需求,根据线上配置环境)
该字段很少进行DML操作。(因为字段进行修改操作,索引也需要维护)
该字段经常出现在where字句中。(经常根据那个字段查询)
21.4注意:主键和具有unique约束的字段自动会添加索引。
根据主键查询效率搞。尽量根据主键检索。
21.5查看SQL语句的执行计划:
explain select语句。
创建索引之前该结果中的type的值是ALL,查询的rows是全部的条数
创建索引之后该结果中的type的值是ref,查询的rows是1
21.6 索引底层采用的数据结构是: B + Tree
21.7 索引的实现原理?
通过B Tree缩小扫描范围,底层索引进行了排序,分区,索引会携带数据在表中的"物理地址",最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效果是最高的。
select ename from emp where enmae = 'SMITH'
通过索引转换为:
select ename from emp where 物理地址 = 0x3;
注意:索引具有自动排序的功能,分区的功能,
在Oracle中的索引rowid
21.8 索引的分类?
单一索引:对单个字段创建索引
复合索引:对多个字段联合创建一个索引
主键索引:主键上面会自动添加索引
唯一索引:被unique约束的字段会自动添加索引
......
21.9 索引什么时候失效?
select ename from emp where ename like '%A%'
模糊查询的时候,第一个通配符使用的是%,这个时候索引失效,除非第一个通配符是你要查询的字
21.10使用的业务场景?
根据手机号查询用户
秒杀活动。
高并发的事务。
22.视图(view)
22.1什么是视图?
站在不同的角度去看数据。(同一张表的数据,通过不同的角度去看待)
22.2怎么创建视图?怎么删除视图?
create view 视图名 as select语句;
drop view 视图名;
22.3对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)可以对视图进行CRUD操作。
22.4面向视图操作?
通过视图更新原表数据、通过视图删除原表数据
22.5视图的作用?
视图可以隐藏表的实现细节。保密级别比较高的系统,数据库只对外提供相关的视图,Java程序员只对视图进行CRUD
23.数据库设计三范式(重点内容,面试经常问)
7.1什么是设计范式?
设计表的依据。按照这个三范式设计的表不会出现数据冗余。
7.2三范式都是那些?
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。多对多?三张表,关系表两个外键。
t_student 学生表
sno(pk) sname
----------------
1 张三
2 里斯
3 王五
----------------
t_teacher 讲师表
tno tname
----------------
1 王老师
2 张老师
3 李老师
----------------
t_student_teacher_relation 学生讲师关系表
id(pk) sno(fk) tno(fk)
----------------------------------------
1 1 3
2 1 1
3 2 2
4 2 3
5 3 1
6 3 3
----------------------------------------
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。一对多?两张表,多的表加外键。
班级t_class
cno(pk) cname
---------------------------
1 班级1
2 班级2
----------------------------
学生表t_student
sno(pk) sname classno(fk)
----------------------------------------------
101 张1 1
102 张2 1
103 张3 2
104 张4 2
105 张5 2
----------------------------------------------
注意:在实际开发当中,以满足客户的需求为主,有的时候会拿冗余换取速度。
一对一设计方式:
第一种:主键共享,把主键当成外键
第二种:外键唯一,设置唯一外键