SQL和mysql语句执行顺序分析
今天的一个问题是在MySQL中插入和更新和删除语句时使用别名吗我仍然在看它,但在查看数据时,我发现了一些有用的知识,这些数据是关于SQL和MySQL语句序列的:SQL和MySQL执行顺序发现内部机制是相同的,最大的不同在于别名的引用。
一、SQL执行命令
(1)
(2)关于
(3)加入
(4)在何处
(5)组(从SELECT中的别名开始,可以在下面的语句中使用)
(6)平均值、和…
(7)有
(8)选择
(9)明显的
(10)按顺序
从这个序列中,我们可以很容易地发现所有查询都是从。在执行过程中,每个步骤将生成下一步的虚拟表,该表将被输入到下一步。
第一步:首先,执行一个FROM子句中的第一个表的笛卡尔积,当虚拟表VT1产生(选择基表相对小的表)。
第二步:下一步是应用过滤器。逻辑表达式在将应用在VT1的每一行,并满足逻辑表达式的行被选中来生成虚拟表VT2。
第三步:如果外加入后这一步骤将添加一个外部的线,左外连接把左表增加滤波器的第二步,如果右外部联接将右表中添加第二步过滤掉线,这个虚拟表VT3
第四步:如果FROM子句中的表的数量是两个以上的表,然后将VT3第三表计算笛卡尔积和生成虚拟表。这个过程是一个1-3步骤,最后得到一个新的虚拟表VT3。
第五步:在滤波器中的应用,对一步法生产参考滤波器生成虚拟表VT4虚拟表,在这个非常重要的细节要说的,因为含有查询外加入条款,到底有一个令人困惑的问题,对过滤器或过滤指定的逻辑表达最大的区别在哪里是如果应用到逻辑表达式,然后在第三步外的加入,删除的行也可以添加回来,和那里的最终去除。一个简单的表一个学生的例子(类名)和评分(姓名,成绩),我需要所有的学生都对现在的X级成绩的回报,但是这个班有几个学生缺席,不记录在结果表。为了得到想要的结果的子句指定学生得分,我们需要(得分=名称。学生关系。然后我们发现这个名字)在第二步骤的实施,学生没有参与检查的记录将不会出现在VT2、因为他们是逻辑表达式过滤掉对然而,我们使用左外部联接左表(学生)不参与学生的检查回来,因为我们想回到X班所有的学生,如果学生在。类= 'x',左外连接将所有学生记录X班回来(感谢朋友康秦某__康禽苗。),所以学生只能应用在滤波器。过滤器类= 'x'因为这是最后的。
第六步:GROUPBY子句将只值在组成一组,和虚拟表VT5得到。如果应用组,然后所有步骤后,只能得到的VT5或聚合函数列(计数,求和,平均值,等等)。原因是最终的结果集中每个组只有一行。请记住这一点。
第七步:使用CUBE或ROLLUP选项为VT5生成VT6产生超级组。
第八步:使用具有滤波产生VT7,具有过滤是第一位的,是适用于已分组数据的过滤。
第九步:处理SELECT子句,在选择出现的VT7列生成vt8过滤掉。
第十步:使用不同的条款,同样被排除在vt8,和VT9产生。事实上,如果你使用GROUP BY子句,则明显是多余的。原因是当分组时,列的唯一值被划分为一个组,每个组返回一行记录,因此记录将不同。
第十一步:使用ORDER BY子句。排序VT9的order_by_condition,光标回到此时,不是一个虚拟的table.sql是基于集合理论,设定将不会提前他的线排序,它只是一个逻辑组的成员,和其成员的顺序是无关紧要的。查询这是在表的排序可以返回一个包含一个特定的物理顺序的逻辑组织,这个对象被称为光标,返回值是一个指针,通过查询订单的条款不适用于表的排序是非常有成本意识的表达。除非您必须排序,最好不要指定顺序,最后,在这一步中,这是在SELECT列表中使用别名的第一步和唯一步骤。
第十二步:应用顶部选项。此时,结果返回给请求者,用户。
二、mysql的执行顺序
SELECT语句的定义
一个完整的SELECT语句包含几个可选子句。SELECT语句的定义如下所示:
SQL代码
{ { } { } { } { }
选择子句是必需的,其他子句,如WHERE子句、组子句是可选的。
在SELECT语句中,子句的顺序是固定的。例如,BY子句不在WHERE子句的前面。
选择语句执行顺序
SELECT子句的执行顺序与SELECT子句的输入顺序不同,所以它不是从select子句执行的,而是按以下顺序执行的。
> > WHERE子句>组子句子句>具有子句>按子句子句>选择子句>限制子句>最后结果
在执行每个子句之后,将为下一个子句使用一个中间结果,如果没有子句,它将跳过。
与此相反,MySQL和SQL执行序列基本上是相同的,标准的sql语句是:
选择考生姓名,最大(总分)为马克斯总分
从tb_grade
考生姓名不为空
考生姓名
拥有最大(总成绩)> 600
按马克斯总分排序
在上面的例子中,SQL语句的执行顺序如下所示:
(1)。首先执行FROM子句从tb_grade表的数据源的数据集合
(2)。执行WHERE子句中的过滤器tb_grade表不为空的所有数据
(3)。GROUPBY子句的tb_grade表进行分组,根据学生姓名栏(注:此步骤可用于选择的别名,他返回一个指针,而不是一个表,所以在这里不能用在选择别名,但你可以用zyt1369,感谢提出这个问题的网友)
(4)。计算最大(聚合)函数,根据总成绩找出总结果的最大数目。
(5)。为了执行有保留的条款,筛选课程的总成绩超过600。
(7)。执行按订单子句,并根据最大得分排序最终结果。
对于我的问题,我会继续寻找,也希望上帝能用心去做。
总结
以上是完整的sql语句和mysql语句执行顺序分析,不足之处,欢迎留言,小编辑会及时回复您。
有兴趣的朋友可以看到:mysql语句查询效率慢优化技巧示例,mysql子查询和嵌套查询优化案例分析,几个重要的mysql变量等,希望对您有所帮助。