💪🏻 制定明确可量化的目标,坚持默默的做事。
开篇:
在数据的海洋中航行,我们需要精确的仪器来导航。🧭 MySQL作为数据库世界的老舵手,其强大的数字函数是每位数据分析师和开发者的航海图。今天,我要带大家深入探索MySQL数字函数的奥秘,通过场景化的SQL语句,解锁数据处理的高级技巧。🔍📊 准备好,让我们一起揭开“MYSQL数字函数实操宝典:场景化SQL语句一网打尽”的神秘面纱!
Part 1: 准备 🚀
登陆MYSQL服务
mysql -u root -p; |
命令说明:👇
1. mysql:
✨ 这是 MySQL 客户端工具的命令名。它允许用户连接到 MySQL 数据库服务器,并执行 SQL 语句来查询和管理数据库。
2. -u root:
✨ -u 是一个选项,后面跟着的是要用来连接数据库的用户名。在这个例子中,用户名是 root。root 用户是 MySQL 的一个默认管理员账户,通常拥有对数据库服务器的完全控制权。在生产环境中,出于安全考虑,建议避免直接使用 root 用户,而是创建具有必要权限的特定用户。
3. -p:
✨ 这个选项告诉 MySQL 客户端在连接时提示用户输入密码。当您执行带有 -p 选项的命令时,系统会提示您输入与指定用户名(在本例中是 root)关联的密码。出于安全原因,输入密码时不会显示任何字符,以防止旁观者看到密码。
创建用户并授权
CREATE USER 'danci_btq'@'%' IDENTIFIED BY 'danci_btq'; GRANT ALL PRIVILEGES ON danci_btq.* TO 'danci_btq'@'%'; FLUSH PRIVILEGES; |
命令说明:👇
1. CREATE USER :
✨ 这是MySQL中用于创建新用户的语句。CREATE USER后面会跟着新用户的用户名和该用户可以从哪些主机连接到数据库服务器的信息。
2. 'danci_btq'@'%':
✨ 这部分定义了新用户的用户名和允许连接的主机。在这个例子中,danci_btq是新创建的用户名。
danci_btq:
是新用户的用户名。@:
分隔用户名和主机名。%:
表示允许从任何主机连接到MySQL服务器。这是一个通配符,代表所有可能的主机。在生产环境中,出于安全考虑,通常会限制用户只能从特定的IP地址或主机名连接。例如,如果你只想允许从IP地址为192.168.1.100的主机连接,你可以使用'danci_btq'@'192.168.1.100'。
3. IDENTIFIED BY 'danci_btq':
✨ 这部分定义了用户的密码。在这个例子中,新用户的密码被设置为danci_btq。
IDENTIFIED BY:
是用来指定用户密码的关键词。'danci_btq':
是用户的密码。出于安全考虑,在实际应用中,应该使用复杂且难以猜测的密码,并定期更换密码。
4. GRANT:
✨ 这是MySQL中用于赋予权限的关键字。GRANT
语句用于指定一个或多个用户可以在哪些数据库和表上执行哪些操作。
5. ALL PRIVILEGES:
✨ 表示赋予用户所有的权限。这包括数据查询(SELECT)、数据插入(INSERT)、数据更新(UPDATE)、数据删除(DELETE)、表创建(CREATE)、表删除(DROP)等所有可能的操作权限。在实际应用中,根据安全原则,通常建议仅授予用户所需的最小权限集,而不是所有权限。
6. ON danci_btq.*:
✨ 这部分指定了权限的作用范围。danci_btq.*
表示权限适用于名为danci_btq
的数据库中的所有表。这里的*
是一个通配符,代表数据库中的所有表。如果你只想授予特定表的权限,可以将*替换为具体的表名。
7. TO 'danci_btq'@'%':
✨ 这部分指定了权限的接收者,即哪个用户将获得这些权限。'danci_btq'@'%'
表示用户名为danci_btq
,且该用户可以从任何主机(由%
表示)连接到MySQL服务器。这里的%
是一个通配符,代表所有可能的主机。出于安全考虑,在生产环境中,通常会限制用户只能从特定的IP地址或主机名连接。
Part 2: 数字函数的基石:ROUND()和ABS() 📏🌈
在数据处理的世界里,准确性是我们的第一追求。MySQL的ROUND()
函数帮助我们对数据进行精确的四舍五入操作,而ABS()函数则是求绝对值的利器,无论是财务计算还是数据分析,它们都是不可或缺的基础工具。📐✨
金额四舍五入 ROUND()
ROUND()
函数在 MYSQL 中用于对数字进行四舍五入,它在实际开发中有广泛的应用。以下是一些 ROUND()
函数在实际开发中的应用案例:
在处理财务数据时,经常需要对金额进行四舍五入。ROUND函数可以帮助我们实现这一点。例如,将sales表中的销售额四舍五入到两位小数: |
SELECT ROUND(price, 2) AS rounded_price FROM sales;
这个查询将 sales
表中的 price
列四舍五入到两位小数,并将结果作为 rounded_price
返回。
-- 建表语句
CREATE TABLE `danci_btq`.`sales` (
`id` int NOT NULL AUTO_INCREMENT,
`product_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`quantity` int NOT NULL,
`price` decimal(10, 2) NOT NULL,
`total_sales` decimal(10, 2) GENERATED ALWAYS AS ((`quantity` * `price`)) VIRTUAL NULL,
`rounded_sales` decimal(10, 2) GENERATED ALWAYS AS (round(`total_sales`,2)) VIRTUAL NULL,
`score` int NULL DEFAULT NULL,
`weight` double NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
评分计算
在评分系统中,可能需要计算平均分,并将结果四舍五入到一位小数或整数。 |
SELECT ROUND(AVG(score), 1) AS average_score FROM sales;
这个查询计算 sales
表中 score
列的平均值,并将结果四舍五入到一位小数。
数值范围归整
在处理一些需要按特定范围归整的数值时,可以使用 ROUND() 函数。例如,将体重数据四舍五入到最接近的5公斤。 |
SELECT ROUND(weight / 5) * 5 AS rounded_weight FROM sales;
这个查询将 health_data 表中的 weight 列除以5,四舍五入结果,然后再乘以5,以实现将体重数据归整到最接近的5公斤。
以上案例展示了 ROUND()
函数在处理需要四舍五入的数字时的灵活性和实用性。通过这个函数,开发者可以确保数据的准确性、规范性和可读性。
计算距离差 ABS()
ABS()
是 MYSQL 中的一个数字函数,用于返回数字的绝对值。在实际开发中,这个函数可以在多种场景下发挥作用,尤其是当我们需要处理可能包含正负数值的数据,并且想要确保结果始终为正数时。
在地理信息系统中,经常需要计算两点之间的距离差。如果数据以坐标形式存储,并且可能包含负数(例如,经纬度中的西经和南纬),则可以使用 ABS() 函数来确保距离差始终为正数。 |
SELECT ABS(latitude1 - latitude2) AS latitude_difference,
ABS(longitude1 - longitude2) AS longitude_difference
FROM locations
WHERE location_id = 8;
-- 建表语句
CREATE TABLE `danci_btq`.`locations` (
`location_id` int NOT NULL,
`latitude1` decimal(9, 6) NOT NULL,
`longitude1` decimal(9, 6) NOT NULL,
`latitude2` decimal(9, 6) NULL DEFAULT NULL,
`longitude2` decimal(9, 6) NULL DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL,
PRIMARY KEY (`location_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
处理财务数据
在财务应用中,可能需要计算账户余额的变化量,而不关心是收入还是支出。使用 ABS() 可以得到变化的绝对值。 |
SELECT ABS(price) AS absolute_price FROM sales
排序和比较
当需要对包含正负数的列进行排序,并且希望按照绝对值的大小来排序时,可以使用 ABS() 函数。 |
SELECT price FROM sales ORDER BY ABS(price) DESC;
以上案例展示了 ABS()
函数在处理需要正数值的各种场景中的实用性。通过这个函数,开发者可以简化数据处理逻辑,并确保结果的准确性和一致性。
Part 3: 探秘聚合函数:SUM()和AVG() 📸🔍
数据分析的核心在于洞察趋势和模式。SUM()
和AVG()
函数允许我们快速计算总和和平均值,是理解数据波动和趋势的神器。无论是销售报告、库存分析还是用户行为研究,这些聚合函数都能提供强大的支持。🌊📈
计算累积和 SUM()
SUM()
是 MySQL 中一个常用的聚合函数,用于计算指定列的总和。在实际开发中,SUM()
函数经常用于统计各类数据的总和,例如销售总额、用户总积分、总访问量等。以下是一些 SUM() 函数在实际开发中的应用案例:
在金融或财务分析中,可能需要计算累积和(running total)。虽然这通常需要使用变量或窗口函数(如SUM() OVER()),但基本的数字运算也是关键部分。 |
SET @running_total := 0;
SELECT
date,
sales_amount,
(@running_total := @running_total + sales_amount) AS cumulative_sales
FROM sales_data
ORDER BY date;
执行上述查询后,您将得到一个按日期排序的销售数据列表,其中包括每天的销售额和累积销售额。
-- 建表语句
CREATE TABLE sales_data (
id INT AUTO_INCREMENT PRIMARY KEY,
date DATE NOT NULL,
sales_amount DECIMAL(10, 2) NOT NULL
);
注:使用用户定义的变量(如@running_total
)来计算累积值是一种有效的方法,但在某些情况下可能不是最佳实践,特别是当您处理大量数据或需要更复杂的窗口函数时。在这种情况下,考虑使用MySQL 8.0及更高版本中的窗口函数功能可能会更加高效和灵活。
计算每月销售总额
如果要计算每个月的销售总额,可以结合 GROUP BY 子句和 SUM() 函数来实现: |
SELECT MONTH(order_date) AS month, SUM(order_amount) AS monthly_sales
FROM orders
GROUP BY MONTH(order_date);
这里假设 order_date 是订单的日期列。
结合条件语句进行计算
还可以使用 CASE 语句与 SUM() 函数结合,根据特定条件对数据进行汇总: |
SELECT
SUM(CASE WHEN status = 'Completed' THEN order_amount ELSE 0 END) AS completed_sales,
SUM(CASE WHEN status = 'Pending' THEN order_amount ELSE 0 END) AS pending_sales
FROM orders;
在这个例子中,我们分别计算了状态为 "Completed" 和 "Pending" 的订单的销售总额。
这些案例展示了 SUM()
函数在 MySQL 数据库开发中的多样性和实用性。通过结合其他 SQL 语句和函数,SUM()
可以帮助开发者轻松地实现各种复杂的数据汇总任务。
计算平均值和标准差 AVG()
AVG()
是 MySQL 中的一个聚合函数,用于计算指定列的平均值。在实际开发中,AVG()
函数经常用于统计分析,帮助用户了解数据的中心趋势。以下是一些 AVG() 函数在实际开发中的应用案例:
在教育或统计分析领域,经常需要计算一组数据的平均值(AVG)和标准差(STDDEV)。例如,计算学生考试成绩的平均值和标准差。 |
SELECT
AVG(score) AS average_score,
STDDEV(score) AS standard_deviation
FROM exam_results;
执行这个查询后,您将得到所有学生考试成绩的平均值和标准差。
-- 建表语句
CREATE TABLE exam_results (
id INT AUTO_INCREMENT PRIMARY KEY, -- 一个自增的主键ID
student_name VARCHAR(100), -- 学生姓名
score DECIMAL(10, 2) -- 考试成绩,假设为小数类型,精确到小数点后两位
);
注:STDDEV
函数在某些数据库系统中可能不可用或者有不同的名称(例如 STDDEV_POP
或 STDDEV_SAMP
),这取决于您使用的具体 MySQL 版本或数据库系统。在 MySQL 中,STDDEV
是 STDDEV_SAMP
的别名,它计算的是样本标准差。如果您想计算总体标准差,可以使用 STDDEV_POP
函数。
计算产品平均销售额
在销售管理系统中,为了了解产品的市场表现,可能需要计算某个产品的平均销售额。假设有一个 sales 表,其中包含产品的销售额信息(sales_amount),并且每行记录代表一次销售交易。要计算某个产品的平均销售额,可以使用: |
SELECT AVG(sales_amount) AS average_sales FROM sales WHERE product_id = 123;
这里 product_id = 123 是一个筛选条件,用于指定要计算平均销售额的产品。
计算学生平均成绩
在教育管理系统中,教师可能需要计算学生的平均成绩来评估学生的学习情况。假设有一个 scores 表,其中包含学生的成绩信息(score),要计算某个班级学生的平均成绩,可以使用: |
SELECT AVG(score) AS average_score FROM scores WHERE class_id = 'A';
这里 class_id = 'A' 是一个筛选条件,用于指定要计算平均成绩的班级。
这些案例展示了 AVG()
函数在 MySQL 数据库开发中的通用性和实用性。通过结合其他 SQL 语句和函数,AVG()
可以帮助开发者轻松地实现各种复杂的数据分析任务。
Part 4: 精准控制:FLOOR()和CEIL() ⏰ 🛠️
在处理数据时,我们经常需要对数字进行向下或向上的取整操作,这是FLOOR()
和CEIL()
发光发热的舞台。无论是设置价格区间、计算配送批次,还是优化库存管理,这两个函数都能帮助我们精准地控制数字,确保决策的高效和精确。🚀🎯
分页处理 FLOOR()
FLOOR()
函数在 MYSQL 中用于向下取整,即返回不大于传入数值的最大整数。在实际开发中,这个函数可以在多种场景下发挥作用,尤其是当我们需要对数值进行取整处理时。以下是一些 FLOOR() 函数在实际开发中的应用案例:
在开发分页功能时,如果每页显示固定数量的记录,并且需要计算总页数,可以使用 FLOOR() 函数。例如,总共有 103 条记录,每页显示 10 条记录,那么可以通过 FLOOR() 函数来计算需要显示的页数。 |
SELECT FLOOR(103 / 10) AS total_pages; -- 结果为 10,表示需要 10 页来显示所有记录
价格计算
在处理价格时,有时需要将价格向下取整到最接近的整数或特定的单位。例如,某个商品的价格是 99.99 元,但商家决定只按整数元收费,那么可以使用 FLOOR() 函数来取整价格。 |
SELECT FLOOR(99.99) AS rounded_price; -- 结果为 99
年龄计算
在计算年龄时,如果需要根据生日来确定某人在某个日期时的年龄,并且不需要精确到月或日,可以使用 FLOOR() 函数来取整年份差。 |
SELECT FLOOR(DATEDIFF('2023-10-23', '1990-05-15') / 365) AS age; -- 粗略计算年龄,不考虑闰年
时间计算中的天数向上取整 CEIL()
CEIL()
函数在 MYSQL 中用于向上取整,即返回大于或等于传入数值的最小整数。在实际开发中,这个函数在多种场景下都非常有用,尤其是当我们需要对数值进行取整处理并且希望结果总是偏向更大的整数时。以下是一些 CEIL()
函数在实际开发中的应用案例:
在处理与时间相关的数据时,有时需要将小时数转换为天数,并且希望结果总是向上取整。这对于计算工作时长或项目周期特别有用。 |
SELECT CEIL(hours_worked / 8) AS days_worked FROM timesheets;
在这个例子中,假设一个工作日是 8 小时,那么工作的小时数除以 8 并向上取整就得到了工作的天数。
-- 建表语句
CREATE TABLE timesheets (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_name VARCHAR(100) NOT NULL,
project_name VARCHAR(100) NOT NULL,
hours_worked DECIMAL(10, 2) NOT NULL,
date_worked DATE NOT NULL
);
分页处理中的页数计算
当进行分页查询时,如果数据总量除以每页显示的条目数不是整数,那么需要显示的页数应该是这个除法结果向上取整的值。这样可以确保所有的数据都能被显示。 |
SELECT CEIL(COUNT(*) / 10) AS total_pages FROM articles;
金融服务中的费用计算
在金融领域,某些费用可能是基于交易金额的一个比例来计算的,并且这个比例计算的结果需要向上取整到最接近的整数。例如,计算某笔交易的手续费。 |
SELECT CEIL(transaction_amount * fee_rate) AS fee FROM transactions;
这篇文章的旅程仅仅是开始,MySQL数字函数的宝库远不止这些。但希望通过这几个精选的函数和场景应用,能够激发你对深入探索MySQL更多功能的兴趣。🌟💡 准备好,让我们在数据的世界里,用SQL语句绘制更加精彩的图景!
更多MYSQL数字函数介绍详见:https://developer.aliyun.com/article/1474849