关于sql和MySQL的语句执行顺序(必看!!!)

ql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。 

一、sql执行顺序 
(1)from 
(3) join 
(2) on 
(4) where 
(5)group by(开始使用select中的别名,后面的语句中都可以使用)
(6) avg,sum.... 
(7)having 
(8) select 
(9) distinct 
(10) order by 

从这个顺序中我们不难发现,所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。 
第一步:首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表 vt1(选择相对小的表做基础表) 
第二步:接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2 
第三步:如果是outer join 那么这一步就将添加外部行,left outer jion 就把左表在第二步中过滤的添加进来,如果是right outer join 那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3 
第四步:如果 from 子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3。 
第五步:应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,在这有个比较重要的细节不得不说一下,对于包含outer join子句的查询,就有一个让人感到困惑的问题,到底在on筛选器还是用where筛选器指定逻辑表达式呢?on和where的最大区别在于,如果在on应用逻辑表达式那么在第三步outer join中还可以把移除的行再次添加回来,而where的移除的最终的。举个简单的例子,有一个学生表(班级,姓名)和一个成绩表(姓名,成绩),我现在需要返回一个x班级的全体同学的成绩,但是这个班级有几个学生缺考,也就是说在成绩表中没有记录。为了得到我们预期的结果我们就需要在on子句指定学生和成绩表的关系(学生.姓名=成绩.姓名)那么我们是否发现在执行第二步的时候,对于没有参加考试的学生记录就不会出现在vt2中,因为他们被on的逻辑表达式过滤掉了,但是我们用left outer join就可以把左表(学生)中没有参加考试的学生找回来,因为我们想返回的是x班级的所有学生,如果在on中应用学生.班级='x'的话,left outer join会把x班级的所有学生记录找回(感谢网友康钦谋__康钦苗的指正),所以只能在where筛选器中应用学生.班级='x' 因为它的过滤是最终的。 
第六步:group by 子句将中的唯一的值组合成为一组,得到虚拟表vt5。如果应用了group by,那么后面的所有步骤都只能得到的vt5的列或者是聚合函数(count、sum、avg等)。原因在于最终的结果集中只为每个组包含一行。这一点请牢记。 
第七步:应用cube或者rollup选项,为vt5生成超组,生成vt6. 
第八步:应用having筛选器,生成vt7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。 
第九步:处理select子句。将vt7中的在select中出现的列筛选出来。生成vt8. 
第十步:应用distinct子句,vt8中移除相同的行,生成vt9。事实上如果应用了group by子句那么distinct是多余的,原因同样在于,分组的时候是将列中唯一的值分成一组,同时只为每一组返回一行记录,那么所以的记录都将是不相同的。 
第十一步:应用order by子句。按照order_by_condition排序vt9,此时返回的一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正因为返回值是游标,那么使用order by 子句查询不能应用于表表达式。排序是很需要成本的,除非你必须要排序,否则最好不要指定order by,最后,在这一步中是第一个也是唯一一个可以使用select列表中别名的步骤。 
第十二步:应用top选项。此时才返回结果给请求者即用户。 

二、mysql的执行顺序 
SELECT语句定义 
一个完成的SELECT语句包含可选的几个子句。SELECT语句的定义如下: 
SQL代码 

 

[java] view plain copy
  1. <SELECT clause> [<FROM clause>] [<WHERE clause>] [<GROUP BY clause>] [<HAVING clause>] [<ORDER BY clause>] [<LIMIT clause>]   

SELECT子句是必选的,其它子句如WHERE子句、GROUP BY子句等是可选的。 
一个SELECT语句中,子句的顺序是固定的。例如GROUP BY子句不会位于WHERE子句的前面。 

SELECT语句执行顺序 
SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的,所以并不是从SELECT子句开始执行的,而是按照下面的顺序执行: 
开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果 
每个子句执行后都会产生一个中间结果,供接下来的子句使用,如果不存在某个子句,就跳过 
对比了一下,mysql和sql执行顺序基本是一样的, 标准顺序的 SQL 语句为: 

 

 

