目录
1.概述
查询执行顺序是从数据源头开始,逐步筛选、分组、计算和排序,最后限制返回结果的数量。总体顺序为:
FROM(确定数据源,虽未在给定关键字中,但属于基础步骤)→WHERE(筛选原始数据)→GROUP BY(分组)→HAVING(过滤分组结果)→SELECT(选择列)→ORDER BY(排序)→LIMIT(限制结果数量)。
2.步骤
(1)FROM(数据源确定)
这是查询的起始步骤,虽然没有在你要求的这些部分之中,但它是基础。例如,在SELECT * FROM employees中,FROM employees确定了数据是从employees表中获取。这一步骤为后续操作提供了原始数据集合。
(2)WHERE(筛选)
基于FROM确定的原始数据,WHERE子句对其进行筛选。它会根据设定的条件,过滤掉不符合要求的数据。例如,SELECT * FROM employees WHERE salary > 5000,会检查employees表中的每一条记录,只有当salary列的值大于 5000 时,这条记录才会被保留,进入下一个处理阶段。
(3)GROUP BY(分组)
经过WHERE筛选后的剩余数据会进行分组操作。GROUP BY子句按照指定的列将数据划分为不同的组。比如,SELECT department, COUNT(*) FROM employees WHERE salary > 5000 GROUP BY department,在前面筛选出工资大于 5000 的员工记录后,会按照department列将这些记录分组,为后续对每个组进行聚合操作(如COUNT(*))做准备。
(4)HAVING(过滤分组结果)
分组完成后,HAVING子句用于对分组后的结果进行过滤。它通常基于聚合函数的结果来筛选分组。例如,SELECT department, COUNT(*) FROM employees WHERE salary > 5000 GROUP BY department HAVING COUNT(*) > 3,在按部门分组并计算每个部门工资大于 5000 的员工数量后,只有当部门内员工数量大于 3 时,这个部门分组才会被保留。
(5)SELECT(选择列)
在数据经过筛选、分组和再次过滤后,SELECT子句开始工作。它用于选择要在结果集中返回的列。这些列可以是原始表中的列,也可以是通过聚合函数等计算得到的列。例如,在前面的查询中,SELECT department, COUNT(*)选择了department列和每个部门的员工数量列(通过COUNT(*)计算得到)作为最终结果集要返回的列。
(6)ORDER BY(排序)
对SELECT选择的列构成的结果集进行排序操作。ORDER BY可以指定按照一个或多个列进行升序(ASC)或降序(DESC)排列。例如,SELECT department, COUNT(*) FROM employees WHERE salary > 5000 GROUP BY department HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC,在确定了要返回的部门和员工数量列后,按照员工数量列进行降序排列结果集。
(7)LIMIT(限制结果数量)
最后,LIMIT子句用于限制最终返回结果集的行数。可以指定一个数字,表示返回固定数量的行;也可以指定两个数字,用于指定偏移量和要返回的行数。例如,SELECT department, COUNT(*) FROM employees WHERE salary > 5000 GROUP BY department HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC LIMIT 5,在排序后的结果集中,只返回前 5 行记录。