MySQL窗口函数与PyMySQL以及SQL注入

MySQL窗口函数与PyMySQL实战指南:从基础到安全编程

引言

在数据处理和分析领域,MySQL作为最流行的关系型数据库之一,其窗口函数功能为数据分析提供了强大的支持。同时,Python作为数据分析的主要语言,通过PyMySQL库与MySQL数据库进行交互,实现了高效的数据处理流程。本文将深入探讨MySQL窗口函数的使用方法以及PyMySQL的安全编程实践。

一、MySQL窗口函数详解

1.1 窗口函数概述

窗口函数是MySQL 8.0版本引入的重要功能,它允许在查询结果集的每一行上执行计算,同时保持原始行的完整性。窗口函数的主要优势包括:

  • 简洁性:相比复杂的子查询,窗口函数语法更加简洁
  • 高效性:处理大量数据时性能更优
  • 多功能性:支持排名、累计值、差值计算等多种功能

1.2 窗口函数基本语法

SELECT 查询字段,窗口函数(字段名) OVER([PARTITION BY 分组字段] [ORDER BY 排序字段]) AS 别名
FROM 表名;

1.3 实际应用案例

案例1:计算学生分数与平均分的差值

需求:计算每个学生的分数与所有学生平均分的差值

传统子查询方式

SELECT*,(SELECT AVG(Score) FROM students) AS avg_score,Score - (SELECT AVG(Score) FROM students) AS diff_score
FROM students;

窗口函数方式

SELECT*,AVG(Score) OVER() AS avg_score,Score - AVG(Score) OVER() AS diff_score
FROM students;
案例2:按性别分组计算差值

需求:计算每个学生的分数与同性别学生平均分的差值

窗口函数实现

SELECT*,AVG(Score) OVER(PARTITION BY Gender) AS avg_score,Score - AVG(Score) OVER(PARTITION BY Gender) AS diff_score
FROM students;
案例3:排名函数应用

MySQL提供了三种排名函数:

  • RANK():有并列时序号重复但不连续
  • DENSE_RANK():有并列时序号重复且连续
  • ROW_NUMBER():返回连续唯一的行号
SELECT*,RANK() OVER(ORDER BY Score DESC) AS rank_num,DENSE_RANK() OVER(ORDER BY Score DESC) AS dense_rank_num,ROW_NUMBER() OVER(ORDER BY Score DESC) AS row_num
FROM students;

1.4 获取分组内最高分学生

使用窗口函数结合子查询:

WITH ranked_students AS (SELECT*,ROW_NUMBER() OVER(PARTITION BY Gender ORDER BY Score DESC) AS rnFROM students
)
SELECT * FROM ranked_students WHERE rn = 1;

二、MySQL事务机制

2.1 事务的四大特性

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成
  2. 一致性(Consistency):事务执行前后数据库的完整性不被破坏
  3. 隔离性(Isolation):多个事务并发执行时相互隔离
  4. 持久性(Durability):事务提交后对数据的修改是永久的

2.2 事务操作示例

-- 创建账户表
CREATE TABLE account (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00
) ENGINE=InnoDB;-- 插入测试数据
INSERT INTO account (username, balance) VALUES
('Alice', 1000.00),
('Bob', 500.00);-- 事务操作示例
BEGIN;
-- Alice账户扣减200元
UPDATE account SET balance = balance - 200 WHERE username = 'Alice';
-- Bob账户增加200元
UPDATE account SET balance = balance + 200 WHERE username = 'Bob';
COMMIT;

2.3 事务提交方式

MySQL支持两种事务提交方式:

  • 自动提交SET AUTOCOMMIT = 1
  • 手动提交SET AUTOCOMMIT = 0

三、PyMySQL基础操作

3.1 PyMySQL安装与连接

# 安装PyMySQL
# pip install pymysqlimport pymysql# 建立数据库连接
connection = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='jing_dong',charset='utf8'
)

3.2 查询操作