[html] view plain copy
  1. select 考生姓名, max(总成绩) as max总成绩   
  2.   
  3. from tb_Grade   
  4.   
  5. where 考生姓名 is not null   
  6.   
  7. group by 考生姓名   
  8.   
  9. having max(总成绩) > 600   
  10.   
  11. order by max总成绩   


 在上面的示例中 SQL 语句的执行顺序如下: 

   (1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据 

   (2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据 

   (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组(注:这一步开始才可以使用select中的别名,他返回的是一个游标,而不是一个表,所以在where中不可以使用select中的别名,而having却可以使用,感谢网友  zyt1369  提出这个问题)

   (4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值 

   (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的. 

   (7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序. 

转载于:https://www.cnblogs.com/yyjie/p/7788428.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fedora linux命令,Fedora Linux的一些常用设置和常用命令

1.设置常用路径跳转:alias ubootcd /opt/U-boot-2009.11_tekkaman/U-boot-2009.11_tekkaman/2.samba服务重启命令在更改ip后&#xff0c;或修改samba配置文件后&#xff0c;如果没有重启服务&#xff0c;所作的修改实际上是不会生效的重启网络服务的命令是service network rest…

10大黑客专用的 Linux 操作系统,你了解哪些?

今天列出一些最常用、最受欢迎的Linux发行版来学习黑客和渗透测试。1. Kali LinuxKali Linux是最著名的Linux发行版&#xff0c;用于道德黑客和渗透测试。Kali Linux由Offensive Security开发&#xff0c;之前由BackTrack开发。Kali Linux基于Debian。它带有来自安全和取证各个…

【windows phone】CollectionViewSource的妙用

在windows phone中绑定集合数据的时候&#xff0c;有时候需要分层数据&#xff0c;通常需要以主从试图形式显示。通常的方法是将第二个ListBox&#xff08;主视图&#xff09;的数据源绑定到第一个ListBox &#xff08;从视图&#xff09;的SelectedItem&#xff0c;或者通过第…

ftp linux包,图文详解Ubuntu搭建Ftp服务器的方法(包成功)

一、今天下午由于课程的要求不得已做了Ubuntu搭建Ftp服务器的实验&#xff0c;但是实验指导书还是N年前的技术&#xff0c;网上搜了一大把&#xff0c;都是模模糊糊的&#xff01;在百般困难中终于试验成功&#xff0c;特把经验分给大家 希望大家少走弯路&#xff01;二、详细步…

产品狗,工作三年,转行AI应该怎样规划?

作为AI 初学者来说&#xff0c;最大的问题就是&#xff1a;资料太多&#xff01;&#xff01;&#xff01;看不完&#xff01;&#xff01;&#xff01;不知道如何取舍&#xff01;&#xff01;&#xff01;人的精力有限&#xff01;&#xff01;&#xff01;大部分想转行AI算法…

业务系统里面常见的方法接口设计

在程序中用得最多的还是方法&#xff0c;在处理业务的系统中如何设计方法是一个很重要的问题。很多系统由于缺乏统一的约定而导致维护困难。本文主要介绍的是偶在平常的开发中总结出来的一些方法设计的思路。希望大家不嫌弃。 1. 简单的方法 void DoSth(args) { // …

linux python 信号,Python模块之信号(signal)

在了解了Linux的信号基础之 后&#xff0c;Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号&#xff0c;典型的操作包括预设信号处理函数&#xff0c;暂 停并等待信号&#xff0c;以及定时发出SIGALRM等。要注意&#xff0c;signal包主要是…

你为什么喜欢VIM?

昨天看到的一个讨论&#xff0c;说vim有没有那么必要&#xff1f;所以写了这篇文章&#xff0c;在评论区说出你的观点&#xff0c;当然说出你的观点的时候&#xff0c;你拿不到一百万&#xff0c;也得不到小红花&#xff0c;但也是因为你的评论&#xff0c;我可能会开心一整天。…

新世纪篇章

团队blog开通http://www.cnblogs.com/team/solartimes.html还没弄明白怎么搞。。。一阵研究solartimes成员&#xff0c;快来注册。。。 转载于:https://www.cnblogs.com/konimeter/archive/2005/09/19/239671.html

RTT大牛告诉你,混合微内核是什么?

RT-Thread之前写过好几篇文章介绍微内核&#xff0c;然而不少开发者依然不清楚到底微内核操作系统是什么。为此&#xff0c;我们特别整理了5期快问快答&#xff0c;来为大家答疑解惑&#xff01;RT-Thread Smart称作是混合微内核操作系统&#xff0c;为什么叫混合微内核操作系统…

linux操作指令及根目录介绍

1. 查看当做操作目录位置 > pwd 2. 查看(当前)目录里边的文件内容 > ls //list > ls -l 或ll //显示文件的详细信息 > ls -al //all显示文件的详细信息(包括隐藏文件) > ls -a //显示目录全部文件名字(包括隐藏文件) > ls [-al] 目录 //查看指定目录的文件信…

计算机linux运维日记,计算机的运维系统情况

其实&#xff0c;对于计算机的主要部件来说&#xff0c;计算机是有硬件和软件组成的&#xff0c;并且能够通过硬件和软件的协同工作完成了的&#xff0c;而对于一些计算机的硬件&#xff0c;则是由一些不同的部件进行完成的&#xff0c;那么其中主要的补间就是内存&#xff0c;…

Linux ALSA 图解

最近在解决一个音频的问题&#xff0c;所以正好借这个机会来把音频的东西重新梳理一下&#xff0c;总结是一个很好的习惯&#xff0c;能方便自以后遇到问题快速排查问题。平台「MT8167」内核版本「kernel 4.4」音频读数据函数流程tinyalsa调用读取函数IOCTL调用流程读取数据到应…

OpenGL学习笔记-坐标系统

转换关系&#xff1a; 局部坐标系 &#xff08;模型矩阵&#xff09;》 世界坐标系&#xff08;观察矩阵&#xff09;》观察坐标&#xff08;投影矩阵&#xff09;》裁剪坐标 Vclip Mprojection * Mview * Mmodel * Vlocal 裁剪空间&#xff08;透视划分&#xff09;》标准化设…

将一段复杂文本变成字符串的赋值语句

因为需要在C#的代码中&#xff0c;写入一大段的js代码和网页代码&#xff0c;试验已经没有问题了。实现时却碰到一个小问题&#xff0c;就是大段的js和html代码&#xff0c;应该以什么方式存在。最省事的方式&#xff0c;其实就是存在一个单独的文件中&#xff0c;每次读入即可…

ARM 原子操作里的两个汇编指令

今天一个读者朋友给我留言&#xff0c;问了这个问题&#xff0c;ARM原子操作的汇编代码&#xff0c;还给我截图了两个不同的解释&#xff0c;让我说哪个是正确的。原子操作的起因是为了内核同步&#xff0c;保证数据在正确性&#xff0c;之前已经吹过一波&#xff0c;可以看这几…

解决Ubuntu下pycharm无法输入中文的问题

sudo nautilus在这个界面中通过“计算机”进入pycharm.sh所在文件夹。一般在安装包的bin文件夹中。3、在文件pycharm.sh中添加红色字样内容&#xff08;根据自己实际pycharm.sh文件内容适当添加&#xff09;[maokxlocalhost bin]$ vi pycharm.sh# ----------------------------…

奥鹏20春在线作业c语言,电子科20春《C语言(专科)》在线作业3答案

试卷总分:100 得分:100一、单选题 (共 20 道试题,共 100 分)1.已知intb;则对指针变量p正确的说明和初始化是&#xff1a;()A.intpb;B.intp&b;C.int*pb;D.int*p&b;答案:2.对于int*p;inta[];pa;的合法运算()A.若p中的地址为100则p;运算后&#xff0c;则其值为100B.p;相当…

秒,在解答这个C语言题目上,我们都败了

看这篇文章之前&#xff0c;我觉得可以先看看下面这篇文章 看printk引发的一点思考不管我们用的printk还是printf&#xff0c;它们的核心都是可变参数的函数&#xff0c;所以可以拼接很多参数传递给函数实体&#xff0c;然后函数实体里面可以通过某种方式解析这些参数。看看这个…