• 【SQL 初级语法 2】聚合与排序


    目录​​​​​​​

    2 聚合与排序

    2.1 对表进行聚合查询

    1、聚合函数

    2、计算合计值

    3、计算平均值

    4、计算最大值和最小值

    5、使用聚合函数删除重复值(distinct)

    2.2 对表进行分组

    1、group by 子句

    2、聚合键中包含null的情况

    3、 略

    4、与聚合函数和group by 子句有关的常见错误

    2.3 为聚合结果指定条件

    1、having子句

    2、having 子句的构成要素

    3、相比having子句,更适合写在where子句中的条件

    2.4 对查询结果进行排序

    1、order by 子句

    2、指定升序或降序

    3、指定多个排序键

    4、NULL的顺序

    5、在排序键中使用显示用的别名

    6、order by 子句中可使用 select 子句中未使用的列和聚合函数

    7、不要使用列编号


    2 聚合与排序

    2.1 对表进行聚合查询

    1、聚合函数

    常见的5个聚合函数:count()、sum()、avg()、max()、min(),聚合函数,就是将多行汇总为1行,输入多行,输出一行。

    1. select count(*) # 计算全部数据的行数
    2. # 计算null之外的数据的行数
    3. select count(purchase_price) # 计算某一列的非空行数

    count函数的结果根据参数的不同而不同,count(*)会得到包含null的数据行数,count(<列名>)会得到null之外的数据行数。

    2、计算合计值

    sum函数即使包含null,也可以算出合计值。

    聚合函数会在计算前将null排除在外。但count(*)例外,并不会排除null。

    3、计算平均值

    avg函数计算前也会先剔除null值。

    4、计算最大值和最小值

    sum和avg只能对数值类型的列使用,而max和min几乎适用于所有数据类型的列。

    5、使用聚合函数删除重复值(distinct)

    1. select count(distinct product_type)
    2. from product

    注意,这时候distinct必须写在括号中,因为在计算行数之前要删除product_type列中的重复数据;在所有的聚合函数中都可以使用distinct函数,删除重复数据。

    2.2 对表进行分组

    1、group by 子句

    group by 子句中指定的列称为聚合键或者分组列。

    2、聚合键中包含null的情况

    当聚合键中包含null时,也会将null作为一组特定的数据进行分组,且在结果中会以“不确定”行(空行)的形式展现出来。

    3、 略

    4、与聚合函数和group by 子句有关的常见错误

    常见错误1:在select子句中书写了多余的列,也就是把聚合键之外的列名书写在了select子句中

    1. select
    2. product_name
    3. ,purchase_price
    4. ,count(*)
    5. from product
    6. group by purchase_price

    这样写会报错,“product_name必须包含在group by 子句之中,或者必须在聚合函数内使用”

    常见错误2:在group by 子句中写了列的别名,这是执行顺序的问题。

    group by 子句结果的显示是无序的。

    常见错误3:在where 子句中使用聚合函数

    只有select 子句和having 子句(以及order by子句)中能使用count等聚合函数。

    2.3 为聚合结果指定条件

    1、having子句

    在where 子句中不能使用聚合函数,要想对聚合结果进行限制,要是有group by 和having。

    1. select
    2. product_type
    3. ,count(*)
    4. from product
    5. group by product_type
    6. having count(*) = 2

    2、having 子句的构成要素

    having子句中能够使用的3种要素:常数;聚合函数;group by 子句中指定的列名(即聚合键)

    错误写法

    1. select
    2. product_type
    3. ,count(*)
    4. from product
    5. group by product_type
    6. having product_name = '圆珠笔’

    product_name 必须包含在group by 子句中,或者必须在聚合函数中使用。

    3、相比having子句,更适合写在where子句中的条件

    1. select
    2. product_type
    3. ,count(*)
    4. from product
    5. group by product_type
    6. having product_type = '衣服'
    7. select
    8. product_type
    9. ,count(*)
    10. from product
    11. where product_type = '衣服'
    12. group by product_type

    聚合键所对应的条件写在having和where子句中返回的结果是一样的,但是笔者认为,聚合键所对应的条件还是应该书写在where子句之中,原因有二:

    1.where子句和having子句的作用不同,having子句用来指定“组”的条件的,where子句用来指定“行”所对应的条件,这样,select语句可以分清两者各自的功能,理解起来也更容易。

    2.DBMS的内部实现,where执行速度快拍了张图,以后补充,

    2.4 对查询结果进行排序

    1、order by 子句

    不论何种情况,order by 子句都要写在select语句的末尾,因为对数据进行排序的操作必须在结果即将返回时执行。order by 子句中书写的列名称为排序键。

    2、指定升序或降序

    默认时 asc 升序 ;desc 是降序

    3、指定多个排序键

    4、NULL的顺序

    之前说过不能对 NULL 使用比较运算符,也就是说不能对 NULL 和数字进行排序,也不能与字符串和日期比较大小,因此,使用含有 NULL 的列作为排序键时,NULL 会在结果的开头或末尾汇总显示。

    5、在排序键中使用显示用的别名

    group by 里不能使用 select 里的别名,但是在 order by 里是允许使用的,因为,SQL 语句在DBMS 内部的执行顺序被掩盖起来了。(我理解是 select 语句执行顺序在 order by 之前)。

    6、order by 子句中可使用 select 子句中未使用的列和聚合函数

    1.order by 子句中可以使用存在于表中,但不在 select 子句中的列

    1. select
    2. product_name
    3. ,sale_price
    4. ,purchase_price
    5. from Product
    6. order by product_id
    7. # product_id 存在于 Product 表中

    2.order by 子句中也可以使用聚合函数

    7、不要使用列编号

    order by 3 desc,1

    不推荐使用,1.代码阅读起来比较难;2.该排序功能将来会被删除,可能会导致原本正常执行的 SQL 语句突然出错。

    ——————————————————————————————————————————

    点击链接 查看 SQL 专栏更多文章:https://blog.csdn.net/weixin_46249441/category_11913899.html?spm=1001.2014.3001.5482

  • 相关阅读:
    Spring的 webFlux 和 webMVC
    DNS 查询原理详解
    Kotlin 常见符号大全
    机器人方向的刚性需求→个人思考←
    Maven基础学习——tomcat插件配置(含web工程配置)
    小白入门深度学习 | 3-2:激活函数activation
    mybatis笔记
    【vulnhub靶场】PRIME:1打靶过程记录
    基于SSM的北京集联软件科技有限公司信息管理系统
    项目构建生命周期与插件
  • 原文地址:https://blog.csdn.net/weixin_46249441/article/details/125869530