【一】初级
【二】中级
执行过程
【1】客户端向MySQL服务器发送一条查询请求
【2】服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段
【3】服务器进行SQL解析、预处理、再由优化器生成对应的执行计划
【4】MySQL根据执行计划,调用存储引擎的API来执行查询
【5】将结果返回给客户端,同时缓存查询结果
多种Join
交集:
select * from A inner join B on A.key = B.key
并集:
select * from A full outer join B on A.key = B.key
差集:
select * from A left outer join B on A.key = B.key where B.key IS NULL
select * from A right outer join B on A.key = B.key where A.key IS NULL
以A表为主表,A表数据全部取到
select * from A left outer join B on A.key = B.key
以B表为主表,B表数据全部取到
select * from A right outer join B on A.key = B.key
取A,B全集,并去掉A,B的交集
select * from A full outer join B on A.key = B.key where A.key IS NULL or B.key IS NULL
数据库设计
表结构设计:遵循三范式 NF(Normal Form)
(1)简单归纳:
第一范式(1NF):字段不可分
第二范式(2NF):有主键,非主键字段依赖主键
第三范式(3NF):非主键字段不能相互依赖
(2)本质解释:
1NF:原子性。 字段不可再分,否则就不是关系数据库
2NF:唯一性 。一个表只说明一个事物
3NF:每列都与主键有直接关系,不存在传递依赖
字段设计
1.字段类型选择:尽量小
--变长字段使用varchar,定长使用char
--冗余字段,合理参考范式,以空间换时间
--int类型详解:https://www.jb51.net/article/93777.htm
Q:int(3)中数字3的含义是什么?
答:这里的3代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字.不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度。加上zerofill后,,才能看出3代表的效果,比如 int(3) zerofill,当你插入到数据库里的是10,则实际插入为010,插入的数字超过3位,定义的3不再起作用。
Q:不同int型后的默认位数M分别是多少?
答: TINYINT[(M)] [UNSIGNED] [ZEROFILL] M默认为4
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M默认为6
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M默认为9
INT[(M)] [UNSIGNED] [ZEROFILL] M默认为11
BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默认为20
2.命名规则
-多个单词以 "_" 连接
-重要数据表模型加上create_user,create_time,last_modify_user,last_modify_time字段
3.主键
-每张表必须建立一个自增id作为主键
4.索引
-where限定条件后查询字段加索引
SQL优化
【三】高级