第12讲:DQL数据查询语句的执行顺序以及语句汇总

DQL数据查询语句的执行顺序以及语句汇总

1.DQL数据查询语句的执行顺序

1.1.DQL查询语句的执行顺序

如下图所示,左侧是DQL语句的编写顺序,右侧是DQL语句的执行顺序。

**DQL的编写顺序:**首先指定要查询的字段名称,然后指定要针对那张表进行数据查询,然后指定WHERE条件,根据条件查询出特定的数据,然后指定GROUP BY分组字段查询列表,然后指定分组查询后的条件列表,然后再指定ORDER BY排序规则,最后指定LIMIT分页查询。

编写顺序不代表DQL的执行顺序,编写顺序只是为了书写规范得体。

**DQL的执行顺序:**首先DQL会执行FROM指定的表名,先拿到要查询那张表的数据,然后根据指定的WHERE条件查询出特定的数据,然后根据GROUP BY进行分组查询,然后再根据HAING对分组后的数据进行条件筛选,然后根据SELECT指定的要查询的字段名,显示出这些字段的数据,然后再根据ORDER BY进行排序查询,最后再根据LIMIT进行分页查询。

image-20220510134825491

执行顺序和编写顺序相比,只是将最开始的SELECT放到了HAVING后面,其余的执行顺序和编写顺序一致。

1.2.验证DQL语句的执行顺序

在了解到DQL的执行顺序后,再通过一个示例来验证DQL的执行顺序。

查询name、xb、nl这三个字段的数据,要求年龄小于30岁,并且按照年龄字段升序排序。

select name,xb,nl from jszx_xgymjzxxb where nl <= '30' order by nl asc 

该语句的执行结果如下:

image-20220510140951823

1)首先来验证DQL最先执行的顺序是FROM和WHERE,对FROM后面的表名起一个别名,然后WHERE后面指定查询条件时,使用表的别名。

select xgymdjb.name,xgymdjb.xb,xgymdjb.nl from jszx_xgymjzxxb as xgymdjb where xgymdjb.nl <= '30' order by nl asc;

查询效果如下,没有任何异常,数据查询无误。

image-20220510141222518

综上可以得出一个结论,FROM一定是先执行的,我们在WHERE条件和SELECT后面都应用了表的别名。

2)下面来验证WHERE和SELECT谁会先执行,在SELECT后面为查询的字段起一个别名,然后在WHERE条件中使用别名来查询条件。

select xgymdjb.name as 姓名,xgymdjb.xb as 性别,xgymdjb.nl as 年龄 from jszx_xgymjzxxb as xgymdjb where 年龄 <= '30' order by nl asc;

SELECT后面为字段添加了别名,当在WHERE条件中使用别名作为查询的条件,就会产生下面的报错,提示年龄字段不存在,年龄字段正是SELECT定义的别名。

image-20220510141742864

综上可以得出一个结论,SELECT后面的字段一定是在WHERE条件后面执行的语句,因为WHERE条件比SELECT条件早执行,还没有反应过来SELECT声明的别名,就已经被执行了,从而产生了这种报错。

3)已经得知SELECT是在WHERE条件之后执行的,但是并不是WHERE条件之后就是SELECT,还有ORDER BY和HAVING,这两个语句执行完毕后,才会执行SELECT。

4)SELECT是在ORDER BY之前执行的语句,我们可以拿SELECT起的别名在ORDER BY后面使用,发现是没有问题的。

select xgymdjb.name as 姓名,xgymdjb.xb as 性别,xgymdjb.nl as 年龄 from jszx_xgymjzxxb as xgymdjb where xgymdjb.nl <= '30' order by 年龄 asc;

image-20220510142707634

综上得出结论:首先执行的是FROM语句,然后执行的是WHERE语句,然后再执行GROUP BY和HAVING,然后在执行SELECT,最后执行ORDER BY和LIMIT。

2.DQL类型的SQL语句汇总

基础查询

1)查询多个字段

SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;

2)为字段设置别名

SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;

SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

3)去重查询

SELECT DISTINCT 字段列表 FROM 表名;

条件查询

SELECT 字段列表 FROM 表名 WHERE 条件列表 ;

聚合函数

SELECT 聚合函数(字段列表) FROM 表名 ;

分组查询

SELECT 字段列表,[聚合函数] FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后的过滤条件]

排序查询

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式,字段2 排序方式2

分页查询

SELECT 字段列表 FROM 表名 LIMIT 起始索引,每页查询的记录数

猜你喜欢

转载自blog.csdn.net/weixin_44953658/article/details/126617349