# 创建游标对象
cursor = connection.cursor()# 执行查询SQL
sql = "SELECT * FROM goods"
cursor.execute(sql)# 获取查询结果
data = cursor.fetchall()  # 获取所有结果
# data = cursor.fetchone()  # 获取一条结果for item in data:print(item)# 关闭游标和连接
cursor.close()
connection.close()

3.3 增删改操作

cursor = connection.cursor()try:sql = "INSERT INTO account(username, balance) VALUES('zhangsan', 200)"row = cursor.execute(sql)print(f'影响的行数:{row}')
except Exception as e:print('报错了', e)connection.rollback()  # 回滚操作connection.commit()  # 提交事务
cursor.close()
connection.close()

四、SQL注入问题与解决方案

4.1 SQL注入问题演示

问题代码

username = input('请输入用户名:')
password = input('请输入密码:')sql = f"SELECT * FROM user WHERE user = '{username}' AND pwd = '{password}'"
cursor.execute(sql)

攻击示例

  • 用户名输入:111
  • 密码输入:' OR 1=1 OR '

生成的SQL语句:

SELECT * FROM user WHERE user = '111' AND pwd = '' OR 1=1 OR ''

这将导致条件始终为真,绕过身份验证。

4.2 参数化查询解决方案

安全代码

username = input('请输入用户名:')
password = input('请输入密码:')sql = "SELECT * FROM user WHERE user = %s AND pwd = %s"
params = [username, password]
cursor.execute(sql, params)

优势

  • 防止SQL注入攻击
  • 提高代码可读性
  • 自动处理特殊字符转义

五、实战项目:京东商品管理系统

5.1 数据库设计

-- 创建京东数据库
CREATE DATABASE IF NOT EXISTS jing_dong CHARSET=utf8;
USE jing_dong;-- 创建商品表
CREATE TABLE goods(id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,name VARCHAR(150) NOT NULL,cate_name VARCHAR(40) NOT NULL,brand_name VARCHAR(40) NOT NULL,price DECIMAL(10,3) NOT NULL DEFAULT 0,is_show BIT NOT NULL DEFAULT 1,is_saleoff BIT NOT NULL DEFAULT 0
);-- 创建用户表
CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT,user VARCHAR(30),pwd VARCHAR(30)
);

5.2 Python操作示例

import pymysqlclass JDManager:def __init__(self):self.connection = pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='jing_dong',charset='utf8')self.cursor = self.connection.cursor()def query_goods(self):"""查询所有商品"""sql = "SELECT * FROM goods"self.cursor.execute(sql)return self.cursor.fetchall()def add_goods(self, name, cate_name, brand_name, price):"""添加商品"""sql = "INSERT INTO goods(name, cate_name, brand_name, price) VALUES(%s, %s, %s, %s)"params = [name, cate_name, brand_name, price]try:self.cursor.execute(sql, params)self.connection.commit()return Trueexcept Exception as e:self.connection.rollback()print(f"添加失败:{e}")return Falsedef close(self):"""关闭连接"""self.cursor.close()self.connection.close()# 使用示例
manager = JDManager()
goods_list = manager.query_goods()
for goods in goods_list:print(goods)
manager.close()

六、最佳实践总结

6.1 窗口函数使用建议

  1. 选择合适的排名函数:根据业务需求选择RANK、DENSE_RANK或ROW_NUMBER
  2. 合理使用PARTITION BY:避免过度分组导致性能问题
  3. 注意MySQL版本兼容性:窗口函数需要MySQL 8.0+

6.2 PyMySQL安全编程

  1. 始终使用参数化查询:避免字符串拼接SQL语句
  2. 正确处理事务:确保数据一致性
  3. 及时关闭连接:避免连接泄漏
  4. 异常处理:捕获并处理数据库操作异常

6.3 性能优化建议

  1. 合理使用索引:提高查询性能
  2. 批量操作:减少数据库交互次数
  3. 连接池:在高并发场景下使用连接池
  4. 查询优化:避免SELECT *,只查询需要的字段

