SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification
GROUP BY grouping-list
HAVING group-qualification
一个完整的查询语句包含以上5个部分
执行顺序
- 对
from
中的两张表做笛卡尔乘积,成为一条条元组(or记录)的集合 - 根据
where
语句对1的集合进行筛选,删除不符合限定的元组 - 根据
group by
的特征,将2留下来的元组进行合并(grouping-list中的特征要相同),成为一个个元组group的集合 having
语句对3留下来的group进行条件判断,删去不符的group- 将group递交给
select
语句的一个个结果项,形成一条条记录
限制与补充说明
- group by 相当于将share共同特征值的记录合并(“捏”)在一起,成为group。没写group时,这个合并特征是相当于无限多的,也就没办法捏
- 在递交给select时,实际上是对保留下来的group进行一个单行的输出。这就决定了,select的值,如果是特征的话,必须是group特征表的子集(同group的都相同),或者是那些对group的操作的聚集函数(like Avg Max Count),总之,让每个group只对应一行输出
- having 跟select是类似的,因为它与select同样是操作group的,只不过having是对group的筛选,select是对group的一个"总结"。having语句中的条件,一定是group列表里的特征,或者是聚集函数
品,你细品~