sql查询命令的特征
1.查询命令
1.1 FROM
作用:
1.将硬盘上的表文件加载到内存中,生成一个全新的临时表
2.定位内存中已经存在的临时表
注意点:
1.FROM的优先级是最高的,永远是第一个执行
2.FROM定位的是内存中的临时表,所以必须手动给临时表指定表名
1.2 WHERE
作用:
1.操作的表是from生成的临时表
2.会循环遍历当前临时表中的每一个数据行,将满足条件的数据行保存到一个全新的临时表
注意点:
1.由于WHERE命令每次操作一个数据行,因此在WHERE执行时,无法使用聚合函数作为判断条件
1.3 GROUP BY
作用:
1.首先对临时表中的数据进行一次排序处理
2.然后将具有相同特征的数据行保存到同一个临时表中
注意点:
1.多字段分组时查询,分组字段执行的顺序对于查询结果来说时没有任何影响的,所以从第二个分组字段开始,操作的临时表是上一个分组字段生成的临时表
2.如果select操作的临时表是由当前的group by 提供,那么此时select将遍历group by生成的每一个临时表,在操作具体的临时表时,select只会读取指定字段中第一个数据行的内容**[这不就去重了嘛?]**
1.4 HAVING
作用:
将GROUP BY生成的零食表中不满足条件的临时表进行删除
注意点:
1.having命令不能独立出现,只能出现在group by 后面
2.having命令每次操作的是临时表,所以它所选择的判断条件,应该来自于聚合函数
1.5 SELECT
作用:
1.select操作的临时表是由from或where命令提供的,那么select会将指定字段中的所有内容读取出来,并将读取出的内容组成一个全新的临时表
2.select操作的临时表是由group by或having提供的,那么select将遍历group by或having生成的每一个临时表,在操作具体的临时表时,select只会读取指定字段中第一个数据行的内容
1.6 ORDER BY
作用:
1.专门针对select生成的临时表中的数据行进行排序,并将排序后的内容组成一个全新的临时表
注意点:
1.如果order by 使用字段的名称进行排序时,这个字段名可以不出现在select生成的临时表中,但是如果order by使用字段顺序进行排序时,索引的位置必须在select查询语句中出现
1.7 LIMIT
作用:
对当前临时表中的数据行进行截取
2.查询语句执行特征
1.上述查询命令中,除却having命令,其他的查询命令执行完毕后都会生成全新的临时表
2.查询命令中,除却from,其他的查询命令操作的临时表都是上一个查询命令生成的临时表
3.当前查询命令执行完毕后,会自动将上一个茶挨训命令生成的临时表进行销毁处理,所以,在一个查询语句执行完毕后,用户只能看到最后一个查询命令生成的临时表
4.多字段分组时查询,从第二个分组字段开始,操作的临时表是上一个分组字段生成的临时表
3.执行效率过慢的查询命令(倒序)
1.执行速度最慢的: GROUP BY
原因:
在执行时,首先将临时表中的数据进行排序,然后在进行分组
2.ORDER BY
原因:
需要对select生成的临时表中的数据行进行一次排序,然后将排好顺序的数据行组成一个全新的临时表
3.where
原因:
需要对表中的所有数据行进行遍历,如果当前临时表中的数据行过多,就会导致where执行效率非常慢
4.limit
原因:
如果指定起始的行数过大,比如3W行,那么limit会一行一行的取找到这一行
5.对于多表查询来说,如果没有指定表文件的加载顺序,也会导致查询速度过慢