《MySQL 简易速速上手小册》第9章:高级 MySQL 特性和技巧(2024 最新版)

在这里插入图片描述

文章目录

  • 9.1 使用存储过程和触发器
    • 9.1.1 基础知识
    • 9.1.2 重点案例:使用 Python 调用存储过程实现用户注册
    • 9.1.3 拓展案例 1:利用触发器自动记录数据更改历史
    • 9.1.4 拓展案例 2:使用 Python 和触发器实现数据完整性检查
  • 9.2 管理和查询 JSON 数据
    • 9.2.1 基础知识
    • 9.2.2 重点案例:使用 Python 将数据存储为 JSON 格式
    • 9.2.3 拓展案例 1:查询 JSON 数据
    • 9.2.4 拓展案例 2:更新 JSON 数据
  • 9.3 使用视图和临时表
    • 9.3.1 基础知识
    • 9.3.2 重点案例:使用 Python 和视图简化数据访问
    • 9.3.3 拓展案例 1:使用 Python 和临时表处理复杂数据
    • 9.3.4 拓展案例 2:使用视图和 Python 实现数据权限管理

9.1 使用存储过程和触发器

探索存储过程和触发器的魔法世界

在MySQL的奇妙世界里,存储过程和触发器是那些默默守护着数据完整性和自动化工作流的守护者。它们就像是被赋予了特殊魔法的仪式和符咒,一旦被唤醒,就能自动执行一系列复杂的任务。

9.1.1 基础知识

  • 存储过程:是一组为了完成特定功能的SQL语句集,存储在数据库中,可以通过简单的调用来执行。它们就像是预先编排好的魔法组合,旨在提高数据处理的效率和一致性。
  • 触发器:是数据库中的一种特殊类型的存储过程,它会在数据表上发生特定事件(如INSERT、UPDATE、DELETE)时自动执行。触发器就像是那些守护着秘密入口的看门人,一旦有人触发了门铃,它们就会按照既定的规则行动。

9.1.2 重点案例:使用 Python 调用存储过程实现用户注册

假设你正在开发一个网站,需要实现一个用户注册的功能,这个功能需要通过调用存储过程来完成。

步骤

  1. 首先,在MySQL中创建一个存储过程create_user

    DELIMITER $$
    CREATE PROCEDURE create_user(IN username VARCHAR(255), IN password VARCHAR(255))
    BEGIN
        INSERT INTO users(username, password) VALUES(username, password);
    END$$
    DELIMITER ;
    
  2. 使用Python调用这个存储过程。

    import mysql.connector
    
    conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
    cursor = conn.cursor()
    cursor.callproc('create_user', ['new_user', 'password123'])
    conn.commit()
    cursor.close()
    conn.close()
    print("User registered successfully.")
    

9.1.3 拓展案例 1:利用触发器自动记录数据更改历史

为了追踪users表的更改历史,你可以创建一个触发器,在每次用户信息更新时自动记录更改。

DELIMITER $$
CREATE TRIGGER before_user_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
 INSERT INTO users_history(user_id, username, action)
 VALUES(OLD.id, OLD.username, 'UPDATE');
END$$
DELIMITER ;

9.1.4 拓展案例 2:使用 Python 和触发器实现数据完整性检查

假设你要确保orders表中的order_amount字段总是正数,你可以创建一个触发器来实现这一规则,并使用Python插入数据测试它。

DELIMITER $$
CREATE TRIGGER check_order_amount
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
 IF NEW.order_amount <= 0 THEN
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Order amount must be positive';
 END IF;
END$$
DELIMITER ;
import mysql.connector
from mysql.connector import Error

try:
    conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
    cursor = conn.cursor()
    cursor.execute("INSERT INTO orders (order_id, order_amount) VALUES (%s, %s)", (1, -100))
    conn.commit()
except Error as e:
    print(f"Error: {e}")
finally:
    if conn.is_connected():
        cursor.close()
        conn.close()

通过上述案例,你已经学会了如何在MySQL中利用存储过程和触发器来自动化和简化复杂的数据操作,并通过Python来与这些强大的工具互动。这些高级特性能够帮助你构建更加健壮、高效的应用,同时保证数据的一致性和完整性。