结语

MySQL窗口函数和PyMySQL的结合为数据处理提供了强大的工具。通过掌握窗口函数的使用方法,可以简化复杂的数据分析查询;通过PyMySQL的安全编程实践,可以构建稳定可靠的数据库应用程序。在实际项目中,合理运用这些技术,能够显著提高开发效率和系统安全性。


关键词:MySQL、窗口函数、PyMySQL、SQL注入、事务处理、数据分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93075.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级项目——基于FPGA的串行FIR滤波器

给大家安利一个 AI 学习神站!在这个 AI 卷成红海的时代,甭管你是硬核开发者还是代码小白,啃透 AI 技能树都是刚需。这站牛逼之处在于:全程用 "变量名式" 幽默 生活化类比拆解 AI,从入门到入土(啊…

JPrint免费的Web静默打印控件:PDF打印中文乱码异常解决方案

文章目录JPrint是什么?中文乱码(Using fallback font xxx for xxxx)1.字体嵌入2.客户机字体安装开源地址相关目录导航使用文档端口号修改代理使用场景打印服务切换中文乱码解决方案 JPrint是什么? JPrint是一个免费开源的可视化静…

MFT 在零售行业的实践案例与场景:加速文件集成与业务协作的高效方案

零售行业竞争激烈、数字化转型迭代迅速,业务对数据与档案的传输、处理和整合要求极高。无论是新品上市市场数据,还是供应链物流单据,集成方式不论是通过API或是档案传输, 对于传输的稳定性,安全性与性能, 都会直接影响决策效率与顾客体验。MF…

OSG+Qt —— 笔记1 - Qt窗口加载模型(附源码)

🔔 OSG/OsgEarth 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) OSG+Qt所用版本皆为: Vs2017+Qt5.12.4+Osg3.6.5+OsgQt(master) 效果 代码(需将cow.osg、reflect.rgb拷贝至工程目录下) OsgForQt.ui main.cpp

开源安全云盘存储:Hoodik 实现端到端数据加密,Docker快速搭建

以下是对 Hoodik 的简单介绍: Hoodik 是一个使用 Rust 和 Vue 开发的轻量级自托管安全云存储解决方案采用了非对称RSA密钥对和AES混合加密策略,从文件存储加密到数据链路加密,全程保证数据安全支持Docker一键私有部署,数据和服务…

[C++] Git 使用教程(从入门到常用操作)

1. Git 简介 Git 是一款分布式版本控制系统,用来跟踪文件变化、协作开发、管理项目版本。 它是开源的,由 Linus Torvalds 在 2005 年开发,广泛用于开源与企业项目中。 2. 安装 Git Windows 前往 Git 官网 下载并安装。 安装时建议勾选 Git…

实盘回测一体的期货策略开发:tqsdk获取历史数据并回测,附python代码

原创内容第969篇,专注AGI,AI量化投资、个人成长与财富自由。 星球好多同学希望说说实盘,我们就从实盘开始吧。 我们选择tqsdk给大家讲解,tqsdk支持免费注册,使用模拟账户,历史和实时数据,方便…

大模型推理框架vLLM 中的Prompt缓存实现原理

背景:为什么需要Prompt缓存模块?在大模型问答多轮对话应用场景中,不同请求的 Prompt 往往有相同的前缀,比如:第一次问答:你是一名专业的电子产品客服,负责回答客户关于手机产品的咨询。请根据以…

Python之Django使用技巧(附视频教程)

概述 Django 是一个高级的 Python Web 框架,遵循 “batteries-included”(内置电池)理念,提供了构建 Web 应用所需的大部分组件,让开发者可以专注于业务逻辑而不是底层细节。视频教程:https://pan.quark.cn…

sqli-labs通关笔记-第44关 POST字符型堆叠注入(单引号闭合 手工注入+脚本注入3种方法)

