一.select语句基本查询结构;
1.执行顺序;
(1).首先执行where语句过滤原始数据
(2).执行group by进行分组
(3).执行having对分组数据进行操作
(4).执行select筛选出数据
(5). 执行order by排序
2.Sql优化问题(先简单了解,后续再详解);
当你数据库有100万条数据的时候怎么优化SQL语句
①. 不要有超过5个以上的表连接(连接的表越多,其编译的时间和连接的开销也越大,性能越不好控制,最好是把连接拆开成较小的几个部分逐个顺序执行)
②. 考虑使用临时表或表变量存放中间结果
③. 修改like程序,去掉前置百分号,like语句因为前置百分号而无法使用索引,会导致全表扫描
④. 限制结果集,要尽量减少返回的结果行,包括行数和字段列数
⑤. 使用存储过程封装复杂的SQL语句或商业逻辑,因为存储过程的执行计划可以被缓存在内存中较长时间,减少了重新编译的时间,还有存储过程可以减少客户端和服务器的频繁交互。
⑥. 尽量避免在where子句中使用!=或<>操作符,否则会进行全表扫描,应避免全表扫描,考虑在where及order by设计的列上建立索引
⑦. 尽量避免在where子句中对字段进行null值判断,否则会进行全表扫描,例如select id from person where num is null,可以在num上设置默认值0,确保表中num列没有null列,然后使用查询:select id from person where num=0
⑧. 尽量避免在where子句中使用or来连接条件,否则会进行全表扫描,例如select id from person where num=05 or num=22,优化后:select id from person where num=05 union all select id from person where num=22
二.连接查询
2.1数据的完整性约束;
主键:主键是关系表中记录的唯一标识。主键的选取非常重要,主键不要带有业务含义, 而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。可以使用多个列 作为联合主键,但联合主键并不常用。
外键:外键主要是维护表之间的关系的,主要是为了保证参照完整性,如果表中的某个字 段为外键字段,那么该字段的值必须来源于参照的表的主键。
2.2.实体间的关系
2.2.1 一对一关系(1:1):一张表里面的数据与另外一张表的数据是一对一的;
如下表:基本满足咱们的要求,其中姓名、性别和年龄属于常用数据,但是身高、体重、籍贯和居住地为不常用数据。如果每次查询都要查询所有数据的话,那么不常用数据就会影响效率,而且又不常用。
因此,咱们可以将常用的数据和不常用的数据分离存储,即分为两张表,例如:
表1:常用数据
表2:不常用数据
现在表1
和表2
所示,通过字段ID
,表1
中的一条记录只能匹配表2
中的一条记录,反之亦然,这就是一对一</