在这里插入图片描述


9.2 管理和查询 JSON 数据

在MySQL的宝库中,JSON数据类型是一颗璀璨的宝石,它允许你以非常灵活的格式存储和查询结构化数据。从5.7版本开始,MySQL加入了对JSON数据类型的支持,让你能够轻松地在关系数据库中处理非关系型数据。

9.2.1 基础知识

  • JSON数据类型:MySQL中的JSON是一种格式良好的字符串,能够存储复杂的数据对象和数组。
  • 函数和操作符:MySQL提供了一系列的函数和操作符来创建、查询和修改JSON文档,如JSON_EXTRACT()JSON_SET()等。
  • 索引:你可以在JSON列上创建虚拟列,并在这些虚拟列上建立索引,以提高查询性能。

9.2.2 重点案例:使用 Python 将数据存储为 JSON 格式

假设你正在开发一个内容管理系统,需要存储文章及其元数据,其中一些字段是可选的,这使得JSON成为理想的存储格式。

步骤

  1. 在MySQL数据库中创建一张表,其中包含一个JSON类型的列用来存储文章的元数据。

    CREATE TABLE articles (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(255) NOT NULL,
        content TEXT NOT NULL,
        metadata JSON
    );
    
  2. 使用Python插入一篇文章及其元数据。

    import mysql.connector
    import json
    
    article = {
        "title": "Exploring JSON in MySQL",
        "content": "Here is the content...",
        "metadata": {
            "author": "John Doe",
            "keywords": ["MySQL", "JSON"],
            "published_date": "2021-08-01"
        }
    }
    
    conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
    cursor = conn.cursor()
    cursor.execute(
        "INSERT INTO articles (title, content, metadata) VALUES (%s, %s, %s)",
        (article["title"], article["content"], json.dumps(article["metadata"]))
    )
    conn.commit()
    cursor.close()
    conn.close()
    

9.2.3 拓展案例 1:查询 JSON 数据

现在,我们需要查询所有包含特定关键字的文章。

keyword = "MySQL"
query = f"SELECT title FROM articles WHERE JSON_CONTAINS(metadata->'$.keywords', '\"{keyword}\"')"

cursor.execute(query)
for (title,) in cursor.fetchall():
 print(title)

9.2.4 拓展案例 2:更新 JSON 数据

某篇文章的发布日期需要更改,我们可以使用Python来更新这篇文章的元数据。

new_date = "2021-09-01"
article_id = 1
update_query = "UPDATE articles SET metadata = JSON_SET(metadata, '$.published_date', %s) WHERE id = %s"

cursor.execute(update_query, (new_date, article_id))
conn.commit()

通过上述案例,你已经掌握了如何在MySQL中灵活使用JSON数据类型,并通过Python来进行高效的数据操作。无论是存储复杂的数据结构,还是进行高效的数据查询和更新,JSON都能够帮助你轻松应对,使你的数据库应用更加强大和灵活。

在这里插入图片描述


9.3 使用视图和临时表

在MySQL的魔法世界里,视图和临时表是两种强大的魔法工具。它们像是幻术师,能够让复杂的数据和查询在你眼前变得简单明了。视图可以为复杂的查询提供一个清晰的窗口,而临时表则在你需要它们时出现,用完即消失,帮助你高效地处理数据。

9.3.1 基础知识

  • 视图:是一种虚拟的表,其内容由查询定义。视图不仅可以简化复杂的查询,还能提供数据访问的层级,增强安全性。
  • 临时表:是在会话期间创建的,并在会话结束时自动销毁。它们非常适合存储临时数据,比如计算结果,或者作为复杂查询中的中间步骤。

9.3.2 重点案例:使用 Python 和视图简化数据访问

假设你正在开发一个报告系统,需要从多个表中聚合数据。为了简化查询,你决定创建一个视图。

