写在前面:最近的工作主要是写SQL脚本,在编写过程中对SQL的执行和解析过程特别混乱不清,造成了想优化却无从下手。为此专门在网上找博文学习,并做了如下总结。
1、查询中常用到的关键词有:
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY
其中,SELECT与FROM是必需的,其他关键词则是可选的。
2、这些关键词的书写顺序:
SELECT 字段列表
FROM 表名
WHERE 记录筛选条件
GROUP BY 分组字段列表
HAVING 分组筛选条件
ORDER BY 排序字段列表
3、WHERE与HAVING的区别:
WHERE是对记录进行筛选;而HAVING是对按GROUP BY进行分组后的组进行筛选。
HAVING只有在使用GROUP BY 后才能使用。
4、GROUP BY的两个作用:
第一个作用是,将从表中取出的记录按照一个或者多个字段进行分组;
第二个作用是,去重,其本质仍然是分组。
5、这些关键词的解析/执行顺序:
FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY
具体的说:
FROM:组装来自不同数据源的记录
WHERE:根据指定的条件过滤上一步检索出的记录
GROUP BY:对上面过滤后的记录按指定条件分组
SUM/AVG/COUNT:使用聚合函数进行计算
HAVING:对所有分组根据指定条件进行过滤
SELECT:从上一步过滤后的各个分组记录中提取指定查询的字段列表(包括聚合字段、计算字段、表达式字段等)
ORDER BY:对上一步查询得到的结果集按照排序字段列表进行排序,并输出排序结果
6、GROUP BY 字段1,字段2——先对所有记录按照字段1进行分组,然后对分组后的结果再在没组内按照字段2分组。
7、ORDER BY 字段1,字段2——先按照字段1进行排序,再按照字段2进行排序。
8、排序规则关键字:ASC(升序,默认)、DESC(降序)。
9、COUNT关键字,作计数使用。COUNT(*)是做候选数据集的整体计数,COUNT(字段)是对某字段进行计数。如果某列出现NULL值时,COUNT(*)会算入该列,COUNT(字段)则不会算入该列。
举例:
在学生成绩表中,把班级为1班的学生成绩按照学生姓名分组,并且筛选分组结果,汇总计算各个学生的总成绩,选出总成绩大于600分的学生列表,并按照总分从高到低排列。
SQL语句如下:
select std_name, sum(score) as sum_score
from grade_table
where class_id=1
group by std_name
having sum(score)>600
order by 2 asc
在上面的示例中SQL语句的执行顺序如下:
①首先执行FROM子句,从grade_table表检索记录;
②执行WHERE子句,筛选出grade_table表中class_id=1的所有记录;
③执行GROUP BY子句,把grade_table表按std_name列进行分组;
④计算SUM()聚集函数,求出每个std_name的score之和;
⑤执行HAVING子句,筛选出sum(score)大于600的分组;
⑥提取std_name,sum(score)两个字段,产生新的结果集;
⑦执行ORDER BY子句,把⑥的结果集按sum(score)字段升序排列。
参考资料:
[1]查询语句中select from where group by having order by的执行顺序
[3]sql关键词执行先后顺序
感谢!
文中如有错误和描述不当,欢迎指正!