目录
前言:
在学习SQL的时候,一定要动手去敲代码,然后要善于思考,为什么要这样做?这样做有什么好处?只有带着问题去学习,我们的收获才能最大化。希望你再阅读完本篇文章之后,你会把查询字段执行的顺序真正地理解,而不是简单的记住。
路漫漫其修远兮,吾将上下而求索。与诸君共勉
1.查询顺序的结论
在SQL92语法中:
SELECT ...,....,...
FROM ...,...,....
WHERE 多表的连接条件
AND 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
在SQL99语法中:
SELECT ...,....,...
FROM ... JOIN ...
ON 多表的连接条件
JOIN ...
ON ...
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
#其中:
#(1)from:从哪些表中筛选
#(2)on:关联多表查询时,去除笛卡尔积
#(3)where:从表中筛选的条件
#(4)group by:分组依据
#(5)having:在统计结果中再次筛选
#(6)order by:排序
#(7)limit:分页
各个字段执行的顺序:
2.证明执行顺序
1.证明 from 比select 先执行
思路:
给表起一个别名,通过测试 你会发现,若想说明一个字段它属于哪一个表中,此时这个表名必须是新名字的表名。
类似这样:
2.证明from 比where 先执行
思路:
给表名起别名后,然后在where语句中说明字段属于哪一个表
类似这样:
3.证明where 比select先执行
思路:
在select中给字段起别名后,看看在where中能否使用
其他字段也可以从逻辑上来说明执行的先后顺序:
例如这样:
查询数据之前,要先from 找到表,接着用where 来筛选你要查的数据,
然后你也可以用group by 来分组 ,之后可以 having 来过滤你不要的数据,
得到你想要的数据后,可以用select 去查询显示出来
查询的数据没有顺序,可以使用order by 来排序
数据又太多,可以使用limit来分页;
(仔细理解 希望能帮助你形象记忆一下)
3.SQL的执行原理
SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:
1. 首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
2. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟 表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。
当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得 到是我们的原始数据。
然后进入第三步和第四步,也就是 GROUP 和 HAVING 阶段 。在这个阶段中,实际上是在虚拟表 vt2 的 基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4 。
当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段 。
首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表 vt5-1 和 vt5-2 。
当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段 ,得到 虚拟表 vt6 。
最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段 ,得到最终的结果,对应的是虚拟表 vt7 。
当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。
同时因为 SQL 是一门类似英语的结构化查询语言,所以我们在写 SELECT 语句的时候,还要注意相应的 关键字顺序,所谓底层运行的原理,就是我们刚才讲到的执行顺序。