如何在SQL查询中使用SQL AVG函数
如今,企业依靠数据蓬勃发展。他们利用从销售、网站访问者等方面收集的数据来生成有用的信息,这些信息可以用来做业务决策。预测趋势、生成仪表盘和数据分析是保持领先地位的重要部分。其他SQL用户只是想要比基本SQL查询提供的功能更多。
表格是企业访问存储在关系数据库中的大多数数据的地方。许多人不知道您可以在SQL本身中运行数据分析类型函数。SQL Analytical函数允许用户运行计算。SQL分析函数包括求和值的SUM,计数值计数,以及用于查找值的平均值的AVG。在本文中,我们将查看AVG功能以及您可以在SQL查询中使用它的所有内容。
SQL AVG做了什么?
AVG是称为聚合函数的SQL函数之一。我们在SQL中写入的许多查询只在单行上运行。聚合函数,也称为组函数,在一组行上运行,并基于这些行中的值生成计算值。但总和,计数和AVG的聚合函数的结果实际上不会存储在数据库中。
这是一个重要的事实,因为这些函数的结果不仅是我们存储的数据,并且在我们需要时才检索到的数据。SQL实际上可以为我们存储多个数据。我们可以使用这些分析功能在另一组行或由另一个SQL表达式返回的一组中应用数学操作。这意味着您可以生成您在数据库表中存储的数据之前没有拥有的信息。您可以使用SQL的内置功能执行此操作,而不是诉诸于在另一种解析SQL结果的其他编程语言中编写计算。
像AVG这样的聚合函数可以在与组副子句中或由于SQL表达式组中组组的表中的每个行中的每一行计算值。像AVG这样的多组函数可以生成整个数据集的平均值或为单个组总计创建平均值。这似乎似乎似乎不多,但与AVG这样的功能,您可以使用纯SQL进行业务分析。当我们达到示例时,我们会看看我们如何在产品数据上使用它们。
AVG函数只是分析函数的开头,您可以添加到您的SQL以获取更多高级查询。它是一个多组功能,如SUM和COUNT,可以在一系列记录中工作。如果将这些多组函数与SQL的SQL的单个组函数相结合,例如Min,Max和Var,则可以创建更复杂的计算,如标准差,这意味着您可以使用纯SQL进行真正的业务分析。
直接从数据库表中检索您的业务分析数据是获得所需数据的有效方法。尽管如此,与标准SQL可能是不可能的,只会为您提供实际存储的信息。如果没有AVG函数,您必须以编程语言查询数据库,并循环结果以生成列的平均值。但幸运的是,你没有。让我们通过查看其语法来更熟悉SQL AVG函数。
SQL AVG语法
SQL有一个由美国国家标准协会(也称为ANSI)定义的标准语法。但是标准只是标准,每个使用SQL的关系数据库引擎可能遵循也可能不遵循这些标准,这取决于您正在讨论的关键字和您正在使用的引擎。AVG函数语法根据您喜欢的关系数据库略有不同。
MySQL,PostgreSQL和SQL Server的SQL AVG函数的语法是:
AVG([全部]表达式1,表达2,表达3 ......)
DB2和Oracle的语法是:
([ALL|DISTINCT] expression1, expression2, expression3..)/ (windows_clause)
参数
全部:适用于所有值
不同的:仅适用于唯一的值
表达:由单个变量,常量,标量函数或列名组成的参数
典型用法:
从(表)中选择AVG(列/字段)为(新字段)
在此查询中,我们使用AS关键字来为其标识的平均值提供名称。
下一节将在实际场景中运行一些SQL AVG示例,并使用建议的代码作为示例。所有的例子都将使用下面的表格作为参考和值。
SQL AVG示例查询
对于本文中的示例查询,我们将使用一个类似于下表的数据库表。该表包含杂货店出售的产品,包括产品名称、价格、成本和几个id。
ProductID | 产品名称 | vendorid | 价格 | 成本 |
1 | 冷冻草莓 | 101 | 18. | 6. |
2 | 蓝莓汁 | 102 | 19. | 6. |
3. | 枫糖浆 | 101 | 10. | 4. |
4. | 原味酸奶 | 107 | 21.35 | 7. |
5. | 糖 | 102 | 25. | 8. |
6. | 牛排 | 107 | 18. | 7. |
计算具有AVG的柱的简单平均值
在此查询中,我们使用Select AVG功能来计算列价格的平均值。由于没有Where子句,它可以计算表中每个记录的平均值。
SELECT AVG(Price) AS PriceAverage FROM Products;
下面是该查询的结果。该公司销售的产品的平均价格是18.56美元。
PriceAverage |
18.56 |
解释:在此示例中,AVG函数使用别名PriceAverage计算表中的价格列的平均值,我们将其分配为关键字。
使用AVG作为WHERE子句的条件
假设我们想找出所有高于平均价格的产品。在这里,我们必须通过一个查询找到平均价格,并将其用作一个查询的子查询,该查询将其结果与price列进行比较。下面是一个查询,它将为我们做到这一点:
选择ProductName,价格从价格>(选择产品)的产品);
以下是该查询的结果:
产品名称 | 价格 |
蓝莓汁 | 19. |
原味酸奶 | 21.35 |
糖 | 25. |
解释:在这个例子中,AVG函数首先计算Products表中price列的平均价格。它选择那些大于平均值的值,并将它们列在ProductName和Price下。
使用sql avg与where子句
我们刚发现大多数人在商店购买10到25美元的产品。我们要求这些乘积的平均值。下面是查找该值的查询。
SELECT AVG(Price) AS AvgPrice FROM Products WHERE Price <= 25;
下面是该查询的结果。这一范围内产品的平均成本是19.45美元。
AvgPrice | |
19.45 |
解释:WHERE子句选择大于10且小于或等于25的价格。AVG然后在该窗口中找到价格的平均值。
使用SQL AVG与组
最后两个查询使用了WHERE子句来过滤我们计划使用AVG函数的行。在一个查询中,我们通过AVG函数的一个结果来过滤结果。在第二种情况下,我们使用WHERE来过滤它将用来生成平均值的结果。现在我们将使用GROUP BY子句来做类似的事情。我们将过滤表的一个子集以用于我们的平均值。只是这一次,我们将返回多条记录,而不是返回一条记录。
假设您希望vendorid的平均价格。要获得每个人的平均价格,您可以运行三个查询。
SELECT AVG(Price) AS PriceAverage FROM Products WHERE VendorID = 101;SELECT AVG(Price) AS PriceAverage FROM Products WHERE VendorID = 102;SELECT AVG(Price) AS PriceAverage FROM Products WHERE VendorID = 107;
这些查询将为您提供所需的结果,但是为什么在运行一个时运行三个。小组将允许您使用一个查询获得相同的结果。下面是这个查询:
SELECT VendorID, COUNT(*), AVG(Price) AS AvgPrice FROM Products GROUP BY VendorID;
下面是一个记录集的结果:
vendorid | 数 | AvgPrice |
101 | 2 | 14. |
102 | 2 | 22. |
107 | 2 | 19.675 |
说明:在此示例中,组按子句由vendorid组分组记录,每个vendorid返回一行。因此,我们只能使用聚合函数作为我们的其他结果,如计数和AVG。如果我们尝试像价格列一样添加另一列,则查询将抛出错误。
使用SQL AVG和SQL SUM
我们还可以将AVG函数与其他SQL分析函数一起使用。此示例使用总和功能将Price列中的所有值相加,然后使用AVG函数来计算平均值。
SELECT SUM(Price) AS PriceSum, AVG(Price) AS PriceAverage FROM Products;
下面是查询的结果:
PriceSum | PriceAverage |
111.35 | 18.56 |
解释:在这个例子中,我们选择使用优惠标签的价格和使用价格表中的价格汇编标签的所有价格的平均值。所有价格的总和是111.35美元,平均值是我们以前的平均值。
使用SQL AVG与CAST
AVG函数返回一组表达式的平均值,默认十进制位置。但是,您可以与AVG一起使用CAST功能来增加或减少小数位数的数量。转换十进制和数字数据类型时,演员更好地保留小数位。使用演员以规定小数位时,AS-Decimal在指定类型中使用。
句法
CAST(表达式)AS[数据类型][指定格式]
参数
表达:由单个常量,变量,标量函数或列名组成的表达式
数据类型: char (), varchar, decimal, float
指定的格式:所需的指定格式
使用具有AVG的铸件功能
SQL AVG可以在AVG函数内部和外部使用CAST。下面是它们各自的一个例子。
从产品中选择CAST(AVG(价格)作为十进制(10,2))
下面是查询的结果:
价格 |
18.56 |
说明:这个例子对我们的结果没有任何改变,但是它保证了我们得到了一个没有小数的返回值。通过将平均值转换为DECIMAL(10,2)类型,其中10是小数的精度或我们想要的最大位数,2是小数点后面的刻度或我们想要的位数。
为了演示如何在AVG内部使用CAST演员,让我们使用我们的查询,在我们通过vendorid计算每个产品的平均价格,但是让我们这次向小数施加每个平均值,以确保我们获得没有分数美分的价格。
SELECT VendorID, COUNT(*), AVG(CAST(Price AS DECIMAL(10,2))) AS AvgPrice FROM Products GROUP BY VendorID;
下面是查询的结果:
vendorid | 数 | AvgPrice |
101 | 2 | 14. |
102 | 2 | 22. |
107 | 2 | 19.68 |
解释:首先,您需要检索并计算vendorid的数量。然后,您将平均vendorid分组的相应价格。这将返回每个vendorid的两个小数点的平均价格。请注意,Vendorid 107的平均值平均为19.68美元而不是19.675美元。
使用与SQL AVG不同
尝试使用AVG的SQL查询时可以做的另一件事与您所平均的列不同。这将从列中删除所有重复值,并计算剩余值的平均值。在这里,我们将不同于我们创建的第一个基本查询。
选择AVG(铸造(如十分气象(10,2)))作为产品的售价;
此查询的结果将为:
PriceAverage |
18.67 |
解释:您应该注意到,这一平均值略低于我们原始查询的平均值略低。这是因为在删除查询中使用的不同子句中的价格列中存在重复值20。
在多列上使用AVG
到目前为止,我们一直根据价格列计算我们的平均值。还有另一个数字列,我们可以用来计算平均成本。在以下查询中,我们计算价格列和成本列的平均值。我们还使用CAST来检索数值,只有两位数超过小数点。
选择AVG(铸件(10,2)))作为PriceAverage AVG(投用(10,2)的成本(10,2))作为产品的Costaverage;
以下是此查询的结果:
PriceAverage | 太平程 |
18.56 | 6.33 |
解释:在这里,我们在价格和成本列上使用演员,然后我们取得了成功的十进制值的平均值。
在AVG函数中使用SQL表达式
我们的产品表具有成本列和价格列,所以我们可以写一个像这样的查询,以弄清楚每个产品的毛利润。
选择*,(价格 - 成本)作为产品的利润;
对于此查询,我们将获得以下结果集:
ProductID | 产品名称 | vendorid | 价格 | 成本 | 利润 |
1 | 冷冻草莓 | 101 | 18. | 6. | 12. |
2 | 蓝莓汁 | 102 | 19. | 6. | 13. |
3. | 枫糖浆 | 101 | 10. | 4. | 6. |
4. | 原味酸奶 | 107 | 21.35 | 7. | 14.35 |
5. | 糖 | 102 | 25. | 8. | 17. |
6. | 牛排 | 107 | 18. | 7. | 11. |
现在我们返回的是实际可以在商业中使用的计算。尽管如此,我们也可以使用一个SQL表达式,就像我们在AVG函数中使用的上一个查询一样,这将给我们的产品提供平均利润。下面是这个查询:
选择AVG(价格 - 成本)作为产品的利润;
该查询的结果将是:
利润 |
12.23 |
解释:SQL AVG可以接受一个SQL表达式,并在选定的记录范围内计算该表达式的返回值的平均值。通过包装成本价值减去价格,我们可以得到所有记录的平均利润。
结论
您可能喜欢使用像SELECT和WHERE这样的标准SQL子句——当您试图从数据库检索数据时,它们非常强大——但您应该尝试一下SQL的分析函数。AVG,连同COUNT和SUM,将为您的查询添加更强大的功能。使用它们,您可以直接从数据库查询返回计算数据,而不是依赖于外部编程语言,并更快、更有效地获得您需要的答案。SQL AVG将返回一列的平均值、一列中的行范围或另一个SQL表达式的结果。AVG与其他的组合SQL命令和条款将给这些查询提供更多的力量和灵活性。