• SQL入门学习2-聚合与排序


    3-1 对表进行聚合查询

    聚合函数

    所谓聚合,就是将多行汇总为一行。

    函数名 功能
    COUNT 计算表中的记录数(行数)
    SUM 计算表中数值列的数据合计值
    AVG 计算表中数值列的数据平均值
    MAX 求出表中任意列中数据的最大值
    MIN 求出表中任意列中数据的最小值

    使用举例:

    SELECT  COUNT(*)
    FROM Test ;
    
    • COUNT
      则会输入一条记录包括计算所有行的总数
      计算NULL以外数据的行数
      要计算列中非NULL的行数,那么可以直接使用列名当COUNT的参数。
      例:
      SELECT COUNT (age)
      FROM Test ;
      
      ** 除了COUNT外,其他函数不能使用星号(*)作为参数 **
    • SUM & AVG
      只能用于数值类型列。
      在使用SUM时候,传入参数列名,计算时,将无视列中NULL项的数据。
    • MIN & MAX
      能够适用于任何数据类型的列。
      具体比较大小的方式参照之前的比较运算符准则(字典序)。

    删除重复记录
    使用DISTINCT关键字
    例如:
    计算取出 重复数据 后的数据行数。

    SELECT COUNT (DISTINCT name)
    FROM Test ;
    
    

    注意,DISTINCT必须写到括号中,因为必须要计算行数之前删除age中重复的数据。

    3-2 对表进行分组

    GROUP BY子句

    将表中的记录,根据GROUP BY 子句后面的列,列中的内容 相同的为一组。
    这样去分组。
    GROUP BY 子句需要配合聚合函数使用。
    只不过是将原表进行分组,然后再使用聚合函数。
    也将GROUP BY 子句后面跟的列名,称为聚合键

    语法:

    SELECT <列名1>,<列名2>,<列名3>,<列名4>……
    FROM <表名>
    GROUP BY <列名1>,<列名2>,<列名3>,<列名4>……
    

    例:

    SELECT age , sex , COUTN (*)
    FROM Test 
    GROUP BY age, sex ;
    

    解释:即把age ,和sex 相同的记录项分为一组。
    分出各个组之后,然后每个组都执行COUNT聚合函数,然后结果就为输出结果中的一项。
    SELECT子句中,可以不只一个聚合函数,可以同时有多个, 则结果会有多列的输出。
    注意

    1. 在SELECT子句中的,除了聚合函数外,其他的列名都要出现在GROUP BY子句中。
    2. GROUP BY 子句的书写位置有要求,一定要书写在FROM、WHERE语句之后。
    3. 暂定语句书写顺序: SELECT - FROM - WHERE - GROUP BY

    聚合键中包含NULL的情况
    当聚合键中包含了NULL的情况,那么会将NULL作为一组特定的数据,归为一组。
    当GROUP BY 与WHERE进行组合的时候,会先根据WHERE子句指定的条件进行过滤,然后再进行聚合处理。
    各子句执行顺序
    FROM-WHERE-GROUP BY-SELECT


    与聚合函数和GROUP BY子句有关的常见错误

    • 使用COUNT这类的聚合函数时,SELECT子句中智能存在以下三种元素:

      • 常数
      • 聚合函数
      • GROUP BY 子句中指定的列名,顺序不一定要相同。
    • 在GROUP BY 子句中写了列的别名
      例如:

      SELECT name  as myname , COUNT(*)
      FROM Test
      GROUP BY myname ;
      

      这样的代码是错误的,GROUP BY 子句中不能够使用别名,要使用原来的列名。

    • 在WHERE子句中使用了聚合函数
      聚合函数只能使用在SELECT 以及HAVING函数中。
      所以是不能能够使用在WHERE子句中的
      以下为错误代码:

      SELECT name , COUNT(*)
          FROM Test
          WHERE COUNT(*) = 2
          GROUP BY name;
      

    3-3 为聚合结果指定条件

    HAVING子句

    WHERE子句,智能指定记录的条件,而不能用来指定组的条件。(例如“数据行数为2行”)
    因此,需要使用HAVING子句
    语法:

    SELECT <列名1>, <列名2>, <列名3> ……
        FROM <表名>
        GROUP BY <列名1>, <列名2>, <列名3>……
        HAVING <分组结果对应的条件>
    

    HAVING子句必须写在GROUP BY子句的后面。
    HAVING 子句和包含GROUP BY 子句时的SELECT子句一样,能够使用的要素有一定的限制。限制内容也是完全相同的。

    • 常数
    • 聚合函数
    • GROUP BY 子句中指定的列名。

    但是注意
    聚合键所对应的条件不应该书写在HAVING子句中,而应该写咋WHERE子句当中。


    3-4 对查询结果进行排序

    在SELECT语句中,加入ORDER BY子句进行排序
    语法:

    SELECT <列名1>, <列名2>, <列名3>……
    FROM <表名>
    ORDER BY <排序基准列1>, <排序基准列2>,……
    

    默认由低到高进行排序。
    不管什么时候,ORDER BY子句都会写在SELECT所有子句的末尾。
    处理顺序:
    SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY

    另外可以设置多个排序键,进行更细致的排序。

    升序或降序

    只要在 ORDER BY 子句后面直接加上关键字就可以实现升序 或者降序的排序:

    • ASC 升序(默认)
      由小到大
    • DESC 降序
      由大到小

    NULL的顺序

    在排序键中,如果有NULL的项,NULL会在结果的开头或者末尾总显示

    排序中使用别名。

    在排序中可以使用别名。
    为什么GROUP BY 不能使用别名,但是ORDER BY 子句中可以使用别名。
    因为SQL语句在DBMS内部的执行顺序被掩盖起来了。
    使用ongoingHAVING子句时SELECT语句的顺序
    FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
    一定要记得,SELECT子句的执行,一定在GROUP BY子句之后,但在ORDER BY子句之前。因此GROUP BY语句无法识别别名。

    ORDER BY子句中可以使用的列

    ORDER BY 子句中可以使用存在于表中,但不包含在SELECT 子句中的列。
    且ORDER BY子句,也可以适使用聚合函数。

    排序列编号

    ORDER BY子句中,还可以使用在SELECT子句中出现的列所对应的编号
    例如:

    SELECT name ,age 
    FROM Test 
    ORDER 2 DESC, 1;
    

    这等价于

    SELECT name, age 
    FROM Test
    ORDER age DESC, name;
    

    这样虽然使用起来非常方便,但是不推荐使用:

    1. 阅读起来比较困难。
    2. SQL-92明确说明该功能将来会被删除。
  • 相关阅读:
    GTC China 2016观感
    关于OpenGL的绘制上下文
    Voreen(三) 光线投射参数介绍
    分享一些DICOM数据下载网站
    Voreen (二) 入点出点计算
    Voreen (一) GPU Raycast主流程
    GPU渲染和GDI
    程序媛壮志雄心尝试装机,命运多舛壮志未酬失败告终~
    安装Newton版Glance
    安装Newton版Swift,配合keystone认证
  • 原文地址:https://www.cnblogs.com/subaiBlog/p/5410945.html
Copyright © 2020-2023  润新知