sql 聚合函数 测试实验笔记

浪尽此生 提交于 2020-04-07 05:59:04

聚合函数是对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUP BY子句一同使用

我们 每个订单 都需要对应一个 订单的类型 同时  订单 可以有多个 货品

执行一下语句 创建基本测试需求

DROP TABLE IF EXISTS my_order_item;
DROP TABLE IF EXISTS my_item;
DROP TABLE IF EXISTS my_order;
DROP TABLE IF EXISTS order_type;


-- 创建订单类型
create TABLE order_type(
	id int primary key auto_increment,
	name char(20)
);

-- 创建订单
create TABLE my_order(
	id int primary key auto_increment,
	order_type_id INT,
	FOREIGN KEY keyOrderTYpe (order_type_id) REFERENCES order_type(id)
);


-- 创建商品

create TABLE my_item(
	id int primary key auto_increment,
	name char(20),
	price INT
);

-- 创建订单 与 商品关系维护
create TABLE my_order_item(
	id int primary key auto_increment,
	my_item_id INT,
	my_order_id INT,
	FOREIGN KEY keyOrderItem (my_item_id) REFERENCES my_item(id),
	FOREIGN KEY keyOrderId (my_order_id) REFERENCES my_order(id)
);


-- 插入订单类型
INSERT INTO order_type VALUES (null,"退货单");
INSERT INTO order_type VALUES (null,"采购单");
INSERT INTO order_type VALUES (null,"销售出库单");

-- 插入 测试 商品
INSERT INTO my_item VALUES (null,"跑步机",8880);
INSERT INTO my_item VALUES (null,"电视机",6080);
INSERT INTO my_item VALUES (null,"洗衣机",3400);
INSERT INTO my_item VALUES (null,"电烤炉",800);

-- 插入一些订单
INSERT INTO my_order VALUES (null,2);
INSERT INTO my_order VALUES (null,2);
INSERT INTO my_order VALUES (null,3);

-- 插入订单 商品

INSERT INTO my_order_item VALUES (null,1,1);
INSERT INTO my_order_item VALUES (null,2,2);
INSERT INTO my_order_item VALUES (null,2,1);
INSERT INTO my_order_item VALUES (null,4,1);
INSERT INTO my_order_item VALUES (null,3,1);
INSERT INTO my_order_item VALUES (null,1,2);

1. AVG  返回指定组中的平均值,空值被忽略。(我们 求 采购单 订单 商品的平均价格 )

    • Avg 函数

    • 计算在查询的指定字段中所包含的一组值的算术平均值。
    • 语法
    •     Avg(expr)
    •         expr 占位符代表一个字符串表达式,它标识的字段包含被计算平均值的数据,或者代表使用该字段的数据执行计算的表达式。expr 中的操作数可包括表字段名、常量名或函数名(可以是固有的或用户自定义的函数,但不能是其他 SQL 聚合函数)。
    •     说明
    • 在计算中,Avg 函数不能包含任何Null字段。
    • 您可以将 Avg 用于查询表达式中和QueryDef对象的SQL属性中,或者在基于 SQL 查询创建Recordset对象时使用。

SELECT ord.id AS "订单ID",AVG(itm.price) AS "订单商品平均价格" FROM order_type type 
	LEFT JOIN my_order ord ON (type.id = ord.order_type_id ) 
	LEFT JOIN my_order_item ordItem ON (ord.id = ordItem.my_order_id)
	LEFT JOIN my_item itm ON (ordItem.my_item_id = itm.id)
  WHERE type.name = '采购单' GROUP BY ord.id DESC

AVG 平均函数


2. COUNT  返回指定组中项目的数量(我们 求 采购单 订单包含的商品数量)

    • 计算查询所返回的记录数
    • 语法
    • Count(expr)
    • expr 占位符代表字符串表达式,它标识的字段包含了要统计的数据,或者是使用该字段的数据执行计算的表达式。expr 中的操作数可包括表字段名或函数名(可以是固有的或者用户定义的函数,但不能是其他 SQL 聚合函数)。可以统计包括文本在内的任何类型数据。
    • 说明
    • 可以使用 Count 来统计基本查询的记录数。例如,可以通过 Count 来统计已发往特定国家/地区的订单数。
    • 尽管 expr 能够对字段执行计算,但是 Count 仅仅计算出记录的数目。记录中所存储的数值类型与计算无关。
    • Count 函数不统计包含Null字段的记录,除非 expr 是星号 (*)通配符。如果使用了星号通配符,Count 会计算出包括包含 Null 字段在内的所有记录的数目。使用 Count(*) 方式比使用 Count([Column Name])方式快很多。不要用单引号 (' ') 将星号括起来。下面的示例计算 Orders 表中的记录数目。
    • SELECT Count(*) AS TotalOrders FROM Orders;
    • 如果 expr 标识多个字段,那么 Count 函数仅统计至少有一个字段为非 Null 值的记录。如果所有指定字段均为 Null值,那么该记录不被统计在内。可以使用 & 号分隔字段名。下面的示例显示了如何将计算限于那些 ShippedDate 或 Freight 为非 Null 值的记录:

      SELECT Count('ShippedDate & Freight') AS [Not Null] FROM Orders;

      可以在查询表达式中使用 Count。也可以将该表达式用于 QueryDef 对象的 SQL 属性中,或者在基于 SQL 查询创建 Recordset 对象时使用该表达式。

SELECT ord.id AS "订单ID",COUNT(*) AS "订单包含的商品数量" FROM order_type type 
	LEFT JOIN my_order ord ON (type.id = ord.order_type_id ) 
	LEFT JOIN my_order_item ordItem ON (ord.id = ordItem.my_order_id)
	LEFT JOIN my_item itm ON (ordItem.my_item_id = itm.id)
  WHERE type.name = '采购单' GROUP BY ord.id DESC

Count 函数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!