引言
结构化查询语言(SQL)用于在关系数据库管理系统(RDBMS)中存储、管理和组织信息。SQL还可以通过表达式 进行计算和操作数据。表达式结合了各种SQL操作符、函数和值来计算一个值。数学表达式 通常用于数值的加、减、除和乘。此外,聚合函数用于计算和分组值以生成汇总,例如给定列中值的平均值或总和。数学和聚合表达式可以通过数据分析提供有价值的见解,可以告诉未来的决策。
在本教程中,您将练习使用数学表达式。首先,您将在计算器上使用数值操作,然后在示例数据上使用这些操作符使用聚集函数执行查询,最后使用业务场景查询示例数据以获得更复杂的信息和分析。
前期准备
为了学习本指南,你需要一台运行某种使用SQL的关系数据库管理系统(RDBMS)的计算机。
注意:请注意,许多RDBMS使用它们自己独特的SQL实现。虽然本教程中概述的命令适用于大多数RDBMS,但如果你在MySQL以外的系统上测试它们,确切的语法或输出可能会有所不同。
你还需要一个装载了一些示例数据的数据库和表,可以在其中练习使用相关命令。
连接到MySQL并设置一个示例数据库
如果SQL数据库系统运行在远程服务器上,请从本地设备SSH到服务器:
shell
ssh sammy@your_server_ip
然后打开MySQL服务器提示符,将==sammy==
替换为你的MySQL用户账户的名称:
shell
mysql -u sammy -p
创建一个名为mathDB
的数据库:
sql
CREATE DATABASE mathDB;
如果数据库成功创建,您将收到这样的输出:
shell
OutputQuery OK, 1 row affected (0.01 sec)
要选择mathDB
数据库,运行以下USE
语句:
shell
USE mathDB;
shell
OutputDatabase changed
选择数据库后,使用CREATE TABLE
命令在其中创建一个表。在本教程的示例中,我们将创建一个名为product_information
的表,用于存储一家小茶店的库存和销售信息。这个表包含以下8列:
product_id
:表示int
数据类型的值,将作为表的主键。这意味着这一列中的每个值都将作为各自行的唯一标识符。product_name
:使用varchar
数据类型详细说明产品的名称,不超过30个字符。product_type
:存储产品的类型,如不超过30个字符的varchar
数据类型所示。total_inventory
:表示每个产品的库存数量,使用int
数据类型,最大值为200。product_cost
:使用decimal
数据类型显示按成本购买的每个产品的价格,左侧最多3个值,小数点后最多2个值。product_retail
:以零售方式存储每个产品的价格,由decimal
数据类型显示,左边最多3个值,小数点后面最多2个值。store_units
:使用int
数据类型的值,显示特定产品有多少单位可用于店内销售库存。online_units
:表示使用int
数据类型值的特定产品有多少个单位可用于在线销售库存
运行以下命令创建这个示例表:
sql
CREATE TABLE product_information (
product_id int,
product_name varchar(30),
product_type varchar(30),
total_inventory int(200),
product_cost decimal(3, 2),
product_retail decimal(3, 2),
store_units int(100),
online_units int(100),
PRIMARY KEY (product_id)
);
shell
OutputQuery OK, 0 rows affected, 0 warnings (0.01 sec)
现在向空表中插入一些示例数据:
sql
INSERT INTO product_information
(product_id, product_name, product_type, total_inventory, product_cost, product_retail, store_units, online_units)
VALUES
(1, 'chamomile', 'tea', 200, 5.12, 7.50, 38, 52),
(2, 'chai', 'tea', 100, 7.40, 9.00, 17, 27),
(3, 'lavender', 'tea', 200, 5.12, 7.50, 50, 112),
(4, 'english_breakfast', 'tea', 150, 5.12, 7.50, 22, 74),
(5, 'jasmine', 'tea', 150, 6.17, 7.50, 33, 92),
(6, 'matcha', 'tea', 100, 6.17, 7.50, 12, 41),
(7, 'oolong', 'tea', 75, 7.40, 9.00, 10, 29),
(8, 'tea sampler', 'tea', 50, 6.00, 8.50, 18, 25),
(9, 'ceramic teapot', 'tea item', 30, 7.00, 9.75, 8, 15),
(10, 'golden teaspoon', 'tea item', 100, 2.00, 5.00, 18, 67);
shell
OutputQuery OK, 10 rows affected (0.01 sec)
Records: 10 Duplicates: 0 Warnings: 0
插入数据后,就可以开始使用数学表达式了。
用数学表达式计算
在SQL中,你通常使用SELECT
来查询数据库并获取所需的结果集。然而,你也可以使用SELECT
关键字来执行各种数学运算。
请记住,在现实生活中,SQL主要用于查询和计算实际数据库中的值。但在本节中,你将只对数值使用SELECT
,以熟悉数学表达式和运算符的语法。
在开始之前,我们先来概述一下SQL中用于执行六种算术运算的运算符。请注意,这个列表并不全面,而且许多rdbms有一组独特的数学运算符:
- 加法使用
+
符号 - 减法使用
-
符号 - 乘法使用
*
符号 - 除法使用
/
符号 - 模操作使用
%
符号 - 求幂使用
POW(x,y)
你可以练习跑步组合不同类型的计算与你自己的价值。我们将使用以下示例进行演示,从一个加法方程开始:
sql
SELECT 893 + 579;
shell
Output+-----------+
| 893 + 579 |
+-----------+
| 1472 |
+-----------+
1 row in set (0.00 sec)
注意,因为你不需要从数据库中检索任何数据,而只是计算原始数字,所以在本节的这个或其他示例查询中,不需要包含FROM
子句。
现在用减法运算符执行计算。另外,你还可以像下面这样计算小数:
sql
SELECT 437.82 - 66.34;
shell
Output+----------------+
| 437.82 - 66.34 |
+----------------+
| 371.48 |
+----------------+
1 row in set (0.00 sec)
在SQL中,可以在单个计算中包含多个值和操作符。下面的例子使用了3个乘法运算符计算4个数的乘积:
sql
SELECT 60 * 1234 * 2 * 117;
shell
Output+---------------------+
| 60 * 1234 * 2 * 117 |
+---------------------+
| 17325360 |
+---------------------+
1 row in set (0.00 sec)
接下来,计算一个结合小数和整数的除法问题,如下所示:
sql
SELECT 2604.56 / 41;
shell
Output+--------------+
| 2604.56 / 41 |
+--------------+
| 63.525854 |
+--------------+
1 row in set (0.00 sec)
另一个除法运算符是%
,也就是求模运算符,它会计算被除数除以除数后的余数:
sql
SELECT 38 % 5;
shell
Output+--------+
| 38 % 5 |
+--------+
| 3 |
+--------+
1 row in set (0.00 sec)
另一个有用的运算符是POW(x,y)
,它计算指定基值(x
)的指数(y
)的幂:
sql
SELECT POW(99,9);
shell
Output+---------------------+
| POW(99,9) |
+---------------------+
| 9.13517247483641e17 |
+---------------------+
1 row in set (0.01 sec)
现在你已经练习了使用每个运算单独计算,可以尝试结合不同的数学运算符来练习更复杂的数学方程。
理解SQL的操作顺序
你可能熟悉术语PEMDAS,它代表括号、指数、乘法、除法、加法和减法。这一项可作为解决更复杂方程所需的操作顺序的指导。PEMDAS是美国使用的术语,而其他国家可能使用不同的缩写来代表他们的操作规则。
当需要组合嵌套在括号内的不同数学运算时,SQL从左到右读取,然后从内到外读取值。因此,请确保括号内的值准确地捕捉到要解决的问题。
请尝试使用括号和几个不同的操作符进行计算:
sql
SELECT (2 + 4 ) * 8;
shell
Output+-----------+
| (2+4) * 8 |
+-----------+
| 48 |
+-----------+
1 row in set (0.00 sec)
请记住,括号的位置很重要,如果你不小心,整个结果可能会发生变化。例如,下面的代码使用了相同的三个值和操作符,但使用了不同的括号位置,结果会不同:
sql
SELECT 2 + (4 * 8);
shell
Output+-------------+
| 2 + (4 * 8) |
+-------------+
| 34 |
+-------------+
1 row in set (0.00 sec)
如果你喜欢不使用括号进行计算,也可以这样做。记住,这里仍然有操作顺序规则;因此,与括号放置类似,请根据计算它的操作顺序确认这就是您想要的方程。在下例中,你会注意到除法运算符的优先级高于减法运算符,结果为负数:
sql
SELECT 100 / 5 - 300;
shell
Output+---------------+
| 100 / 5 - 300 |
+---------------+
| -280.0000 |
+---------------+
1 row in set (0.00 sec)
通过组合各种操作符,你成功地使用数学表达式进行数值计算和复杂计算。接下来,我们将使用示例数据使用聚集函数进行计算,并生成关于数据的新信息。
使用聚集函数分析数据
假设你是一家小茶馆的老板,你想对存储在数据库中的信息进行计算。SQL可以使用数学表达式从数据库表和不同的列中检索数据,从而查询和操作数据。这有助于生成关于你感兴趣分析的数据的新信息。在本节中,您将练习使用聚集函数查询和操作示例数据,以查找有关茶馆业务的信息。
SQL中的主要聚集函数包括SUM
、MAX
、MIN
、AVG
和COUNT
。SUM
函数将一列中的所有值相加。例如,使用SUM
来累加样本数据集中的total_inventory
列的金额:
sql
SELECT SUM(total_inventory) FROM product_information;
shell
Output+----------------------+
| SUM(total_inventory) |
+----------------------+
| 1155 |
+----------------------+
1 row in set (0.00 sec)
MAX
函数查找所选列中的最大值。对于这个例子,使用MAX
来查询在product_cost
列中列出的产品的最大花费金额,并使用AS
语句重新标记标题,使其读起来更清楚:
sql
SELECT MAX(product_cost) AS cost_max
FROM product_information;
shell
Output+----------+
| cost_max |
+----------+
| 7.40 |
+----------+
1 row in set (0.00 sec)
MIN
函数与MAX
函数相反,因为它计算最小值。使用MIN
查询product_retail
的最小花费金额:
sql
SELECT MIN(product_retail) AS retail_min
FROM product_information;
shell
Output+------------+
| retail_min |
+------------+
| 5.00 |
+------------+
1 row in set (0.00 sec)
AVG
函数计算表中指定列的所有值的平均值。此外,请注意,您可以在同一个查询中运行多个聚合函数。尝试组合一个查询,找出以零售价格销售的产品和按成本价购买的产品的平均成本:
sql
SELECT AVG(product_retail) AS retail_average,
AVG(product_cost) AS cost_average
FROM product_information;
shell
Output+----------------+--------------+
| retail_average | cost_average |
+----------------+--------------+
| 7.875000 | 5.750000 |
+----------------+--------------+
1 row in set (0.00 sec)
COUNT
函数的操作与其他函数不同,因为它通过计算查询返回的行数来从表本身计算值。在WHERE
语句中使用COUNT
函数来查询零售价值超过8.00的产品数量:
sql
SELECT COUNT(product_retail)
FROM product_information
WHERE product_retail > 8.00;
shell
Output+-----------------------+
| COUNT(product_retail) |
+-----------------------+
| 4 |
+-----------------------+
1 row in set (0.00 sec)
现在查询product_cost
中商店购买的商品超过8.00的数量:
sql
SELECT COUNT(product_cost)
FROM product_information
WHERE product_cost > 8.00;
shell
Output+---------------------+
| COUNT(product_cost) |
+---------------------+
| 0 |
+---------------------+
1 row in set (0.00 sec)
您已经成功地使用聚合函数提供了值的摘要,例如最大值、最小值、平均值和计数。您从示例数据检索了这些信息以模拟真实世界的场景。在最后一节中,您将应用所有您所学到的数学表达式和聚合函数来对小茶处的样本数据执行更详细的查询和分析。
在业务场景中应用数学表达式
本节提供了一些示例场景涉及执行数据分析帮助茶店主与决策关系到他们的业务。
作为第一个场景,计算库存中当前可用的总数量,以了解还有多少产品可供店内销售和在线销售。此查询还将包括DESC
语句,以组织从最大到最小的数据。通常RDBMS将默认为升序排序,但本例中包括"DESC"选项,允许您查看的数据降序排列:
sql
SELECT product_name,
total_inventory - (store_units + online_units)
AS remaining_inventory
FROM product_information
ORDER BY(remaining_inventory) DESC;
shell
Output+-------------------+---------------------+
| product_name | remaining_inventory |
+-------------------+---------------------+
| chamomile | 110 |
| chai | 56 |
| english_breakfast | 54 |
| matcha | 47 |
| lavender | 38 |
| oolong | 36 |
| jasmine | 25 |
| golden teaspoon | 15 |
| tea sampler | 7 |
| ceramic teapot | 7 |
+-------------------+---------------------+
10 rows in set (0.00 sec)
这个查询很有用,因为它计算剩余库存,这可以帮助茶店老板制定计划,在产品快用完时购买更多订单。
在下一个场景中,您将分析并比较实体店和在线销售的收入金额:
sql
SELECT product_name,
(online_units * product_retail) AS o,
(store_units * product_retail) AS s
FROM product_information;
shell
Output
+-------------------+--------+--------+
| product_name | o | s |
+-------------------+--------+--------+
| chamomile | 390.00 | 285.00 |
| chai | 243.00 | 153.00 |
| lavender | 840.00 | 375.00 |
| english_breakfast | 555.00 | 165.00 |
| jasmine | 690.00 | 247.50 |
| matcha | 307.50 | 90.00 |
| oolong | 261.00 | 90.00 |
| tea sampler | 212.50 | 153.00 |
| ceramic teapot | 146.25 | 78.00 |
| golden teaspoon | 335.00 | 90.00 |
+-------------------+--------+--------+
10 rows in set (0.00 sec)
接下来,使用SUM
函数和几个数学运算符计算实体店和在线销售的总收益:
sql
SELECT SUM(online_units * product_retail) +
SUM(store_units * product_retail)
AS total_sales
FROM product_information;
shell
Output+-------------+
| total_sales |
+-------------+
| 5706.75 |
+-------------+
1 row in set (0.00 sec)
执行这些查询很重要,有两个原因。第一个原因是,茶叶店主可以评估哪些产品是最畅销的,并在未来购买更多产品时优先考虑这些产品。其次,他们可以分析茶叶店的整体产品销售店内和在线执行。
接下来,你会发现每种产品的利润率。给定产品的利润率是企业销售该产品的每一单位所获得的收入。要了解你赚了多少收入,你可以用销售额乘以利润率。
要计算每个产品的利润率,请从每行的product_retail
中减去product_cost
。然后用这个值除以产品零售总额,就可以计算出利润率:
sql
SELECT product_name,
(product_retail - product_cost) / product_retail
AS profit_margin
FROM product_information;
shell
Output+-------------------+-------------+
| product_name | profit_margin |
+-------------------+-------------+
| chamomile | 0.317333 |
| chai | 0.177778 |
| lavender | 0.317333 |
| english_breakfast | 0.317333 |
| jasmine | 0.177333 |
| matcha | 0.177333 |
| oolong | 0.177778 |
| tea sampler | 0.294118 |
| ceramic teapot | 0.282051 |
| golden teaspoon | 0.600000 |
+-------------------+-------------+
10 rows in set (0.00 sec)
根据产量可知,黄金茶勺利润率最高,为60%,印度茶、茉莉花茶、抹茶、乌龙茶的利润率最低,为18%。对于黄金茶匙来说,这意味着在零售价值为5元,利润率为60%的情况下,你创造了3元的收入。
你也可以使用聚合函数AVG
来计算茶馆所有产品的平均利润率。这个平均值作为茶店老板的基准,然后确定哪些产品低于这个数字,并制定如何改进的策略:
sql
SELECT AVG((product_retail - product_cost) / product_retail)
AS avg_profit_margin
FROM product_information;
shell
Output+-------------------+
| avg_profit_margin |
+-------------------+
| 0.2838391151 |
+-------------------+
1 row in set (0.00 sec)
从这个计算,可以得出这样的结论:平均利润率为产品在这个茶叶店是28%。
有了这些新信息,假设茶店老板想在下个季度将目前利润率低于27%的产品的利润率提高到31%。为了做到这一点,你需要从1(1 - 0.31
)中减去目标利润率,然后将每个退货产品的成本除以这个值。结果将是新的价格,产品必须以零售价格销售,以实现31%的利润率:
sql
SELECT product_name, product_cost / (1 - 0.31)
AS new_retail
FROM product_information
WHERE (product_retail - product_cost) / product_retail < 0.27;
shell
Output+--------------+------------+
| product_name | new_retail |
+--------------+------------+
| chai | 10.724638 |
| jasmine | 8.942029 |
| matcha | 8.942029 |
| oolong | 10.724638 |
+--------------+------------+
4 rows in set (0.00 sec)
这些结果显示,新的零售价格对表现不佳的产品达到31%的利润率是必要的。这样的数据分析装备茶店主有能力作出决定性的商业决策如何改善他们的下个季度的营收和理解的目的。
总结
在SQL中使用数学表达式,可以像使用计算器一样解决算术问题,也可以对现实世界的数据进行复杂的分析,这些分析可能会影响业务决策。如果你能识别主要的数学运算符和运算顺序规则,计算的可能性是无穷的。当你想进一步分析数据时,使用这些带有聚合函数的操作符可以计算出"如果"问题的答案,这可能有助于战略规划。通过我们关于如何使用SQL的系列了解更多关于如何使用SQL来使用数据库的信息。