[SQL] SQL 基础知识梳理(三)- 聚合和排序

SQL 基础知识梳理(三)- 聚合和排序

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/5926689.html

目录

一、对表进行聚合查询

  1.聚合函数

    (1)5 个常用函数:

      ①COUNT:计算表中的记录(行)数。

      ②SUM:计算表中数值列的数据合计值。

      ③AVG:计算表中数值列的数据平均值。

      ④MAX:求出表中任意列中数据的最大值。

      ⑤MIN:求出表中任意列中数据的最小值。

    (2)聚合:将多行汇总成一行。

图1-1 Shohin 表

  2.计算表中数据的行数 

--示例
SELECT COUNT(*)  -- *:参数,这里代表全部列
FROM dbo.Shohin;

  3.计算 NULL 以外数据的行数

  将 COUNT(*) 的参数改成指定对象的列,就可以得到该列的非 NULL 行数。

SELECT COUNT(shiire_tanka)
FROM dbo.Shohin;

只计算非 NULL 的行

  【备注】除了 COUNT 函数,其它函数不能将星号作为参数。

  【备注】COUNT 函数的结果根据参数的不同而不同。COUNT(*) 会得到包含 NULL 的数据行数,而 COUNT(<列名>) 会得到 NULL 之外的数据行数。

  4.计算合计值

SELECT SUM(hanbai_tanka) AS sum_hanbai_tanka,    --总和
    AVG(hanbai_tanka) AS avg_hanbai_tanka,        --平均
    MAX(hanbai_tanka) AS max_hanbai_tanka,        --最大
    MIN(hanbai_tanka) AS min_hanbai_tanka        --最小
FROM dbo.Shohin;

  【备注】所有的聚合函数,如果以列名为参数,会无视 NULL 值所在的行。

SELECT MAX(torokubi),
    MIN(torokubi)
FROM dbo.Shohin

  【备注】MAX/MIN 函数几乎适用于所有数据类型的列。SUM/AVG 函数只适用于数值类型的列。

  5.使用聚合函数删除重复值(关键字 DISTINCT)

--示例1:计算去除重复数据后的数据行数
SELECT COUNT(DISTINCT shohin_bunrui)
FROM dbo.Shohin;

--示例2:先计算数据行数再删除重复数据的结果
SELECT DISTINCT COUNT(shohin_bunrui)
FROM dbo.Shohin;

  【备注】在聚合函数的参数中使用 DISTINCT,可以删除重复数据。DISTINCT 不仅限于 COUNT 函数,所有的聚合函数都可以使用。

二、对表进行分组

  1.GROUP BY 子句

--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...;
--示例
SELECT shohin_bunrui AS ‘商品种类‘,
    COUNT(*) AS ‘数量‘
FROM dbo.Shohin
GROUP BY shohin_bunrui;

  【备注】GROUP BY 子句中指定的列称为“聚合键”或“分组列”。

  【子句的书写顺序(暂定)】SELECT --> FROM --> WHERE --> GROUP BY

  2.聚合键中包含 NULL 的情况

SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
GROUP BY shiire_tanka;

  【备注】聚合键中包含 NULL 时,在结果中也会以 NULL 行的形式表现出来。

  3.WHERE 对 GROUP BY 执行结果的影响

--语法
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--WHERE <表达式>
--GROUP BY <列名1>, <列名2>, ...
SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
WHERE shohin_bunrui = ‘衣服‘
GROUP BY shiire_tanka

  这里是先根据 WHERE 子句指定的条件进行过滤,然后再进行聚合处理。

  【执行顺序】FROM --> WHERE --> GROUP BY --> SELECT。这里是执行顺序,跟之前的书写顺序是不一样的。

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

  (1)易错:在 SELECT 子句中书写了多余的列

    SELECT 子句智能存在以下三种元素:

      ①常数

      ②聚合函数

      ③GROUP BY 子句中指定的列名(即聚合键)

易错点1

  【总结】使用 GROUP BY 子句时,SELECT 子句不能出现聚合键之外的列名。

  (2)易错:在 GROUP BY 子句中写了列的别名   

易错点2

  回顾之前说的执行顺序,SELECT 子句是在 GROUP BY 子句之后执行。所以执行到 GROUP BY 子句时无法识别别名。

  【总结】GROUP BY 子句不能使用 SELECT 子句中定义的别名。

  (3)易错:GROUP BY 子句的结果能排序吗?

  【解答】它是随机的。如果想排序,请使用 ORDER BY 子句。

  【总结】GROUP BY 子句结果的显示是无序的。

  (4)易错:在 WHERE 子句中使用聚合函数

易错点3

  【总结】只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句)中能够使用聚合函数。

  

三、为聚合结果指定条件

  1.HAVING 子句

  WHERE 子句智能指定记录(行)的条件,而不能用来指定组的条件。

  【备注】HAVING 是 HAVE(拥有)的现在分词。

--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...
--HAVING <分组结果对应的条件>

  【书写顺序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING

SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2

从通过商品种类进行聚合分组后的结果中,取出“包含数据的行数为 2 行”的数据

  2.HAVING 子句的构成要素

    (1)3 要素:

      ①常数

      ②聚合函数

      ③GROUP BY 子句中指定的列名(即聚合键)

易错用法

  3.HAVING 与 WHERE

  有些条件可以写在 HAVING 子句中,又可以写在 WHERE 子句中。这些条件就是聚合键所对应的条件。

  

结果一样

  【建议】虽然结果一样,聚合键对应的条件应该写在 WHERE 子句中,不是 HAVING 子句中。

  【理由】①WHERE 子句的执行速度比 HAVING 快。

      ②意义:WHERE 子句 = 指定行所对应的条件,HAVING 子句 = 指定租所对应的条件。

