select执行

Posted autointerface

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select执行相关的知识,希望对你有一定的参考价值。

整合不同的数据源,用常数列作为这个表的标记,就需要查询常数SELECT ‘王者荣耀‘ as platform, name FROM heros

书写顺序  SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

执行顺序  FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT

SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
FROM player JOIN team ON player.team_id = team.team_id #顺序1
WHERE height > 1.80 #顺序2
GROUP BY player.team_id #顺序3
HAVING num > 2 #顺序4
ORDER BY num DESC #顺序6
LIMIT 2 #顺序7

执行每个步骤都会产生一张虚拟表,作为下个步骤的输入,对用户不可见

首SELECT是先执行FROM这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
1. 首先先通过CROSS JOIN求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
2. 通过ON进行筛选,在虚拟表vt1-1的基础上进行筛选,得到虚拟表 vt1-2;
3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟表vt1-2的基础上增加外部行,得到虚拟表vt1-3。
当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据。
当我们拿到了查询数据表的原始数据,也就是最终的虚拟表vt1,就可以在此基础上再进行
WHERE阶段。在这个阶段中,会根据vt1表的结果进行筛选过滤,得到虚拟表vt2。
然后进入第三步和第四步,也就是GROUP和 HAVING阶段。在这个阶段中,实际上是在虚拟表
vt2的基础上进行分组和分组过滤,得到中间的虚拟表vt3vt4
当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到SELECT和
DISTINCT阶段。
首先在SELECT阶段会提取想要的字段,然后在DISTINCT阶段过滤掉重复的行,分别得到中间
的虚拟表vt5-1vt5-2
当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是ORDER BY阶
段,得到虚拟表vt6
最后在vt6的基础上,取出指定行的记录,也就是LIMIT阶段,得到最终的结果,对应的是虚拟表vt7

技术图片

 

 

以上是关于select执行的主要内容,如果未能解决你的问题,请参考以下文章

dai层的方法和@select那个先执行

select执行

postgresql 功能:如果 Select 没有返回任何内容,则执行另一个 Select

select for update

MySQL SELECT执行顺序

为啥来自 VIEW 的 SELECT * 比来自同一个 VIEW 的 SELECT(特定列)执行得更快?