目录 一、堆叠注入 二、源码分析 1、代码审计 2、SQL注入安全性分析 三、堆叠手注法 1、进入靶场 2、正确用户名密码登录 3、堆叠注入 4、查看数据库 四、联合手注法 1、获取列数 2、确认回显位 3、获取数据库名 4、获取表名 5、获取列名 6、获取字段 7、总结…

从深度伪造到深度信任:AI安全的三场攻防战

前言当大模型开始“睁眼”看世界,伪造者也开始“闭眼”造世界。2025 WAIC释放出的信号很明确:没有AI安全底座,就没有产业智能化的高楼。WAIC 把“安全”摆在与“创新”同等重要的位置,形成了“1 份共识框架+2 份重磅报…

【C++】哈希的应用:位图和布隆过滤器

目录 一、位图 1.1 位图的概念 1.2 位图的实现 1.3 位图的应用 二、布隆过滤器 2.1 布隆过滤器的提出 2.2 布隆过滤器的概念 2.3 布隆过滤器的插入和查找 2.4 布隆过滤器的删除 2.5 布隆过滤器的优点 2.6 布隆过滤器的缺点 一、位图 1.1 位图的概念 1. 面试题 给4…

C语言:指针(4)

1. 回调函数回调函数就是指通过函数指针调用的函数。如果将函数指针作为参数传递给另一个函数,另一个函数根据指针来调这个函数,那么被调用的函数就是回调函数。回调函数不是由这个函数的实现方直接调用,而是在特定的条件下由另一方调用的。例…

vue--video使用动态src时,视频不更新

问题描述 在 Vue项目中&#xff0c;尝试动态更新 标签的 元素 src 属性来切换视频时&#xff0c;遇到了一个问题&#xff1a;即使 src 已更改&#xff0c;浏览器仍不显示视频。 <template><video width"100%" height"100%" controlspause"…

计算机视觉--opencv(代码详细教程)(一)

在计算机视觉的广袤领域中&#xff0c;OpenCV 是一座极为关键的里程碑。无论是在前沿的学术研究&#xff0c;还是在蓬勃发展的工业界&#xff0c;OpenCV 凭借其强大的功能与高效的性能&#xff0c;为开发者提供了丰富的图像处理和计算机视觉算法&#xff0c;助力无数项目落地。…

物联网通讯协议-MQTT、Modbus、OPC

引言在物联网迅速发展的今天&#xff0c;设备间的通信协议扮演着至关重要的角色。它们是不同设备、系统之间实现数据交换的桥梁。本文将详细介绍三种在物联网领域广泛应用的通讯协议——MQTT、Modbus和OPC&#xff0c;包括它们的基础概念、特点及在C#中的实现方法。一、MQTT协议…

牛客周赛R104 小红的矩阵不动点

D-小红的矩阵不动点_牛客周赛 Round 104 赛时这道题卡了一段时间&#xff0c;赛时代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int ans,h; int a[505][505]; signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int n,m;cin>…

Rust面试题及详细答案120道(19-26)-- 所有权与借用

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Jenkins + SonarQube 从原理到实战三:SonarQube 打通 Windows AD(LDAP)认证与踩坑记录

前言 在前两篇文章中&#xff0c;已经介绍了 SonarQube 的部署 以及 通过 sonar-cxx 插件实现 C/C 代码扫描。 本篇将重点讲 如何让 SonarQube 对接 Windows AD&#xff08;LDAP&#xff09;&#xff0c;实现域账号登录和基于 AD 组的权限管理。 一、背景与需求分析 需求分析…

[AI React Web] 包与依赖管理 | `axios`库 | `framer-motion`库

第七章&#xff1a;包与依赖管理 在我们使用open-lovable的旅程中&#xff0c;已经探索了它如何管理对话状态&#xff08;第一章&#xff1a;对话状态管理&#xff09;、将创意转化为可运行代码&#xff08;第二章&#xff1a;AI代码生成管道&#xff09;、如何在安全的虚拟环…