四、对查询结果进行排序

  1.ORDER BY 子句

--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--ORDER BY <排序基准列1>, <排序基准列2>, ...
SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka;    --升序排列

销售单价由低到高(升序)

  排序键:ORDER BY 子句中书写的列名。

  【书写顺序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY

  2.升序(ASC)和降序(DESC):

SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC;    --降序排列

  【备注】ORDER BY 子句中排列顺序时会默认使用升序(ASC)进行排列。

  3.指定多个排序键

SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka, shohin_id;

  4.NULL 值的顺序:排序键中包含 NULL 时,会在开头或末尾进行汇总。

  5.在排序键中使用 SELECT 子句中的别名

SELECT shohin_id AS id, shohin_mei, hanbai_tanka AS ht
FROM dbo.Shohin
ORDER BY ht, id;

  【执行顺序】FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY

  【备注】ORDER BY 子句可以使用 SELECT 子句中定义的别名,GROUP BY 子句不能使用别名。

  6.ORDER BY 子句中使用聚合函数

SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
ORDER BY COUNT(*);

  7.不建议使用列的编号进行排序,虽然可以

SELECT shohin_id ,
       shohin_mei ,
       shohin_bunrui ,
       hanbai_tanka ,
       shiire_tanka ,
       torokubi
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC, shohin_id;

SELECT shohin_id ,
       shohin_mei ,
       shohin_bunrui ,
       hanbai_tanka ,
       shiire_tanka ,
       torokubi
FROM dbo.Shohin
ORDER BY 4 DESC, 1;  --这里使用列的编号,由于阅读不便,不推荐使用

结果是一样的

  【备注】在 ORDER BY 子句中不要使用列的编号。



这里采用 MS SQL Server 进行验证。

--预览版,带整理完毕后发布到首页--

时间: 2024-10-16 15:14:59

[SQL] SQL 基础知识梳理(三)- 聚合和排序的相关文章

【SQL】- 基础知识梳理(六) - 游标

游标的概念 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标(Cursor): 是处理数据的一种方法. 它可以定位到结果集中的某一行,对数据进行读写. 也可以移动游标定位到你需要的行中进行数据操作. 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁 游标的分类 SQL Server支持的API服务器游标分为4种:静态游标( STATIC )意味着,当游标被建立时,将会创建FOR后面的SELECT语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的更改不

【SQL】- 基础知识梳理(四) - 存储过程

存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 存储过程的好处 A. 存储过程允许标准组件式编程        存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句.而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性. B. 存储过程能够实现较快的执行速度        如果某一操作包含大量的T-SQL语句代码,分

【SQL】- 基础知识梳理(八) - 事务与锁

事务的概念 事务:若干条T-SQL指令组成的一个操作数据库的最小执行单元,这个整体要么全部成功,要么全部失败.(并发控制) 事务的四个属性:原子性.一致性.隔离性.持久性.称为事务的ACID特性. 原子性(atomicity)一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. 一致性(consistency)事务内的操作都不能违反数据库约束或规则,事务完成时的内部数据结构都必须是正确的. 隔离性(isolation)并发多个事务时,各个事务不干涉内部数据,处理的都是另外一

【SQL】- 基础知识梳理(七) - 索引

索引的概念 在关系型数据库中,索引是对数据库表中一列或多列的值进行排序的一种结构. SQL SERVER中有索引的类型:按存储结构区分:"聚集索引(又称聚类索引,簇集索引)","分聚集索引(非聚类索引,非簇集索引)"按数据唯一性区分:"唯一索引","非唯一索引"按键列个数区分:"单列索引","多列索引" 聚集索引和非聚集索引的区别 聚集索引:是对磁盘上实际数据重新组织以按指定的一列或多列

shell脚本基础知识梳理&lt;三&gt;:条件测试与比较、流程控制 if

一.条件测试与比较1.test 测试表达式 常用test -f file && echo true||echo false2.[ 测试表达式 ] 特别常用[ -f file ]&& echo true||echo false3.[[ 测试表达式 ]]二.流程控制 1.流控制语句 if实例1#!/bin/bash#获取uid=0(root)中的0:id=id | awk -F '[=(]' '{print $2}'echo "your user id is:$id&

[SQL] SQL 基础知识梳理(七)- 集合运算

SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 CREATE TABLE Shohin2 (shohin_id CHAR(4) NOT NULL, shohin_mei VARCHAR(100) NOT NULL, shohin_bunrui VARCHAR(32) NOT NULL, hanbai_tanka INTEGER , shiire

[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

SQL 基础知识梳理(六)-  函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”. 2.函数的种类: (1)算术函数 - 数值计算 (2)字符串函数 - 字符串操作 (3)日期函数 - 日期操作 (4)转换函数 - 转换数据类型 (5)聚合函数 - 数据聚合 3.算术函数(加.减.乘.除):+.-.*./ [备注]数据类型 NUMBERIC(全体位数,小数位数)可以指定数值的大小. C

[SQL] SQL 基础知识梳理(四) - 数据更新

SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 目录 一.插入数据 1.INSERT 语句的基本语法 --语法: --INSERT INTO <表名>(列1, 列2, ...) VALUES (值1, 值2, ...) INSERT INTO dbo.Shohin ( shohin_id , shohin_mei , shohin_bunrui , hanbai_tanka , s

[SQL] SQL 基础知识梳理(一)- 数据库与 SQL

SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 序 目录 What's 数据库 数据库结构 SQL 概要 创建表 删除和更新表 1-1 What's 数据库 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.如:大型-银行存储的信息,小型-电话簿. 2.数据库管理系统(Batabase Management Syste