我们都知道一段简短的sql语句其实都不是按照我们书写的顺序从左往右执行,它是按照sql语句中的语法和函数的优先级进行解析,将上一个函数执行的结果返回给下一个函数使用,从而得到最终的结果,并且在sql语句执行的过程中会产生不同的中间临时表。那么sql语句中常见的函数和语法的优先级究竟是什么顺序呢?
以下面这段sql语句为例,包含了常见的函数和语法,那么它的执行顺序是什么样的呢
select distinct p1.price from product1 p1 join on product2 p2 on p1.id=p2.id where p2.name=nike group by p2.size having count(*)>10 order by p1.number limit 100; 复制代码
1、from
其实数据库的查询语句就好比我们在商店买东西,我们如果要买鞋,第一步肯定是要先找到一家店,同理sql语句也是第一步就是通过from来找到后面要进行查询的表,这样才能进行后续的操作。上述语句则是通过from找到要执行的表product1
2、join 和 on
如果我们想买一双鞋,那么肯定要将喜欢的款式和大小然后将这家店的价格和其他店的价格进行比较,那么就涉及到了两家店,所以还要找到另外一家店,才能找到里面的商品。而join则是连接两家店,on表示连接条件,比如鞋的价格 一样等等。
sql语句中通过from关键字找到了第一张表,如果这时候涉及到了第二张表,那么就要用join 来找到第二张表,并通过on后面的条件将第一张表和第二张表进行关联。join后面接的是要关联的表,on后面是连接的条件。如果sql语句中有此过程,则通过from和join on选择出需要查询的表1和表2,并产生笛卡尔积,生成表1和表2合并的临时中间表Temp1。on则确定表的绑定关系,通过on会产生临时中间表Temp2。
3、where
当我们找到了两家店了,买东西的时候不盲目的选择,而且有自己的要求,比如款式、价格、大小等等,这时候就需要用到where关键字。
where关键字表示筛选,根据where后面的条件对数据进行过滤,按照指定的字段的值筛选需要的数据,如果有多个条件可以使用and连接符进行联合筛选,如果在此阶段找不到数据,会直接返回客户端,不会往下进行。如果sql语句中有次过程,则这个过程会生成一个临时中间表Temp3。
在where条件语句中不可以使用聚合函数,比如min、max、count、sum、avg等函数。
4、group by
如果我们对一些条件进行筛选后,可能还是有很多的鞋符合我们的要求,我们可以对这些鞋进行分组,这样结果就能一目了然。比如按照鞋子的价格对这些鞋子进行分组。此时就需要用到group by语句。
group by是对数据按照固定的字段进行分组,如果有此过程会产生临时中间表Temp4,
group by 并不会改变数据的结果,只会改变数排列的顺序。
5、Having
对于分好组的鞋子,我们还可以进行筛选,只保留满足条件的组。这时候就需要用到having语句。Having语句通常与group by 语句联合使用,用来过滤由group by 语句返回的结果集。前面说了where语句中不能使用聚合函数,则Having语句的存在则弥补了where关键字不能与聚合函数联合使用的不足。
6、select
对于重重筛选出来的鞋子,就是我们想要买的鞋子了,这些鞋子这时候才会展示在我们面前。而select就表示将那些符合条件的数据以规定好的样式展示出来。
7、distinct
这时候找出来的鞋子,每组符合条件的鞋子价格、样式、大小都一样,但是可能不止一个,但我们买鞋肯定一样的鞋子只买一个,这时候就可以使用Distinct语句对这些鞋子进行去重,一样的鞋子只保留一双。
8、order by
这时候还可以对这些鞋子进行一个排序,比如按照买的人的多少(降序或者升序,默认升序),这时候可以通过order by加上字段名对结果集进行排序 ,这个过程比较耗费资源。
9、limit
对于已经排好序的鞋子,我们并不需要所有的,只需要前面的1个,而这一个就是我们通过重重筛选找出来的自己想要买的鞋子,这时候可以借助limit关键字,limit关键字加数字就表示取数据的前多少个结果进行展示。
至此这一整条sql语句才执行完毕。以上就是在一条包含各种函数和关键字的sql语句中各函数的执行顺序。
执行顺序总结如下:
1、from
2、join on
3、where
4、group by
5、having
6、select
7、distinct
8、order by
9、limit
以上就是对于sql语句执行顺序的简单的总结!