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进行分页查询。
执行顺序和编写顺序相比,只是将最开始的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
该语句的执行结果如下:
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;
查询效果如下,没有任何异常,数据查询无误。
综上可以得出一个结论,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定义的别名。
综上可以得出一个结论,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;
综上得出结论:首先执行的是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 起始索引,每页查询的记录数