聚集函数

SQL中的关系代数扩展有(其中A为某属性):

  • count(*) 统计关系中有多少元组
  • count(A) 统计属性A有多少个,可加distinct
  • sum(A) 求和,可加distinct
  • avg(A) 求平均,可加distinct
  • max(A) 求最大值
  • min(A) 求最小值

聚集函数不能嵌套使用。

  1. select count(student.grade)
  2. from student
  3. where student.age == 18

以上代码求出所有18岁的学生中有多少个不同年级。

分组

  1. select target_list
  2. from relation_list
  3. where qualification
  4. group by grouping_list
  5. having group_qualification

以上是分组的标准格式。
分组语句将group by后的属性相同的划分为一组,对每一组进行select-from-where查询并生成一个元组。
having子句对group by中的组再做一次筛选。

分组语句的执行步骤如下:

  1. 对from的表进行笛卡尔乘积
  2. where筛选结果
  3. 按照group by来分组
  4. having筛选分组结果
  5. select投影,每组得到一个元组
  1. select S.rating, min(S.age) as minage
  2. from Sailors S
  3. where S.age >= 18
  4. group by S.rating
  5. having count(*) > 1

例如,以上代码用上面的执行步骤来看,先从Sailors表中筛选age > 18的元组,以每个不同的rating为标志分组,最后对每个分组筛选出组中的元组大于1的组。