【数据库系列 】| 3.聚合与排序

3.1创建数据表

CREATE TABLE Product
(product_id CHAR(4)  NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32)  NOT NULL,
sale_price INTEGER  ,
purchase_price INTEGER  ,
regist_date DATE  ,
PRIMARY KEY (product_id));


START TRANSACTION;
INSERT INTO Product VALUES ('0001', 'T 恤衫 ', ' 衣服 ',
1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', ' 打孔器 ', ' 办公用品 ',
500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', ' 运动 T 恤 ', ' 衣服 ',
4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', ' 菜刀 ',  ' 厨房用具 ', 
3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', ' 高压锅 ', ' 厨房用具 ',
6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', ' 叉子 ',  ' 厨房用具 ',
500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', ' 擦菜板 ', ' 厨房用具 ',
880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', ' 圆珠笔 ', ' 办公用品 ',
100, NULL,'2009-11-11');
COMMIT;

3.2聚合查询

● 只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句)中能够使用聚合函数。
● COUNT (*) 会得到包含 NULL 的数据行数,而 COUNT (< 列名 >) 会得到 NULL 之外的数据行数。该特性是 COUNT 函数所特有的,其他函数并不能将星号作为参数(如
果使用星号会出错)

● 聚合函数会将 NULL 排除在外。但 COUNT (*)例外,并不会排除 NULL 。

● SUM/AVG 函数只能对数值类型的列使用,而 MAX/MIN 函数原则上可以适用于任何数据类型的列。

SELECT COUNT(*)
FROM product;

SELECT COUNT(purchase_price)
FROM product;

SELECT COUNT(product_name)
FROM product;
  • 注意AVG函数,合计值/合计行数,无论是合计值还是合计行数,都是排除NULL行的
SELECT SUM(purchase_price)/8,SUM(purchase_price)/6,AVG(purchase_price)
FROM product;

SELECT COUNT(DISTINCT product_type)
FROM product;

3.3 分组

/*
● 使用 GROUP BY 子句可以像切蛋糕那样将表分割。通过使用聚合函数和
GROUP BY 子句,可以根据“商品种类”或者“登记日期”等将表分割后再
进行汇总。
● 使用聚合函数和 GROUP BY 子句时需要注意以下4点。
① 只能写在 SELECT 子句之中
② GROUP BY 子句中不能使用 SELECT 子句中列的别名
③ GROUP BY 子句的聚合结果是无序的
④ WHERE 子句中不能使用聚合函数

● 在 GROUP BY 子句中指定的列称为聚合键或者分组列
● 当聚合键中包含 NULL 时,也会将NULL 作为一组特定的数据
*/

3.3.1GROUP BY 子句

SELECT product_type,COUNT(*)
FROM product
GROUP BY product_type;

3.3.2聚合键中包含 NULL 的情况

SELECT purchase_price, COUNT(*)
FROM Product
GROUP BY purchase_price;

3.3.3使用 WHERE 子句时 GROUP BY 的执行结果

● GROUP BY 和 WHERE 并用时 SELECT 语句的执行顺序:
FROM → WHERE → GROUP BY → SELECT

SELECT purchase_price, COUNT(*)
FROM Product
WHERE product_type = ' 衣服 '
GROUP BY purchase_price;

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

/*常见错误① ——在 SELECT 子句中书写了多余的列

实际上,使用聚合函数时, SELECT 子句中只能存在以下三种
元素。
● 常数
● 聚合函数
● GROUP BY 子句中指定的列名(也就是聚合键)*/

/*常见错误② ——在 GROUP BY 子句中写了列的别名
SELECT 子句中的项目可以通过 AS 关键字来指定别名。但是,在 GROUP BY 子句中是不能使用别名的(目前所知在mysql和PostgreSQL是可以的)。

SELECT product_type AS pt, COUNT(*)
FROM Product
GROUP BY pt;

3.4 为聚合结果指定条件

/*
● 使用 COUNT 函数等对表中数据进行汇总操作时,为其指定条件的不是
WHERE 子句,而是 HAVING 子句。
● 聚合函数可以在 SELECT 子句、 HAVING 子句和 ORDER BY 子句中使用。
● HAVING 子句要写在 GROUP BY 子句之后。
● WHERE 子句用来指定数据行的条件, HAVING 子句用来指定分组的条件。*/

