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
英文地址,請注明出處:http://en.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;、如何在安全的虛擬環…