19.数据库表间关系:创建外键约束(用来描述表和表之间的关系,创建表时直接创建):语法如下;
foreign key(当前表的列名x) references 外表名(列名y),只有在外表中存在的值才可以插入或修改;
外键的级联操作:当删除一个表的数据时,如果在另一个表中有外键与之连接则要进行级联操作处理,默 认是会抛出异常(当然,使用逻辑删除可以避免这个问题),级联操作可以在创建表时指定,也可以在创 建后修改,类型主要有:restrict(限制):默认值,抛异常;
cascade(级联):若主表记录删除,则从表相关联的数据都将被删除;
set null:将外键设置为空;
no action:什么都不做;
20.连接查询:通过外键约束,可以将多个表的数据在同一个结果集中显示,这就需要连接查询,关键字是join,类型有三种:
表A inner join 表B:结果集只会显示表A和表B相匹配的行;
表A left/right join 表B:表A和表B相匹配的结果会出现在结果中,同时表A/B中独有的数据也会显示出来,未对应的数据使用null来填充;
语法如下(以inner为例);
select 表1.列x,表2.列y,表3.列z
from 表3(此处随便选择一个表,只要能保证所有的表都可以连接到一起就可以)
inner join 表1 on 表3.外键约束列a=表1.对应列
inner join 表2 on 表3.外键约束列b=表2.对应列(这里也可以写表1和表2的关系,保证所有表连接到一起即可);
21.导入数据库文件(一般给表导入数据):source xxxx.sql;
22.数据库的自关联:用外键方式将某列关系到本表的一个列(自己关系自己);
23. 视图:对查询的一个封装,可以直接调用,避免重复的复杂查询,定义:
create view xxxx as
select ........(正常的查询语句);
需要用时:select * from xxxx(其实和查询表是一样的,本质上视图就是查询结果集);
对视图的操作和表是一样的;
24.事务:当一个业务逻辑需要多个sql操作完成时,如果其中某条sql语句出错,则希望整个操作都退回,事务就是用来完成回退 功能,以保证业务逻辑的正确性;事务的四大特性:原子性(全部操作不可分割,要么全部完成要么都不执行);一 致性:并行执行的事务结果必须与串行执行结果一致;隔离性:事务不受其他事务影响,中间结果互相透明;持久 性:事务对数据库的修改不被丢失,哪怕数据库故障;
事务的要求是表的类型必须是innodb或者bdb类型,才可以使用事务;
语句:开启begin(这时候对表修改,数据库会将对应的表(innodb貌似只锁改动的行)锁起来,创建一个内存级的临 时表(行));提交:commit(将改动更新到表中);回滚rollback(恢复到begin之前);
25.数据物理存储上是按照主键来存储的,尽量避免null,应该指定列为no null,因为在mysql中,null很难进行查询优化,会使索 引变得复杂,可以用0,特殊值或者空串来代替null;
26.索引:分为单列索引和组合索引,单列索引是一个索引只包含一个列,一个表可以有多个单列索引;组合索引是一个索引包 含多个列;
查看索引:show index from table 表名;
创建索引:create index 索引名 on 表名(列名1(length),列名2(length)......);(字符串类型需要指定length,而int等 则不需要)
删除索引:drop index 索引名 on 表名;
但是索引虽然可以提高查询的速度,但是会降低插入,增加,删除的速度,因为数据库还要额外对索引进行操作;
27.查询时,where筛选时:范围条件尽量放到最后(大于小于等等);尽量用and不用or(影响效率);
28.查看数据库操作执行的时间:开启运行时间检测:set profiling=1;
执行相应的操作;
查看执行时间:show profiles;
29.内置函数:待补充(需要了解有但不必全记住)