--      Tips:聚合和排序

--    一、对表进行聚合查询

--  1.聚合函数

--    (1)5 个常用函数:

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

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

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

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

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

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

--2.计算表中数据的行数 

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

--------------------------------------

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

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

SELECT COUNT(Conbio_price2)
FROM dbo.Conbio;

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

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

--------------------------------------

--4.计算合计值

select
SUM(Conbio_price1) as sum_Conbio_price1,        --总和
AVG(Conbio_price1) as avg_Conbio_price1,        --平均
MAX(Conbio_price1) as max_Conbio_price1,        --最大值
MIN(Conbio_price1) as min_Conbio_price1         --最小值
from dbo.Conbio;

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

SELECT MAX(Conbio_DATE),        --Conbio_DATE 为日期
    MIN(Conbio_date)
FROM dbo.Conbio

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

--------------------------------------

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

--示例1:计算去除重复数据后的数据行数

SELECT COUNT(DISTINCT Conbio_varieties)
FROM dbo.conbio;

------------------

--示例2:先计算数据行数再删除重复数据的结果

SELECT DISTINCT COUNT(Conbio_Varieties)
FROM dbo.Conbio;

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

--------------------------------------

--    二、对表进行分组

--  1.GROUP BY 子句

--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...;

--示例
SELECT conbio_varieties AS '商品种类',
    COUNT(*) AS '数量'
FROM dbo.conbio
GROUP BY conbio_varieties;

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

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

------------------

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

SELECT conbio_price2, COUNT(*)
FROM dbo.conbio
GROUP BY conbio_price2;

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

--------------------------------------

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

--语法
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--WHERE <表达式>
--GROUP BY <列名1>, <列名2>, ...

SELECT conbio_price2, COUNT(*)
FROM dbo.conbio
WHERE conbio_varieties = '衣服'
GROUP BY conbio_price2

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

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

--------------------------------------

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

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

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

--     ①常数

--     ②聚合函数

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

--易错点1

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

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

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

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

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

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

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

--(4)易错:在 WHERE 子句中使用聚合函数
--  【总结】只有 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 conbio_varieties, COUNT(*)
FROM dbo.conbio
GROUP BY conbio_varieties
HAVING COUNT(*) = 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 conbio_id, conbio_price1
FROM dbo.conbio
ORDER BY conbio_price1;    --升序排列

--排序键:ORDER BY 子句中书写的列名。
--【书写顺序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY

------------------

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

SELECT conbio_id, conbio_price1
FROM dbo.conbio
ORDER BY conbio_price1 DESC;    --降序排列

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

------------------

--3.指定多个排序键

SELECT conbio_id, conbio_name, conbio_price1, conbio_price2
FROM dbo.conbio
ORDER BY conbio_price1, conbio_price2;

------------------

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

------------------

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

SELECT conbio_id AS id, conbio_name, conbio_price1 AS ht
FROM dbo.conbio
ORDER BY ht, id;

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

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

------------------

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

SELECT conbio_varieties, COUNT(*)
FROM dbo.conbio
GROUP BY conbio_varieties
ORDER BY COUNT(*);

------------------

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

SELECT conbio_id ,
       conbio_name ,
       conbio_varieties ,
       conbio_price1 ,
       conbio_price2 ,
       conbio_date
FROM dbo.conbio
ORDER BY conbio_price1 DESC, conbio_id;

------------------

SELECT conbio_id ,
       conbio_name ,
       conbio_varieties ,
       conbio_price1 ,
       conbio_price2 ,
       conbio_date
FROM dbo.conbio
ORDER BY 4 DESC, 1;                --这里使用列的编号,由于阅读不便,不推荐使用

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

--------------------------------------

--欢迎关注个人公众号:Zkcops

--2018/04/16 
 
由:zkcops 撰写(希望能对你有所帮助,转载注明出处!)
--------------------------------------

