结构化查询语言之 SQL 聚集运算(以Mysql为例)

477 阅读2分钟

@[TOC] 查询使用的数据库文件下载


  聚集函数是以值的一个集合为输入、返回单个值的函数。SQL 提供了五个固有聚集函数:

  • 平均值:avg
  • 最小值:min
  • 最大值:max
  • 总和:sum
  • 计数:count

sum和avg的输入必须是数字集,但其它运算符还可以作用在非数字数据类型的集合上;

1. 基本聚集

  • 查找''Computer science''系的平均工资

    select avg(salary) as avg_salary
    from instructor
    where dept_name='Comp.Sci.';
    

    在这里插入图片描述

  • 计算平均值时注意保留重复元祖,但某些情况需要删除重复元祖以进行聚集,如找出2010年春教授课程的老师数量

    select count(distinct ID)
    from teaches
    where semester='Spring' and year=2010;
    

    在这里插入图片描述

  • 计算关系中元祖的个数:count(*)

2. 分组聚集

  • group by 子句

    • group by 子句给出的一个或多个属性是用来构造分组的,group by 子句中的所有属性上取值相同的元祖将被分在同一组;

      • 例子:查找每个系的平均工资:
    select dept_name,avg(salary) as avg_salary
    from instructor
    group by dept_name
    

    在这里插入图片描述

    • SQL查询使用分组时,注意保证出现在select语句中但没有被聚集的属性只能是出现在group by子句中的那些属性(即,任何没有出现在group by子句中的属性如果出现在select子句的话,它只能出现在聚集函数内部,否则这样的查询是错误的);
  • having子句

    • having:针对分组限定条件

    • 例子:找出系平均工资超过42000美元的那些系中教师的平均工资

      select dept_name,avg(salary) as avg_salary
      from instructor
      group by dept_name
      having avg(salary)>42000
      

      在这里插入图片描述

      • 任何出现在having语句中但没有被聚集的属性只能是出现在group by子句中的那些属性。
  • 包含聚集、group by或having子句的查询的含义可通过下述操作序列来理解:

    • 首先,from子句计算出关系;
    • 如果出现where子句,则where子句筛选关系元祖;
    • 如果出现group by子句,对经筛选的元祖分组;
    • 如果出现having子句,筛选分组;
    • 最后,执行select;

3. 对空值和布尔值的聚集:

  • 假设instructor关系中某些元祖在salary上取空值,针对以下查询:

    • select sum(salary) from instructor

      SQL标准并不认为总和为null,而是忽略求和的值集中的空值

  • 聚集函数根据以下原则处理空值:除了count(*)外所有的聚集函数都忽略输入集合中的空值;

    • 由于空值被忽略,可能造成参加聚集函数运算的输入集合为空,故规定空集count运算值为0,其它聚集运算在输入为空集时返回空值。
  • boolean:

    • 使用 some 与 every 聚集函数;

References: [1] Abraham Silberschatz, Henry F Korth, S Sudarshan. Database System Concepts. New York: McGraw-Hill, 2010 Database System Concepts