3.4.1HAVING 子句

/*
使用 HAVING 子句时 SELECT 语句的顺序:
SELECT → FROM → WHERE → GROUP BY → HAVING
*/

SELECT product_type,COUNT(*)
FROM product
GROUP BY product_type
HAVING COUNT(*)=2;

3.4.2HAVING 子句的构成要素

/*
HAVING 子句中能够使用的 3 种要素如下所示。
● 常数
● 聚合函数
● GROUP BY 子句中指定的列名(即聚合键)
*/

SELECT product_type,COUNT(*)
FROM product
GROUP BY product_type
HAVING product_type=' 厨房用具 ';

SELECT product_type,COUNT(*)
FROM product
GROUP BY product_type
HAVING COUNT(*)=2;

3.4.3相对于 HAVING 子句,更适合写在 WHERE 子句中的条件

/*以下两个sql语句实现的结果是一致的,但是聚合键所对应的
条件还是应该书写在 WHERE 子句之中。即以下两个sql语句中的第二个是比较好的。
WHERE 子句 = 指定行所对应的条件
HAVING 子句 = 指定组所对应的条件

通常情况下,为了得到相同的结果,将条件写在 WHERE 子句
中要比写在 HAVING 子句中的处理速度更快,返回结果所需的时间更短
*/

SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING product_type = ' 衣服 ';

SELECT product_type, COUNT(*)
FROM Product
WHERE product_type = ' 衣服 '
GROUP BY product_type;

3.5 对查询结果进行排序

/*
● 使用 ORDER BY 子句对查询结果进行排序。
● 在 ORDER BY 子句中列名的后面使用关键字 ASC 可以进行升序排序,使用 DESC 关键字可以进行降序排序。
● ORDER BY 子句中可以指定多个排序键。
● 排序健中包含 NULL 时,会在开头或末尾进行汇总。
● ORDER BY 子句中可以使用 SELECT 子句中定义的列的别名。
● ORDER BY 子句中可以使用 SELECT 子句中未出现的列或者聚合函数。
● ORDER BY 子句中不能使用列的编号。
*/

3.5.1 ORDER BY 子句

/*
ORDER BY子句中书写的列名称为排序键

ORDER BY子句的书写顺序

  1. SELECT 子句 → 2. FROM 子句 → 3. WHERE 子句 → 4. GROUP BY 子句 →
  2. HAVING 子句 → 6. ORDER BY 子句

降序排序在排序建后面加上DESC关键字,升序排序在排序建后面加上ASC关键字
未指定 ORDER BY 子句中排列顺序时会默认使用升序进行排列。
*/

3.5.2 NULL的顺序

/*使用含有 NULL 的列作为排序键时,
NULL 会在结果的开头或末尾汇总显示
*/

SELECT product_id, product_name, sale_price, purchase_price
FROM Product
ORDER BY purchase_price;

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

/*
在 GROUP BY 子句中不能使用SELECT 子句中定义的别名,但是在 ORDER BY 子句中却是允许使用别名的

使用 HAVING 子句时 SELECT 语句的顺序
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
*/

SELECT product_id AS id, product_name, sale_price AS sp, purchase_price
FROM Product
ORDER BY sp, id;

3.5.4 ORDER BY 子句中可以使用的列

/在 ORDER BY 子句中可以使用 SELECT 子句中未使用的列和聚合函数。/

SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
ORDER BY COUNT(*);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,710评论 0 44
  • 1. SQL 简介 SQL 的目标 理想情况下,数据库语言应允许用户: 建立数据库和关系结构 完成基本数据管理任务...
    板蓝根plank阅读 2,334评论 0 11
  • “还不睡啊?”季乐筱擦干净了手,走到自己床边坐下。 单玉谣举了举酒杯,“一会儿就睡。” 季乐筱耸肩,拉过被子躺下睡...
    疏星点点阅读 181评论 0 0
  • 最好的友情,抵得住时间的历练,再次相见我们依旧会互黑的遍体鳞伤,相濡以沫,不如相忘于江湖,我们会再见面的对吧?晚安…
    高冷的小小樱阅读 292评论 0 1
  • 秋风欢乐了树叶飞翔的梦忧伤了大树的思念 想看看你的样子却找不到你 想听听你的声音你却在远方 树静静的凝望它的泪水谁...
    心花园子阅读 143评论 0 3