数据库存储引擎是 数据库底层软件,对数据进行增删改查的时候不同的存储引擎的处理机制是不一样的,有各自不同的功能。MySQL 的核心就是存储引擎。innoDB 事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键
整数类型:
字符串类型:
varchar是可变长度;char()是固定长度;字符串长度加+结束符;
一个表(子表)的外键 是另一个表(父表)的主键。
外键设置规则:
如果主键和外键是同一个表里的,叫做自参照表。
子表和父表的列数目必须相同,主键和外键类型相同。
FOREIGN KEY 关键字
UNIQUE 和 PRIMARY KEY 的区别:一个表可以有多个字段声明为 UNIQUE,但只能有一个 PRIMARY KEY 声明;声明为 PRIMAY KEY 的列不允许有空值,但是声明为 UNIQUE 的字段允许空值的存在。
check();
去重
SELECT DISTINCT <字段名> FROM <表名>;
外连接分为左连接 和右连接
SELECT *
FROM product as a left JOIN category as b
on a.category_id = b.id ; #得到的是左边表中所有的数目+右边复合条件的;
右连接相反;左连接+右连接 就是完全连接
选择用什么连接的依据:
两表就是单纯的数据联合的时候,查两表关联列相等的数据,用内连接,
左表是右表的子集,用右连接;
右表是左表的子集,用左连接;
单表查询:根据where条件形成一个中间表,这个表对我们是隐藏的,然后select 后面所需要的显示出来。
两表查询:先根据笛卡尔积形成一个中间表,根具条件去除不符合条件的数据, 然后select 后面所需要的显示出来;
多表查询: 先对前两个表进行两表查询,然后将形成的中间表与第三个表在进行两表查询。
on与where的区别:
on进行连接操作,根据条件形成中间表,而where是物理过滤,是对已经形成的中间表根据条件硬性过滤。
ON只进行连接操作,WHERE只过滤中间表的记录。
语句
create [or replace] view viewname as 语句;
对数据的更新最终是对表的更新。前提是select没有使用分组 union 语句。
视图不占用物理内存,我们看到的视图中数据是表中的数据。
建立视图的优点是 :
不必直接接触表,把表隐藏起来。 根据不同的需求当需要的表很多时,sql语句可能会比较复杂,然后使用视图可能更方便。 删除修改视图对数据库表都没直接影响。
触发器是特殊的存储过程,不需要明显的去调用; 而是发生某一条件 然后触发。
mysql中有两种方式访问数据:
一是按照顺序访问,从头到尾遍历数据,筛选出符合条件的数据。
二是索引访问,根据遍历索引访问,在表中对应的列上建立索引,根据索引找到对应的列;描索引的速度一般远远大于扫描实际数据行的速度,所以采用索引的方式可以大大提高数据库的工作效率。
索引分类:
普通索引:建立的普通索引。
唯一性索引:索引值具有唯一性。
主键索引: 把主键字段当做索引,唯一索引的一种。
组合索引: 多个字段组合成的索引。
索引的优缺点:
更快的查询;建立唯一性索引保证每一行数据的唯一性;
占用物理空间,在增删改的时候也需要对索引进行改动,降低维护的速度。
索引的原理:
索引是根据B/B+树实现的;
索引的创建:
CREATE INDEX index_name ON tablename(ziduanming);
create unique index index_name ON tablename(ziduanming);(唯一性索引);
建立索引的原则: 对比较常用的字段设置索引,如主键,查询条件 排序 等经常用到的字段。
数值少不使用索引,字段不经常用的不使用索引;对于text varchar的尽量不要用索引;
不建议使用索引的情况:
查询的数据比较少;增删改远远大于查询的时候;列的数据种类很少也不建议使用,如sex只有0和1这两种植,结果集中数据行数很多,并不能提高效率。
索引使用的原因:
不用索引的情况是,根据where条件进行全部数据的扫描;
有索引的情况:,利用b树数据结构,可以根据字段定位,减少查询的行数。
1,。保证字段的原子性,无法在分割。
2. 保证每一行都能区分,(主键)。
3.每个表中不包含其他表中已包含的非主关键信息,(消除冗余性)。
原子性:执行一个操作的时候,要么全都不做,要么全部做完,
一致性: 在一个完整的操作,执行完之后,应该还是一致的。比如ab之间转账,a向B转账1000,b接受到1000,最后ab的总钱还是不变的。
隔离性: 并发处理的时候,A和B都对同一个目标执行操作,要么a执行完之后,b执行,要么是b执行完之后,a在执行。不能再a执行的过程,b去执行。
持久性:一旦操作完成,产生操作的影响就是永久性。
四大隔离级别
read-uncommited : 本事物可以读取其他事物未提交的数据,出现问题: 脏读。
read-commited: 本事物只能读取已经提交了的结果,对未提交的结果是不可见的。出现问题:同一个查询,可能返回不同结果,因为在此期间可能有其他事物进行新的提交(也叫做不可重复读)。
repeated-read( 可重读),mysql默认的; 并发事 物保证同一时刻看到的都是相同的数据。出现问题: 幻读:当一个事物正在读取数据的时候,另一个事物插入数据,这时候查询的结果出现几条原本本没有的数据。
serializable - read (可串行化) : 强制事物按顺序来加上锁 。出现问题:解决了幻读的问题但是锁竞争问题。
产生的问题:
脏读:当本事物读数据的时候,另一个事物插入数据,本事物读到了新插入数据,当时此时另一个事物进行回滚,产生的数据就是脏读。
不可重复读: 本事物读取数据的时候,另一个事物提交新的数据,在此查询的时候,结果可能就不一样了。
幻读: 本事物读取数据的时候,另一个事物提交新的数据,此时继续查询的时候,出现了原本没有的数据。