【SQL.基础构建-第三节(3/4)】的更多相关文章

  1. 【SQL.基础构建-第二节(2/4)】

    --      Tips:查询基础 --一.SELECT 语句基础-- 1.查询指定列:SELECT 关键字--语法:--SELECT <列名>, ...     -- 希望查询列的名称- ...

  2. 【SQL.基础构建-第一节(1/4)】

    --        Tips:数据库与sql--    一.What's 数据库-- 1.数据库(Database,DB):将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合.--   ...

  3. 【SQL.基础构建-第四节(4/4)】

    --      Tips:数据更新 --一.插入数据 --1.INSERT 语句的基本语法 --语法:--INSERT INTO <表名>(列1, 列2, ...) VALUES (值1, ...

  4. (2.10)Mysql之SQL基础——约束及主键重复处理

    (2.10)Mysql之SQL基础——约束及主键重复处理 关键词:mysql约束,批量插入数据主键冲突 [1]查看索引: show index from table_name; [2]查看有约束的列: ...

  5. SQL基础总结——20150730

           SQL SQL 指结构化查询语言 SQL 使我们有能力訪问数据库 SQL 是一种 ANSI(美国国家标准化组织) 的标准计算机语言 SQL 是一门 ANSI 的标准计算机语言.用来訪问和 ...

  6. 《SQL基础教程》+ 《SQL进阶教程》 学习笔记

    写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...

  7. 数据库整理(三) SQL基础

    数据库整理(三) SQL基础 SQL语言的特点 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体. 可以独立完成数据库生命周期中的全部活动: ​ ●定义和修改.删除关 ...

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

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  9. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

随机推荐

  1. 分布式一致性协议介绍(Paxos、Raft)

     两阶段提交 Two-phase Commit(2PC):保证一个事务跨越多个节点时保持 ACID 特性: 两类节点:协调者(Coordinator)和参与者(Participants),协调者只有一 ...

  2. 个人作业1——个人阅读&提问题

    第一部分:结缘计算机   上大学前接触了一些网游,如魔域.DNF等.偶然间朋友介绍了一些辅助软件,当时非常地好奇这些辅助软件是如何制作出来的,就上百度搜索了一些关键词,然后就了解到了易语言.VB.金山 ...

  3. Service , DAO ,DBUTtil;

    Service , DAO ,DBUTtil; util一般为基本的数据库操作:打开,关闭数据库连接,查询和更新操作. service 调用 dao 实现业务操作 dao层设计要为service服务, ...

  4. 编译android源码遇到错误及其解决方法

    升级ubuntu的14.04后,android的源码又编译错误了,一下是错误说明赫解决方法: 1.make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_ ...

  5. SQL 之获取DATE类的年月日语句

    Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE( ...

  6. C# System.Timers.Timers的用法在工控设备上位中的用法

    这两天写设备的上位,由于要读取服务器上的数据库,通过WEBSERVICE访问数据库,我具体的做法是: 1.专门用Timer起线程执行,由于在用的时候报错,不能访问其他线程资源的错误,因此我用了委托的方 ...

  7. 六、yarn运行模式

    简介 spark的yarn运行模式根据Driver在集群中的位置分成两种: 1)yarn-client 客户端模式 2)yarn-cluster 集群模式 yarn模式和standalone模式不同, ...

  8. golang 编码转化

    在网上搜索golang编码转化时,我们经常看到的文章是使用下面一些第三方库: https://github.com/djimenez/iconv-go https://github.com/qiniu ...

  9. NIO与Socket

    一.Socket 的使用 1.单线程Socket的使用 /** * 单线程版本 * 问题描述:只能服务单个客户端 * 解决方案:多线程版本 */ public class Socket_V1 { pu ...

  10. python中参数传递的方法

    Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递,不定参数传递(包裹传递)和解包裹传递. 1.位置传递实例: def fun(a,b,c) return a+b+ ...