志达IT
做快乐程序员

sql的执行顺序(sql的全称)

sql的执行顺序

书写次序:
select->distinct->from->join->on->where->groupby->having->orderby->limit
履行次序
from->on->join->where->groupby(开始运用select中的别名,后边的句子中都能够运用别名)->sum、count、max、avg->having->select->distinct->orderby->limit
关键词意义
from:需要从哪个数据表检索数据
join:对需要相关查询的表进行相关
相关查询时,数据库会挑选一个驱动表,然后用此表的记载去相关其他表
leftjoin一般以左表为驱动表(rightjoin一般为右表),innerjoin一般以成果集少的表为驱动表,leftjoin某些情况下会被查询优化器优化为innerjoin
驱动表挑选原则:在对终究成果集没影响的前提下,优先挑选成果集最少的那张表作为驱动表
在运用索引相关的情况下,有IndexNested-Loopjoin和BatchedKeyAccessjoin两种算法
在未运用索引相关的情况下,有SimpleNested-Loopjoin和BlockNested-Loopjoin两种算法
SimpleNested-Loopjoin(SNLJ,简略嵌套循环衔接)算法:根据on条件,从驱动表取一条数据,然后全表扫面被驱动表,将符合条件的记载放入终究成果会集。这样驱动表的每条记载都伴随着被驱动表的一次全表扫描sql
匹配次数:外层表行数*内层表行数
IndexNested-LoopJoin(INLJ,索引嵌套循环衔接)算法:索引嵌套循环衔接是基于索引进行衔接的算法,索引是基于内层表的,经过外层表匹配条件直接与内层表索引进行匹配,避免和内层表的每条记载进行比较,然后运用索引的查询减少了对内层表的匹配次数
匹配次数:外层表行数*内层表索引高度
BlockNested-LoopJoin(BNLJ,缓存块嵌套循环衔接)算法:缓存块嵌套循环衔接经过一次性缓存多条数据,把参加查询的列缓存到JoinBuffer里,然后拿joinbuffer里的数据批量与内层表的数据进行匹配,然后减少了内层循环的次数(遍历一次内层表就能够批量匹配一次JoinBuffer里边的外层表数据)。
当不运用IndexNested-LoopJoin的时分,默许运用BlockNested-LoopJoin
BatchedKeyAccessjoin(BKAJ)算法:和SNLJ算法类似,但用于被join表上有索引能够运用,那么内行提交给被join的表之前,对这些行依照索引字段进行排序,因而减少了随机IO,排序这才是两者最大的区别,但是假如被join的表没用索引呢?那就运用BNLJ了
什么是JoinBuffer?
JoinBuffer会缓存所有参加查询的列而不是只要Join的列。
能够经过调整join_buffer_size缓存大小
join_buffer_size的默许值是256K,join_buffer_size的最大值在MySQL5.1.22版别前是4G,而之后的版别才能在64位操作系统下申请大于4G的JoinBuffer空间。
运用BlockNested-LoopJoin算法需要敞开优化器办理配置的optimizer_switch的设置block_nested_loop为on,默许为敞开。
在挑选Join算法时,会有优先级,理论上会优先判别能否运用INLJ、BNLJ:
IndexNested-LoopJoin>BlockNested-LoopJoin>SimpleNested-LoopJoin
注:能够运用explain查找驱动表,成果的第一张表即为驱动表,但履行计划在真正履行时可能发生改变
on:相关条件
where:过滤表中数据的条件
履行次序:自下而上、从右到左
注:对数据库记载收效,无法对聚合成果收效,能够过滤掉最大数量记载的条件有必要写在where子句末尾,不能运用聚合函数(sum、count、max、avg)
groupby:如何将上面过滤出的数据分组
履行次序:从左往右
注:尽量在groupby之前运用where过滤,避免之后运用having过滤
avg:求平均值
having:对上面已经分组的数据进行过滤的条件
注:对聚合成果过滤,因而很耗资源,能够运用聚合函数
例:筛选计算人口数量大于100W的区域
selectregion,sum(population),sum(area)frombbcgroupbyregionhavingsum(population)>1000000,不能用where筛选超越100W的区域,因为不存在这样的一条记载
select:查看成果会集的哪个列或列的计算成果
distinct:对成果集重复值去重
orderby:依照什么样的次序来查看返回的数据
履行次序:从左到右
注:很耗资源
limit:截取出目标页数据sql

sql的全称

结构化查询言语(StructuredQueryLanguage)简称SQL,是一种特殊意图的编程言语,是一种数据库查询和程序设计言语,用于存取数据以及查询、更新和办理关系数据库系统。
结构化查询言语是高档的非进程化编程言语,允许用户在高层数据结构上作业。它不要求用户指定对数据的寄存办法,也不需要用户了解详细的数据寄存方法,所以具有完全不同底层结构的不同数据库系统,能够使用相同的结构化查询言语作为数据输入与办理的接口。结构化查询言语句子能够嵌套,这使它具有极大的灵活性和强大的功用。

赞(0)
未经允许不得转载:志达IT网站 » sql的执行顺序(sql的全称)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

志达IT网站 每天分享编程和互联网的IT技术博客

登录/注册联系我们