步骤

  1. 创建视图以聚合数据。

    CREATE VIEW sales_summary AS
    SELECT product_id, SUM(quantity) AS total_quantity, SUM(quantity * price) AS total_sales
    FROM sales
    GROUP BY product_id;
    
  2. 使用Python查询这个视图。

    import mysql.connector
    
    conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM sales_summary")
    for row in cursor.fetchall():
        print(row)
    cursor.close()
    conn.close()
    

9.3.3 拓展案例 1:使用 Python 和临时表处理复杂数据

在处理一项复杂的数据分析任务时,你需要创建一个临时表来存储中间结果。

conn = mysql.connector.connect(user='user', password='password', host='localhost', database='testdb')
cursor = conn.cursor()
cursor.execute("CREATE TEMPORARY TABLE temp_sales AS SELECT * FROM sales WHERE date >= '2021-01-01'")
cursor.execute("SELECT * FROM temp_sales")
for row in cursor.fetchall():
 print(row)
# 临时表在连接关闭时自动销毁
cursor.close()
conn.close()

9.3.4 拓展案例 2:使用视图和 Python 实现数据权限管理

假设你的应用对数据访问有着严格的权限要求,你可以使用视图来实现数据访问的安全层。

CREATE VIEW user_view AS
SELECT id, username, email FROM users WHERE active = 1;
# 假设只有特定的用户可以访问这个视图
def fetch_active_users(user_id):
 # 这里添加权限检查逻辑
 if user_id == "admin":
     cursor.execute("SELECT * FROM user_view")
     for row in cursor.fetchall():
         print(row)
 else:
     print("Access denied.")

通过上述案例,你已经学会了如何在MySQL中使用视图和临时表来简化数据访问和处理。这些技巧可以帮助你提高查询的效率,优化数据处理流程,同时保证数据访问的安全性和一致性。使用Python进行操作让这一切变得更加灵活和强大,无论是简化数据访问,还是处理复杂的数据分析任务,都能够轻松应对。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端素材】bootstrap5实现通用果蔬商城网页模板Netta Food(电商适用,附源码)

一、需求分析 通用果蔬商城网页是指专门为销售各类果蔬产品而设计的在线商城网页。它提供了一个方便的平台&#xff0c;使用户能够浏览、选择和购买各种果蔬产品。 通用果蔬商城网页通常具有以下功能&#xff1a; 商品展示&#xff1a;网页上展示各类果蔬产品的图片、价格、产…

使用C#读取PDF中所有文本内容

