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
 ----------------------------------------------

 注意:在实际开发当中,以满足客户的需求为主,有的时候会拿冗余换取速度。	

 一对一设计方式:
 	第一种:主键共享,把主键当成外键
 	第二种:外键唯一,设置唯一外键

关注我的公众号SpaceObj 领取idea系列激活码

posted on 2023-05-11 09:35  张伯灵  阅读(5)  评论(0编辑  收藏  举报