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明确说明该功能将来会被删除。

SQL入门学习2-聚合与排序的更多相关文章

  1. SQL入门学习5-函数、为此、CASE表达式

    6-1. 各种各样的函数 函数的种类 算数函数 字符串函数 日期函数 转换函数 聚合函数 1.1算术函数 数据类型:NUMERIC 是大多数DBMS都支持的一种数据类型. 通过NUMBERIC(全体位 ...

  2. SQL入门学习1-查询基础

    2-1 SELECT语句基础 SELECT语句作用 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). 重点 使用SELECT语句从表中选取数据. 为列设定显示用的别名 ...

  3. SQList3 and SQL入门学习笔记

    SQL 这是一个标准的计算机语言进行访问和操作数据库. 什么是 SQL? ·       SQL 指结构化查询语言 ·       SQL 使我们有能力訪问数据库 ·       SQL 是一种 AN ...

  4. SQL入门学习4-复杂查询

    5-1 视图 视图和表 视图和表的区别只有一个是否保存了实际的数据 使用INSERT和SELECT实际上就是从存储设备中读取数据,各种计算后,将数据呈现给用户. 视图不会将数据保存在存储设备中.实际上 ...

  5. SQL入门学习3-数据更新

    4-1 数据的插入(INSERT语句的使用方法) 使用INSERT语句可以向表中插入数据(行).原则上,INSERT语句背刺执行一行数据插入. CREATE TABLE 和INSERT 语句,都可以设 ...

  6. SQL入门学习0-数据库与SQL

    1.1 DBMS DatabaseManagermentSystem 数据库管理系统 DBMS种类 层次型数据库(HDB) 最古老的数据库之一,把数据通过层次结构的方式表现. 关系型数据库(RDB) ...

  7. Sql入门学习——关系范式

    --------关系 --------范式 一.三种关系 1.一对一关系 关系数据库中,第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关. 2.一 ...

  8. Sql入门学习——基本语法函数

    --------使用工具navicat 快捷键操作 --------基本操作DML &DDL --------运算比较 --------数据类型 --------常用函数 --------常用 ...

  9. SQL入门学习6-集合运算

    7-1 表的加减法 集合运算 集合运算就是对满足同一规则的记录,进行的加减等四则运算. 1.1 表的加法--UNION 表之间进行并集运算. 语法: SELECT 对应列1,对应列2-- FROM 表 ...

随机推荐

  1. Spring整合JMS-基于activeMQ实现(二)

    Spring整合JMS-基于activeMQ实现(二) 1.消息监听器      在Spring整合JMS的应用中我们在定义消息监听器的时候一共能够定义三种类型的消息监听器,各自是MessageLis ...

  2. 2-07. 素因子分解(20) (ZJUPAT 数学)

    题目链接:http://pat.zju.edu.cn/contests/ds/2-07 给定某个正整数N,求其素因子分解结果,即给出其因式分解表达式 N = p1^k1 * p2^k2 *-*pm ^ ...

  3. 线段树(单点更新and成段更新)

    线段树需要的空间. 区间为1-->n 假设是一棵完全二叉树,且树高为i. 完全二叉树性质:第i层最多有2^(i-1)个结点. 那么 2^(i-1) = n;     i = log2(n)  + ...

  4. android 设置默认启动network mode

    network mode常见类型 WCDMA preferred : 0 GSM only : 1 WCDMA only : 2 GSM UMTS : 3 CDMA : 4 ... (参考RILCon ...

  5. C该程序生成一个唯一的序列号

    在实际的软件开发项目,通常,它包括产生一唯一的序列号.在本文中,一个切实可行的方案,例如,它引入了一个唯一的序列号生成过程. 本文生成的序列号的样式为:MMDDHHMINSS_XXXXXX. 程序例如 ...

  6. 初识google多语言通信框架gRPC系列(一)概述

    gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵 ...

  7. spring3.0注解定时任务配置及说明

    spring注解方式的定时任务配置: 第一步:spring配置文件 <?xml version="1.0" encoding="UTF-8"?> & ...

  8. MySQL中数据表的增操作

    今天学习到表的增操作,写个博客总结一下,PS:以下所有的凝视都是我在电脑上所有操作完毕后,再拷贝到记事本上加入的.至于在运行的时候可不能够那样加入凝视,就有待考证了. 选择库 mysql> sh ...

  9. 【原创】纯OO:从设计到编码写一个FlappyBird (四)

    第三部分请点这里 这里来实现Obstacle类.其实flappybird的本质就是小鸟原地掉,然后几根柱子在走.这也是在Game类里,用obs.move()来实现游戏逻辑的原因. 我们首先必须确定几个 ...

  10. MSSQL只能访问特定的数据库

    让用户只能访问特定的数据库(MSSQL) 背景 客户的SQL Server实例上有多个厂商的数据库,每个数据库由各自的进行厂进行商维护, 为了限定不同厂商的维护人员只能访问自己的数据库,现需要给各个厂 ...