先安装如下包 using iTextSharp.text.pdf; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text;namespace ReadPdfText {class Program{static void Main(string[] args){string path "0017_审判流程管理信息表2…

VMware17上安装centos7.9

一、下载安装包&#xff1a; 1、VMware安装 VMware 下载地址&#xff1a; https://www.vmware.com/cn/products/workstation-pro.html VMware下载后安装即可 安装教程可以参考VMware安装教程 2、CentOs7.9下载地址&#xff1a; http://mirrors.aliyun.com/centos/7.9.2009/iso…

【C++】类的6个默认成员函数

目录 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 5. 运算符重载 5.1运算符重载 5.2赋值运算符重载 5.3前置和后置重载 5.4日期类的实现 6. const成员函数 7. 取地址及const取地址操作符重载 1. 类的6个默认成员函数 对于一个空类&#xff0c;编…

零基础学Python之Unitest模块

1.unittest简介及入门案例 &#xff08;1&#xff09;什么是Unitest Unittest是Python自带的单元测试框架&#xff0c;不仅适用于单元测试&#xff0c;还可用于Web、Appium、接口自动化测试用例的开发与执行。该测试框架可组织执行测试用例&#xff0c;并且提供丰富的断言方法…

Git合并多个commit

git rebase -i commitId 假设想要合并最后3个commit&#xff0c; git log显示 commit id 1 commit id 2 commit id 3 commit id 4 则执行git rebase -i commitId4. 注意是4&#xff0c;不是3. 然后&#xff0c;pick最老的commit (commit id 3). https://blog.csdn.net/qiao…

在 VMware 虚拟机上安装 CentOS系统 完整(全图文)教程

一、前期准备&#xff1a; 1.安装VMware 虚拟机软件&#xff08;不在讲解&#xff0c;可自行去下载安装&#xff09;。官网&#xff1a;https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-PLAYER-1750&productId1377&rPId111471 2.下载iso…

女博士眼里的“科学的尽头是玄学”

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 过年啦&#xff0c;拜年啦&#xff0c;吉祥话说起来吖&#xff01;祝大家龙腾四海、龙马精神、龙飞凤舞、龙年大吉&#xff01;不知道…

一条 SQL 更新语句是如何执行的?

之前你可能经常听 DBA 同事说&#xff0c;MySQL 可以恢复到半个月内任意一秒的状态&#xff0c;惊叹的同时&#xff0c;你是不是心中也会不免会好奇&#xff0c;这是怎样做到的呢&#xff1f; 我们先从一条更新语句讲起&#xff0c;首先创建一个表&#xff0c;这个表有一个主键…

内网穿透工具

1. nps-npc 1.1 简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发&#xff0c;可支持任何tcp、udp上层协议&#xff08;访问内网网站、本地支付接口调试、ssh访问、远程桌面&#xff0c;内网dns解析等等……&#xff09;&#xff0c…

Git、github与gitee码云

1.git核心是两个仓库&#xff1a;本地仓库和远程仓库 主要用于团队合作和代码版本控制&#xff08;个人现有版本代码出错可回溯上个提交版本的代码&#xff09; 远程仓库国际主流githut&#xff0c;但外网速度问题&#xff0c;国内可使用码云gitee github&#xff1a;https:…

奇瑞汽车,好好卖车,别趟个人是非的浑水

文 | AUTO芯球 作者 | 雷歌 这下&#xff0c;奇瑞法务部忙都忙不过来了。 一个字&#xff0c;就是&#xff0c;告&#xff01;告&#xff01;告&#xff01; 刚投诉完这家&#xff0c;又去告那家。 可是骂奇瑞的实在太多了&#xff0c;告不完&#xff0c;根本告不完。 有骂…

力扣刷题之旅:进阶篇(四)—— 滑动窗口问题

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 引言&#xff1a; 在编程的世界里&#xff0c;滑动窗口问题是一种…

【漏洞复现】狮子鱼CMS某SQL注入漏洞01

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

自制微信红包封面

一.前言 这不是过年了吗&#xff0c;各大平台都发放了免费的微信红包封面&#xff0c;但我老是抢不到QAQ。于是乎&#xff0c;我便想“授人以鱼不如授人以渔”&#xff0c;不如自己造个封面。 二.主要步骤 1.条件 1>创建视频号 2>过去一年发表过视频号 3>过去一…

比较6*6范围内7个点182个结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有6个节点&#xff0c;训练集AB各由6张二值化的图片组成&#xff0c;让A中有7个点&#xff0c;让B全是0&#xff0c;收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 得到顺序为 用6个点的结构标…

re:从0开始的CSS学习之路 1. CSS语法规则

0. 写在前面 现在大模型卷的飞起&#xff0c;感觉做页面的活可能以后就不需要人来做了&#xff0c;不知道现在还有没有学前端的必要。。。 1. HTML和CSS结合的三种方式 在HTML中&#xff0c;我们强调HTML并不关心显示样式&#xff0c;样式是CSS的工作&#xff0c;现在就轮到C…

整合 Axios

大家好我是苏麟 , 今天聊一下Axios . Axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpReques…

C++ 中的模型预测控制(01/2)

目录 一、说明二、MPC原理说明三、分解算法的来源并显示关键特征&#xff0c;四、C 实现说明五、平衡 Q 和 R六、资源下载地址 一、说明 以下文章介绍了应用模型预测控制器的简单控制系统方法。本文讨论了这种控制的基本机制&#xff0c;该机制适用于各种工程领域。 MPC 涉及对…

MPLS VPN功能组件(3)

私网标签分配 通过MPBGP为VPNv4路由分配内层标签 PE从CE接收到IPv4路由后&#xff0c;对该路由加上相应VRF的RD&#xff08;RD手动配置&#xff09;&#xff0c;使其成为一条VPNV4路由&#xff0c;然后在路由通告中更改下一跳属性为自己&#xff0c;通常是自己的Loopback地址…