多表查询
- 连表:
- 内连接:所有不在条件匹配内的数据们都会被剔除连表
- select * from 表名1,表名2 where 条件;
- select * from 表名1 inner join 表名2 on 条件;
- 外连接:
- 左外连接:left join
- select * from 表名1 left join 表名2 on 条件;(显示表名1中的所有数据)
- 右外连接right join
- select * from 表名1 right join 表名2 on 条件;(显示表名2中的所有数据)
- 全外连接 full join
- select * from 表名1 left join 表名2 on 条件 union select * from 表名1 right join 表名2 on 条件;
- 左外连接:left join
- 子查询:建议分开做
- 内连接:所有不在条件匹配内的数据们都会被剔除连表
表的存储引擎:
show engines; 存储引擎
存储引擎:
- 表结构:存放在一个文件中(硬盘)
- 表数据:存放在另一个文件中(内存)
- 索引:为了方便查找设计的一个机制
种类:
innodb:索引+数据 表结构,持久化存储
支持事务begin:一致性,n条语句的执行状态是一致的
begin #开启事务 select ...... update/delete ...... commit; #提交事务,解锁被锁住的数据
支持行级锁:只对涉及到修改的行加锁,利用并发的修改,但是对于一次性大量修改效率低下(表级锁:一次性加一把锁就锁住了整张表,不利用并发的修改,但是加锁速度比行锁的效率高)
支持外键约束:被约束表中的数据不能随意的修改,删除,约束字段要根据被约束表来使用数据
myisam:索引,数据,表结构,支持持久化存储
- 支持表级锁
memory:表结构
- 支持断电消失
表的约束
- 非空约束:not null,默认不写的时候自动插入
- unsigned :无符号的数字
- 唯一约束:unique
- 联合唯一约束:unique(需要联合的列)
- 外键约束:foreign key(字段名) references
- 级联更新:on update cascade ,相关的数据会跟随变化
- 设置默认值:default xx
- 主键:primary key
- 第一个被设置了非空+唯一约束的字段会被定义成主键 primary key
- 对某一字段 自增:auto_increment
- (truncate table 表名; 清空表且重置auto_increment),
- (delete from 表名;清空表数据但不能重置auto_increment)
- alter table 表名 auto_increment=数值
表的修改 alter table
- 修改表明:alter table 表名 rename 表名;
- 修改编码:alter table 表名 charset 编码;
- 修改自增:alter table 表名 auto_increment 自增的位置;
- 添加字段约束:alter table 表名 add 约束条件;
- 修改约束:alter table 表名 add 字段名 类型(长度) 约束;
- 修改字段名:alter table 表名 drop 字段名;
- 修改字段名以及类型和约束条件:alter table 表名 change 字段名 新名字 类型(长度)约束
- 修改表中的字段:alter table 表名 modify 字段名 新类型(新长度)约束
- 修改字段名的位置:alter table 表名 add 字段名 类型(长度) 约束 first(备注:移动到第一个)/after 字段名(备注:移动到某个字段名之后)
- 修改原字段的类型:after table 表名 change 字段名1 字段名1 类型(长度) 约束;
表与表之间的关系
一对一:
create table class(id int primary key,cname char(26)); create table student(id int primary key,sname char(16),gid int unique,foreign key(gid) references guest(id));
一对多:foreign key
create table class(id int primary key,cname char(16)); create table student(id int primary key,sname char(16),cid int,foreign key(cid) references class(id));
多对多:
create table class(id int primary key,cname char(16)); create table teacher(id int primary key,tname char(16)); create table teacher_cls(id int,cid int,tid int,foreign key(cid) references class(id),foreign key(tid) references teacher(id));
索引原理
磁盘预读性原理
- linux 中一个block块大小是4096个字节
树:根节点root,分支节点branch,叶子节点:leaf
- b树:balance 树
- 数据存储在分支节点和叶子节点上
- 导致了树的高度增加,找到一个数据的时间不稳定
- 在查找范围的时候不够便捷
- b+树:mysql中innodb存储引擎的所有的索引树都是b+树,是为了更好的处理范围问题在b树的基础上有所优化
- 数据不再存储在分支节点了,而是存储在叶子节点上(树的高度降低,找到所有数据的时间稳定)
- 在叶子节点与叶子节点之间添加的双向指针提高了再查找范围的效率
- b树:balance 树
索引的两种存储方式:
- 聚集(簇)索引:叶子节点会存储整行数据--innodb的主键中才会有(主键只可以创建一个的原因)
- 非聚集索引(辅助索引):除了主键之外的普通索引都是辅助索引,一个索引没办法查询到整行数据,需要回聚集索引再查一次,俗称回表,数据不直接存储在索引的叶子节点
索引优缺点:
- 优点 :加快查询速度
- 缺点:降低写的效率,占用更多的磁盘空间
索引的创建:create index 索引名 on 表名(字段名);
索引的删除:drop index 索引名 on 表名;
正确的使用索引:
- 只有对创建了索引的列进行条件筛选的时候效率才可以提高
- 索引对应的列做条件不能参与运算,不能使用函数
- 当某一列的区分度非常小(重复率高),不适合创建索引
- 当范围作为条件的时候,查询结果的范围越大越慢,越小越快。
- like关键字:如果使用%/ _ 开头都无法命中索引
- 多个条件:如果只有一部分创建了索引,条件用and相连,那么可以提高查询效率,如果用or相连,不能提高效率
- 联合索引:
- 条件不能用or
- 要服从最左前缀原则
- 不能从使用了范围的条件开始之后的索引都失效
基础概念:
explain :执行计划
- explain
覆盖索引 using index:在查询的过程中不需要回表